设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1310|回复: 0
打印 上一主题 下一主题

[讨论] 类口袋妖怪/赛尔号多个相同宠物生成系统思路

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2421
在线时间
162 小时
注册时间
2020-8-9
帖子
106
跳转到指定楼层
1
发表于 2022-12-3 14:08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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方法
  1. def setup(actor_id)
  2.     actor = $data_actors[actor_id]
  3.     @actor_id = actor_id
  4.     @name = actor.name
  5.     @character_name = actor.character_name
  6.     @character_hue = actor.character_hue
  7.     @battler_name = actor.battler_name
  8.     @battler_hue = actor.battler_hue
  9.     @class_id = actor.class_id
  10.     @weapon_id = actor.weapon_id
  11.     @armor1_id = actor.armor1_id
  12.     @armor2_id = actor.armor2_id
  13.     @armor3_id = actor.armor3_id
  14.     @armor4_id = actor.armor4_id
  15.     @level = actor.initial_level
  16.     @exp_list = Array.new(101)
  17.     make_exp_list
  18.     @exp = @exp_list[@level]
  19.     @skills = []
  20.     @hp = maxhp
  21.     @sp = maxsp
  22.     @states = []
  23.     @states_turn = {}
  24.     @maxhp_plus = 0
  25.     @maxsp_plus = 0
  26.     @str_plus = 0
  27.     @dex_plus = 0
  28.     @agi_plus = 0
  29.     @int_plus = 0
  30.     # 学会特技
  31.     for i in 1..@level
  32.       for j in $data_classes[@class_id].learnings
  33.         if j.level == i
  34.           learn_skill(j.skill_id)
  35.         end
  36.       end
  37.     end
  38.     # 刷新自动状态
  39.     update_auto_state(nil, $data_armors[@armor1_id])
  40.     update_auto_state(nil, $data_armors[@armor2_id])
  41.     update_auto_state(nil, $data_armors[@armor3_id])
  42.     update_auto_state(nil, $data_armors[@armor4_id])
  43.   en
复制代码


新体系:
我的新体系是从物品到精灵


在类口袋妖怪的游戏中,通常通过“精灵球”的形式来表示获取到的精灵,而“精灵球”应该是在物品中,所以通过对物品名字或者描述添加词缀可以做到将普通物品和精灵球区分开来。

所以对Game_Party中获得物品的方法重写,每当玩家获得精灵球时,查找$data_actros中的同名角色,复制一份数据放在$game_actors中
这个是我重写的获得物品的方法
  1.   def gain_item(item_id, n)
  2.     # 更新 hash 的个数数据
  3.     if item_id > 0
  4.       if item_number(item_id) >= 1
  5.       
  6.         @items[item_id] = [[item_number(item_id) + n, 0].max, 9999].min
  7.               #当该物品是精灵球时,对其进行判断
  8.         if $data_items[item_id].desc=="精灵球" and item_number(item_id)>1 #同名精灵球超过一个时
  9.           item=$data_items[item_id] #被增加的精灵球
  10.           sprite=$data_actors.clone #精灵模板
  11.             if n > 0
  12.               for i in 0..sprite.size
  13.                 act = sprite[i]  if sprite[i].name == item.name
  14.                
  15.                 break if sprite[i].name==item.name
  16.               end
  17.               n.times{  $game_actors[2000]= nil   if $game_actors.size<2000
  18.                 $game_actors.push(Game_Actor.new(act.id))
  19.               }
  20.             end
  21.         end
  22.       else  
  23.       @items[item_id] = [[item_number(item_id) + n, 0].max, 9999].min
  24.             #当该物品是精灵球时,对其进行判断
  25.         if $data_items[item_id].desc=="精灵球" and item_number(item_id)>1 #同名精灵球超过一个时
  26.           item=$data_items[item_id] #被增加的精灵球
  27.           sprite=$data_actors.clone #精灵模板
  28.             if n > 0
  29.               n-=1
  30.               for i in 0..sprite.size
  31.                 act = sprite[i]  if sprite[i].name == item.name
  32.                
  33.                 break if sprite[i].name==item.name
  34.               end
  35.               
  36.               n.times{  $game_actors[2000]= nil   if $game_actors.size<2000
  37.                 $game_actors.push(Game_Actor.new(act.id))}
  38.             end
  39.         end
  40.       end
  41.     end
  42.   end
复制代码
其中$game_actors使用的size,push等方法需要自己写。
(注意:为了避免冲突,新生成的精灵id我更改为其在$game_actors中的下标,这需要在Game_Actor设置相关方法,并且由于精灵属性与其模板id有关,所以还需要给Game_Actor设置一个新的属性用来存精灵的模板id,我在setup方法中给新生成的精灵一个额外的@e_id来存这个id,同时还需要重写所有获得属性的方法)

做完以上工作后,由于事件中的角色加入和替换是指定数据库中的角色id,所以如果是用事件做的精灵仓库则可能不再适应,需要自己写一个,在$game_actors里匹配精灵球的名字就可以获得玩家已经获得的精灵。
(如果有人需要的话,我有时间就去弄个范例工程发一遍,不过我建议自己写,bug会少一点)
最后放几个效果图:






评分

参与人数 1+1 收起 理由
陈大帅帅帅哥 + 1 精品文章

查看全部评分

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-25 14:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表