Project1
标题: 类口袋妖怪/赛尔号多个相同宠物生成系统思路 [打印本页]
作者: 939034448 时间: 2022-12-3 14:08
标题: 类口袋妖怪/赛尔号多个相同宠物生成系统思路
本帖最后由 939034448 于 2022-12-3 14:18 编辑
由于本人在制作赛尔号的同人游戏,每个精灵只能同时拥有一只总感觉没那味,所以打算做一个可以无限生成相同精灵的体系,在p1上搜了一下好像没有相关脚本和讨论,所以自己写了一个,顺便把我的思路分享一下,也算是给出一种思路。
首先介绍一下会涉及的一些元素:
①$data_actors:数据库中的角色数据存在这
②Game_Actor:处理游戏中角色的类
③Game_Actors:处理Game_Actor实例顺序的类
④$game_actors:Game_Actors的实例,我们在游戏中的角色数据都在这
⑤Game_Party:处理玩家的物品、金钱等数据。
角色生成原理:
在xp系统中,角色的生成是在Game_Actor中实现的,Game_Actor类的setup方法根据角色id到$data_actor中取得对应角色数据来生成实例,这个实例将被存储在$game_actors中,其下标和角色id一致,举个例子:$game_actors[10]中的角色id为10。
(在原有体系中,因为所有游戏角色数据都在$game_actors中,我们可以对其进行利用,我的做法是在$game_actors在2000位之后划分为新生角色区域,由于$game_actors并不是一个数组,所以这些操作需要对$game_actors追加相应的方法。
)
这个是setup方法
- def setup(actor_id)
- actor = $data_actors[actor_id]
- @actor_id = actor_id
- @name = actor.name
- @character_name = actor.character_name
- @character_hue = actor.character_hue
- @battler_name = actor.battler_name
- @battler_hue = actor.battler_hue
- @class_id = actor.class_id
- @weapon_id = actor.weapon_id
- @armor1_id = actor.armor1_id
- @armor2_id = actor.armor2_id
- @armor3_id = actor.armor3_id
- @armor4_id = actor.armor4_id
- @level = actor.initial_level
- @exp_list = Array.new(101)
- make_exp_list
- @exp = @exp_list[@level]
- @skills = []
- @hp = maxhp
- @sp = maxsp
- @states = []
- @states_turn = {}
- @maxhp_plus = 0
- @maxsp_plus = 0
- @str_plus = 0
- @dex_plus = 0
- @agi_plus = 0
- @int_plus = 0
- # 学会特技
- for i in 1..@level
- for j in $data_classes[@class_id].learnings
- if j.level == i
- learn_skill(j.skill_id)
- end
- end
- end
- # 刷新自动状态
- update_auto_state(nil, $data_armors[@armor1_id])
- update_auto_state(nil, $data_armors[@armor2_id])
- update_auto_state(nil, $data_armors[@armor3_id])
- update_auto_state(nil, $data_armors[@armor4_id])
- en
复制代码
新体系:
我的新体系是从物品到精灵
在类口袋妖怪的游戏中,通常通过“精灵球”的形式来表示获取到的精灵,而“精灵球”应该是在物品中,所以通过对物品名字或者描述添加词缀可以做到将普通物品和精灵球区分开来。
所以对Game_Party中获得物品的方法重写,每当玩家获得精灵球时,查找$data_actros中的同名角色,复制一份数据放在$game_actors中
这个是我重写的获得物品的方法
- def gain_item(item_id, n)
- # 更新 hash 的个数数据
- if item_id > 0
- if item_number(item_id) >= 1
-
- @items[item_id] = [[item_number(item_id) + n, 0].max, 9999].min
- #当该物品是精灵球时,对其进行判断
- if $data_items[item_id].desc=="精灵球" and item_number(item_id)>1 #同名精灵球超过一个时
- item=$data_items[item_id] #被增加的精灵球
- sprite=$data_actors.clone #精灵模板
- if n > 0
- for i in 0..sprite.size
- act = sprite[i] if sprite[i].name == item.name
-
- break if sprite[i].name==item.name
- end
- n.times{ $game_actors[2000]= nil if $game_actors.size<2000
- $game_actors.push(Game_Actor.new(act.id))
- }
- end
- end
- else
- @items[item_id] = [[item_number(item_id) + n, 0].max, 9999].min
- #当该物品是精灵球时,对其进行判断
- if $data_items[item_id].desc=="精灵球" and item_number(item_id)>1 #同名精灵球超过一个时
- item=$data_items[item_id] #被增加的精灵球
- sprite=$data_actors.clone #精灵模板
- if n > 0
- n-=1
- for i in 0..sprite.size
- act = sprite[i] if sprite[i].name == item.name
-
- break if sprite[i].name==item.name
- end
-
- n.times{ $game_actors[2000]= nil if $game_actors.size<2000
- $game_actors.push(Game_Actor.new(act.id))}
- end
- end
- end
- end
- end
复制代码 其中$game_actors使用的size,push等方法需要自己写。
(注意:为了避免冲突,新生成的精灵id我更改为其在$game_actors中的下标,这需要在Game_Actor设置相关方法,并且由于精灵属性与其模板id有关,所以还需要给Game_Actor设置一个新的属性用来存精灵的模板id,我在setup方法中给新生成的精灵一个额外的@e_id来存这个id,同时还需要重写所有获得属性的方法)
做完以上工作后,由于事件中的角色加入和替换是指定数据库中的角色id,所以如果是用事件做的精灵仓库则可能不再适应,需要自己写一个,在$game_actors里匹配精灵球的名字就可以获得玩家已经获得的精灵。
(如果有人需要的话,我有时间就去弄个范例工程发一遍,不过我建议自己写,bug会少一点)
最后放几个效果图:
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |