GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

189 信息 1069 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

个人用的在GMS2里面的攻击攻击系统

骨折好少女 2017-07-28
  1. 成品


Image title

我来展示一个 一把飞刀 穿过每个人只吃一次伤害的做法吧(后面展示的东西有点魔法了)

目标效果

做到每个人仅仅被攻击一次的效果

效果作用

划定一个范围 范围内的敌人 会被记录 然后进行 每个敌人仅仅造成 一次伤害 的行为

清理掉 记录后 即可再次进行伤害行为

作案工具

  • Multi_Object_Collisions系列的脚本

代码很简单我直接贴出来算了

collision_multiple( x,y,argument0);
//红色部分就是可以修改的内容 除了instance_place 外还可以使用 collision系列 反正安装需要替换就是了

var x1 = argument0;
var y1 = argument1;
var obj = argument2;

var list = ds_list_create();
do
{
    var  hit = instance_place(x1, y1, obj); 
    if (hit != noone)
    {
        ///Add the colliding object to the list {
        ///deactivate it so that we don't collide with it again.
        ///It'll be reactivated later on...
        ds_list_add(list, hit);
        instance_deactivate_object(hit);
    }
} until (hit == noone);

///Reactivate all the objects which were deactivated
if (ds_list_size(list) > 0)
for (var i = 0; i < ds_list_size(list); i++)
{
    instance_activate_object(list[|i]);
}

///Return the list of objects OR noone
return list;

  • 一个叫做AtkStep的脚本


var AColBox = argument0;


if ds_list_size(AColBox) > 0 {
for (i = 0; i < ds_list_size(AColBox); i += 1) {
if ds_list_find_index(AtkList, ds_list_find_value(AColBox, i)) = -1 {
ds_list_add(AtkList, ds_list_find_value(AColBox, i))
//每加入一个草一个

var Col = ds_list_find_value(AColBox, i);//这家伙就是目标了

if (object_get_parent(Col.object_index) = 目标的父对象) //我想你们肯定需要 对攻击的不同 类型进行不同的处理 在这里直接分类 

{Col.HP -= max(0,self.ATK )//self 表示的是自身 目标的HP减少 自身的攻击力 Max的作用 是在计算攻击的 时候 考虑进去防御力 的话 负数不久给敌人加血了?

//******************这两句是 击飞的范例 乐意可以考究一下
 //Col.vx = (max(0,self.AFlyH - Col.DFlyH)+abs(Col.vx))*self.facing //目标.横向移动速度 = (max(0,自身.击飞力度 - 目标。击飞补正)+ 目标现在的移动速度的绝对值)*自身攻击的方向[只有-1和1]
// Col.vy = -max(0,self.AFlyV - Col.DFlyV);
//*******************************
}

}
}}


创建事件


AtkList = ds_list_create();//记录 被攻击过的目标 
//我通过启用 计时器时间【0】 来周期性清理 AtkList 这样就能持续对人进行攻击了 比如火焰的 多段连续伤害
AtkListCleanTime = -1;//不使用就写个-1
alarm[0] = AtkListCleanTime;

Atk = 1;//攻击力 其实我这边还有一堆信息 反正挑个最简单的讲解

步事件

var AColBox = collision_multiple( x,y,怪物);
AtkStep(AColBox);


计时器[0]事件

ds_list_clear(AtkList)

alarm[0] = AtkListCleanTime;//通过自己调用自己 这样持续清理


销毁事件 

日常收拾手尾

ds_list_destroy(AtkList);



关于如何 自爆嘛 

比如我这个飞刀 就是添加了个离开房间范围就销毁

比如 火焰持续燃烧 再价格计时器 到了自己销毁


好了卖弄的都卖弄完了()

我先转几天制作吧


(转发自:原日志地址

近期喜欢的会员

 
顺子 2017-07-30

只想说给大佬跪了……orz

 
BloveStorm 2017-09-03

支持一切干货!

关于模拟碰撞事件函数方面,我和LZ实现方法几乎一样。但我用的数据结构不是list,而是queue。

用queue的好处是不用for循环来activate实例,并且从理论上来讲queue的执行效率应该比list快那么一丁丁点,不过也不用在意这些细节了。

 
Oncle 2017-09-03

干货少女啊!

 
riku 2017-09-23

为啥这脚本代码的语法,这么像JS?

 
riku 2017-09-23

另外就是,好强!

 
骨折好少女 2017-09-26
gms的语言就是这样的嘛
 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册