我们要求每个道具都是唯一的,放在列表里有唯一的键。可以执行一个脚本来创建唯一键。创建脚本,名称为generate_key,填写下面的代码
function generate_key(){ return room_get_name(room)+object_get_name(object_index)+string(x)+string(y); }
我们叫它哈希函数,这个函数会根据所在房间和位置生成一个唯一的ID。接下来,是创建一个obj_item对象,在create事件里添加如下代码
key=generate_key(); data=ds_map_create(); ds_map_replace(data,"key",key);
上面的代码,表示我们调用这个函数创建唯一的键,再把它赋予到DS map的键里。这是通用道具的信息。 我们将在obj_item的子对象中添加更详细的信息,如名称、类型和其他。
给obj_item添加碰撞事件,碰撞对象为主角,我们需要在主角碰到道具时,可以把数据插入到DS list里。为了实现这个效果,我们修改碰撞事件,添加如下代码
ds_list_add(obj_player.items,data); ds_list_mark_as_map(obj_player.items,ds_list_size(obj_player.items)-1); audio_play_sound(snd_getitem,1,0); instance_destroy();
上面的代码表示,当obj_player与obj_item的子对象发生碰撞时,属于obj_item实例的DSMap数据将添加到obj_player的DS列表中。
我们还需要将新添加的元素标记为DS Map,因为GML需要知道这不是基本数据,而是一个数据结构。最后,我们销毁这个道具。
现在,我们可以正式创建武器和药品了,新建一个obj_upgrade_light,设置父对象为obj_item,在create事件里,添加如下代码
// Inherit the parent event event_inherited(); ds_map_replace(data,"name","Better pistol"); ds_map_replace(data,"type",item_type.weapon); ds_map_replace(data,"value",5); ds_map_replace(data,"desc","Decent fire power"); ds_map_replace(data,"bullet_type",spr_bullet_light);
上面的代码表示,我们先是继承了obj_item里的代码,然后我们利用DS map创建了一个武器,小手枪(更好)。别忘了,把贴图spr_upgrade_light赋予对象。
继续,我们再创建一个药品道具obj_cure_paracetamol,父对象还是obj_item,在create事件里添加如下代码
// Inherit the parent event event_inherited(); ds_map_replace(data,"name","Parcetamol"); ds_map_replace(data,"type",item_type.cure); ds_map_replace(data,"value",1); ds_map_replace(data,"desc","A common medicine");
测试前,把这两个道具,拖到游戏房间里,放好。按F5,测试,效果如下
但我们仍然不能攻击或加血。 别担心。 我会在后面来修复这个问题。
暂无关于此日志的评论。