じ☆ve冰风 发表于 2024-4-19 18:36:23

ARPG用范围性影响能力值的技能

先说明一下.此纯属搞着玩= =

效果嘛.看下面的 flash.

使用说明请看脚本开头处和范例里的公共事件 1 号.



多余的话:
Tilemap 的闪烁感觉边缘太硬了.
换成 loop_animation 可能会好些.
但是那样貌似会又把一些遮挡物、不可通行的图块给覆盖住= =
要改 Tilemap 的闪烁颜色的话可以在脚本开头的 Colors 常量数组里改.
其索引对应相应状态的 定量值
还有就是想把范围矩形改成别的什么形状的话请自行处理= =
这玩意还可以扩展一下做做技能冷却/限制什么的.
当矩形消失的时候才能再次使用或使用别的这类技能.
有兴趣的话就自己动手做吧.嗯.
大概就是这样了.

注意事项:
同一个状态最好不要被多个技能使用.因为是以状态的ID为主键建立的范围矩形数据对象.

范例:


脚本:#==============================================================================# ■ 本脚本来自 www.66rpg.com 转载和使用时请保留此信息#===============================================================================begin脚本作者:后知后觉脚本功能:应用于地图上的直接战斗            可以在地图上设置某个矩形范围内            在这个范围内影响战斗者的能力值            并能让这个范围闪烁以醒目使用方法:数据库状态的设置            定量:定量用来设置闪烁的颜色.0~10.一共11种.其中0为不无闪烁效果            经过 A 回合后 B%几率解除            因为是直接在地图上作战.所以这个貌似没什么用了.我就拿来用用了.            A : 持续的时间.结果为 A * 20.                当 $game_system.update 被执行了 A * 20 次后该区域就消失            B : 范围的长度.                在生成范围的时候要求设置一个中心点的x、y坐标                以该点为中心.B*2+1 为边长的矩形            这个矩形内对能力值的影响效果就是该状态的效果.            使用脚本 ArpgAuxiliarySkill.new(x,y,state_id,target)            来声场这个矩形对象.            其中x、y为中心店坐标,state_id 为状态id            target 为作用对象类型.整数型.为 0 的时候对所有人有效.                   默认 1 为对角色有效.2为对敌人有效.这个可以自定义决定.                   只是用来做判断用.当要获取信息的时候传递进来的值与.new                   的时候所保存的值相吻合的时候才会对能力值有影响。          这些能力值的影响本应该写进 Game_Battler 里去的.          不过冲突啊什么的最讨厌了.所以还是你自己写进去吧.          具体的应用到实际的计算当中请参考范例的公共事件1号.=end$hzhj_ArpgAuxiliarySkill.call if $hzhj_ArpgAuxiliarySkillclass ArpgAuxiliarySkillColors = attr_reader :timeattr_reader :xattr_reader :yattr_reader :keyattr_reader :stateattr_reader :ratingattr_reader :rangeattr_reader :targetattr_reader :start_xattr_reader :start_yattr_reader :end_xattr_reader :end_ydef initialize(x, y, state_id, target = 0)    @x = x    @y = y    @key = state_id    @state = $data_states    @time = @state.hold_turn * 20    @range = @state.auto_release_prob    @target = target    @rating = @state.rating    $game_system.hzhj_hash[@key] = self    set_flash_dataenddef update    if @time > 0      @time -= 1      return    end    $game_system.hzhj_hash[@key] = nil    reset_flash_dataenddef set_xyt(x, y, time)    @x = x    @y = y    @time = time    reset_flash_dataenddef set_flash_data    @start_x = [@x - @range, 0].max    @start_y = [@y - @range, 0].max    @end_x = [@x + @range, $game_map.width - 1].min    @end_y = [@y + @range, $game_map.height - 1].min    for i in @start_x..@end_x      for j in @start_y..@end_y      if $game_map.passable?(i, j, 0)          $game_map.flash_data = Colors[@rating]      end      end    endenddef reset_flash_data    $game_map.flash_data = Table.new($game_map.width, $game_map.height)    values = $game_system.hzhj_hash.values    values.delete(nil)    for hzhj in values.sort!{|a,b|a.rating - b.rating}      hzhj.set_flash_data    endendendclass Hzhj_Hash < Hashdef initialize    superenddef []=(key, value)    if self.nil?      super(key, value)    else      if value.nil?      super(key, value)      else      self.set_xyt(value.x, value.y, value.time)      end    endenddef hit_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.hit_rate / 100.0          end      end      end    end    return Integer(n.round)enddef maxhp_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.maxhp_rate / 100.0          end      end      end    end    return Integer(n.round)enddef maxsp_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.maxsp_rate / 100.0          end      end      end    end    return Integer(n.round)enddef str_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.str_rate / 100.0          end      end      end    end    return Integer(n.round)enddef dex_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.dex_rate / 100.0          end      end      end    end    return Integer(n.round)enddef agi_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.agi_rate / 100.0          end      end      end    end    return Integer(n.round)enddef int_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.int_rate / 100.0          end      end      end    end    return Integer(n.round)enddef atk_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.atk_rate / 100.0          end      end      end    end    return Integer(n.round)enddef pdef_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.pdef_rate / 100.0          end      end      end    end    return Integer(n.round)enddef mdef_rate(x, y, target)    n = 100    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n *= hzhj.state.mdef_rate / 100.0          end      end      end    end    return Integer(n.round)enddef eva(x, y, target)    n = 0    for hzhj in self.values      next if hzhj.nil?      if x.between?(hzhj.start_x, hzhj.end_x)      if y.between?(hzhj.start_y, hzhj.end_y)          if target == hzhj.target or hzhj.target == 0            n += hzhj.state.eva          end      end      end    end    return Integer(n)endendclass Game_Systemattr_reader :hzhj_hashalias hzhj_hash_game_system_initialize initializedef initialize    hzhj_hash_game_system_initialize    @hzhj_hash = Hzhj_Hash.newendalias hzhj_hash_game_system_update updatedef update    hzhj_hash_game_system_update    @hzhj_hash.values.each{|hzhj|hzhj.update if not hzhj.nil?}endendclass Game_Mapattr_accessor :flash_dataalias hzhj_hash_game_map_setup setupdef setup(*args)    hzhj_hash_game_map_setup(*args)    $game_system.hzhj_hash.clear    @flash_data = Table.new(width, height)endendclass Spriteset_Mapalias hzhj_hash_spriteset_map_initialize initializedef initialize    hzhj_hash_spriteset_map_initialize    @tilemap.flash_data = $game_map.flash_data    @tilemap.updateendalias hzhj_hash_spriteset_map_update updatedef update    if @tilemap.flash_data != $game_map.flash_data      @tilemap.flash_data = $game_map.flash_data    end    hzhj_hash_spriteset_map_updateendendcallcc{|$hzhj_ArpgAuxiliarySkill|}#==============================================================================# ■ 本脚本来自 www.66rpg.com 转载和使用时请保留此信息#==============================================================================复制代码
             本帖来自P1论坛作者后知后觉,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=157512若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: ARPG用范围性影响能力值的技能