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

Project1

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

[RMVX发布] 某VX的A·RPG改进

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
543 小时
注册时间
2009-7-13
帖子
63
跳转到指定楼层
1
发表于 2011-9-1 10:54:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 nanaka 于 2011-9-1 12:02 编辑

原贴在这里
http://rpg.blue/thread-89885-1-1.html
前段时间做游戏刚好用到了,结果发现这个脚本有很多不足的地方,用自己半吊子的水平改了一下。
另外为了美观用了一箭烂大的图片数字脚本
http://rpg.blue/thread-174115-1-1.html

比原版增加的功能有:
可以设定敌人射程
可以添加物品的掉落
可以自定义基础攻击间隔和技能攻击间隔
可以自定义玩家和敌人的闪避(目前敌人的闪避是统一的,有空再改)
可以用开关控制HP槽和MP槽的显示(这个应该算bug修改?)
可以使用回复技能(这个貌似也应该算bug修改)

一些比较没用的功能:
美观化了攻击无效、miss、critical、以及伤害的显示
普通攻击和技能攻击的伤害值波动
伤害数字的可以同时显示多个(原来一个单位只能同时存在一个伤害数字)
Critical标志可以同时显示多个 (原来同上)

删掉了原版里动画缩小的功能,那个功能会影响平时在地图上的动画播放,感觉很不好。
如果战斗动画过大的话,请自己改小了再用吧……

测试不是太完全,如果有BUG请联系我。
另外还有什么想法也可以告诉我,我尽力实现。

第一次发脚本,希望能帮诸位作出更好的游戏。

补图……

代码如下
  1. #===================================
  2. # Vlad ABS
  3. #===================================
  4. #--------------------------------------------------------------
  5. # Credits to Vlad
  6. #--------------------------------------------------------------
  7. # 創造一個敵人(事件),在事件中加上這些註釋:
  8. # Enemy ID - 在數據庫中敵人的ID
  9. # Die X - X為 1 / 2 ( 1:死後删除敵人   2:不死之身 )
  10. # Follow - 設定是否跟隨敵人
  11. # Range - 设定敌人射程
  12. # Drop - 掉落物品ID
  13. # Drop_Rate 掉率
  14. # 暂时只支持掉落一件物品
  15. #--------------------------------------------------------------
  16. # 自定義項目
  17. #--------------------------------------------------------------
  18. #-------------------------------------------------------------
  19. # ARPG系统开关控制编号
  20. # 打开时显示血槽,关闭时去掉血槽
  21. Switch_Number = 95
  22. #--------------------------------------------------------------
  23. # 武器攻撃鍵, 不要改變 [正常對應鍵: A]
  24. Attack_Button = Input::X
  25. #--------------------------------------------------------------
  26. # 技能攻撃鍵, 不要改變 [正常對應鍵: S]  <--也是技能畫面的技能記憶鍵
  27. Skill_Button = {Input::Y => 0}
  28. #--------------------------------------------------------------
  29. # 升級動畫ID (對應數據庫) :
  30. LevelUp_Ani = 40
  31. #---------------------------------------------------------------
  32. # 技能冷却间隔
  33. Skill_Wait_Ataque = 60
  34. # 主角攻击距离
  35. Attack_Range = 3
  36. # 主角攻击暴击率
  37. Player_Critical_Rate = 20
  38. # 敌人攻击暴击率
  39. Enemy_Critical_Rate = 5
  40. # 玩家自身闪避率
  41. Player_Evade_Rate = 15
  42. # 敌人自身闪避率
  43. Enemy_Evade_Rate = 5
  44. # 攻击伤害波动率
  45. Attack_Damage_Wave = 10
  46. # 玩家伤害倍率
  47. Player_Damage_Rate = 4
  48. # 敌人伤害倍率
  49. Enemy_Damage_Rate = 4
  50. #--------------------------------------------------------------
  51. # 攻击间隔的计算公式是 (基础攻击间隔 - 敏捷) / 60 单位;秒
  52. #---------------------------------------------------------------
  53. # 玩家基础攻击间隔
  54. Player_Base_Attack_Speed = 60
  55. # 敌人基础攻击间隔
  56. Enemy_Base_Attack_speed = 100
  57. #--------------------------------------------------------------
  58. #设定敌人的攻击动画
  59. #例如:Enemy_atk_ani[1] = 10
  60. #即ID为1的敌人使用ID为10的攻击动画
  61. Enemy_atk_ani = {}
  62. #--------------------------------------------------------------

  63. #--------------------------------------------------------------
  64. # Game Character
  65. #--------------------------------------------------------------
  66. class Game_Character
  67.   attr_accessor :hp
  68.   attr_accessor :mp
  69.   attr_accessor :damage
  70.   attr_accessor :critical
  71.   attr_accessor :wait_ataque
  72.   attr_accessor :skill_wait_ataque
  73.   attr_accessor :die
  74.   attr_accessor :drop_item
  75.   attr_accessor :drop_flag
  76.   attr_accessor :drop_rate
  77.   alias vlad_abs_gchar_initialize initialize
  78.   def initialize
  79.     @hp = 0
  80.     @mp = 0
  81.     @die = 0
  82.     $skill_for_use = 0
  83.     @wait_ataque = 0
  84.     @skill_wait_ataque = 0
  85.     @range = 0
  86.     @drop_item = 0
  87.     @damage = nil
  88.     @critical = false
  89.     @death_flag = false
  90.     vlad_abs_gchar_initialize
  91.   end
  92.   #------------------------------------------------------------------------------------
  93.   # recebe_atk
  94.   #
  95.   # 用来处理攻击
  96.   # receptor为攻击受体,即函数调用者
  97.   # attacker为攻击方,即函数参数
  98.   #------------------------------------------------------------------------------------
  99.   def recebe_atk(attacker)
  100.    
  101.     #读入攻击方和被攻击方的属性
  102.     attacker_status = (attacker.is_a?(Game_Event) ? attacker.enemy_status : $game_actors[1])
  103.     receptor_status = (self.is_a?(Game_Event) ? self.enemy_status : $game_actors[1])
  104.    
  105.     # 普通攻击取10%的伤害波动
  106.     random_num = (attacker_status.atk / Attack_Damage_Wave).to_i   
  107.     # 获取本次攻击的伤害偏差
  108.     random_damage = rand(random_num)      
  109.     # 获取偏差正负
  110.     coe = (-1) ** (rand(2)+1)                     
  111.    
  112.     if self.is_a?(Game_Event)
  113.       self.damage = attacker_status.atk * Player_Damage_Rate - receptor_status.def * 2 + coe * random_damage
  114.     else
  115.       self.damage = attacker_status.atk * Enemy_Damage_Rate - receptor_status.def * 2 + coe * random_damage
  116.     end
  117.    
  118.     self.damage *= attacker_status.elements_max_rate(attacker_status.element_set)
  119.     self.damage /= 100
  120.     self.damage = 0 if self.damage < 0
  121.    
  122.     if self.is_a?(Game_Player)
  123.       self.critical = (rand(100) < Player_Critical_Rate)  # 玩家暴击判定
  124.     else
  125.       self.critical = (rand(100) < Enemy_Critical_Rate) # 敌人暴击判定
  126.     end
  127.    
  128.     self.damage *= 2 if self.critical                     # 暴击时造成2倍伤害
  129.    
  130.     if self.is_a?(Game_Player)
  131.       self.damage = 0 if rand(100) < Player_Evade_Rate    # 玩家闪避判定
  132.       $game_actors[1].hp -= self.damage
  133.       if $game_actors[1].hp <= 0
  134.         $scene = Scene_Gameover.new
  135.       end
  136.     elsif self.is_a?(Game_Event)
  137.       self.damage = 0 if rand(100) < Enemy_Evade_Rate   # 敌人闪避判定
  138.       self.hp -= self.damage
  139.       if self.hp <= 0
  140.         self.animation_id = 88
  141.         if @drop_item != 0 && (rand(100) < @drop_rate)
  142.           gain_item(self)
  143.         end
  144.         $game_actors[1].gain_exp(enemy_status.exp, 1)
  145.         if @die == 1
  146.           self.erase
  147.         elsif @die == 2
  148.           key = [$game_map.map_id, self.id, "A"]
  149.           $game_self_switches[key] = true
  150.         end
  151.         refresh
  152.       end
  153.     end
  154.   end
  155.   
  156.   def gain_item (event)
  157.     $game_party.gain_item($data_items[@drop_item], 1)
  158.     event.drop_flag = true
  159.   end
  160.   #-----------------------------------------------------------------------------
  161.   # recebe_skl
  162.   #
  163.   # 用来处理技能
  164.   # receptor为攻击受体,即函数调用者
  165.   # attacker为攻击方,即函数参数
  166.   #-----------------------------------------------------------------------------
  167.   def recebe_skl(attacker)
  168.     for key in Skill_Button.keys
  169.       
  170.       #获取技能id
  171.       sklid = Skill_Button[key]
  172.       
  173.       #读入攻击方和被攻击方属性
  174.       attacker_status = (attacker.is_a?(Game_Event) ? attacker.enemy_status : $game_actors[1])
  175.       receptor_status = (self.is_a?(Game_Event) ? self.enemy_status : $game_actors[1])
  176.       
  177.       skill = $data_skills[sklid]
  178.       random_num = (skill.base_damage * skill.variance / 100)   #计算分散度造成的伤害偏差
  179.       random_damage = rand(random_num)                            #获取本次技能的伤害偏差
  180.       coe = (-1) ** (rand(2) + 1)                             #获取偏差正负
  181.       
  182.       #如果技能伤害为正数,即该技能为伤害技能时
  183.       if skill.base_damage > 0
  184.         
  185.         #------------------------------------------------------------#
  186.         #       计算技能伤害,按照rmvx公式                           #
  187.         #       伤害值 = 基本伤害                                    #
  188.         #                 + (A 攻击力 × 4 × 攻击关系度 ÷ 100)     #
  189.         #                 + (A 意志力 × 2 × 意志关系度 ÷ 100)     #
  190.         #                 - (B 防御力 × 2 × 攻击关系度 ÷ 100)     #
  191.         #                 - (B 意志力 × 1 × 意志关系度 ÷ 100)     #
  192.         #------------------------------------------------------------#
  193.         
  194.         #技能造成伤害的计算
  195.         skill_damage =  skill.base_damage
  196.                         + (attacker_status.atk * 4 * skill.atk_f / 100)
  197.                         + (attacker_status.spi * 2 * skill.spi_f / 100)
  198.         
  199.         #防御方减少伤害的计算
  200.         reduce_damage = (receptor_status.def * 2 * skill.atk_f / 100)
  201.                         + (receptor_status.spi * skill.spi_f / 100)
  202.          
  203.         #伤害处理
  204.         self.damage = skill_damage - reduce_damage + coe * random_damage
  205.         self.damage *= attacker_status.elements_max_rate(attacker_status.element_set)
  206.         self.damage /= 100
  207.         self.damage = 0 if self.damage < 0
  208.         self.critical = (rand(100) < 4)     #默认暴击率4%
  209.         self.damage *= 2 if self.critical   #暴击时造成2倍伤害
  210.       
  211.       #如果该技能伤害为负数,即该技能为回复技能时
  212.       else
  213.         #------------------------------------------------------------#  
  214.         #       计算技能伤害,按照rmvx公式                           #
  215.         #       伤害值 = 基本伤害                                    #
  216.         #                 - (A 防御力 × 2 × 攻击关系度 ÷ 100)     #
  217.         #                 - (A 意志力 × 1 × 意志关系度 ÷ 100)     #
  218.         #------------------------------------------------------------#
  219.         skill_damage = skill.base_damage
  220.                       - (attacker_status.atk * 2 * skill.atk_f / 100)
  221.                       - (attacker_status.spi * 1 * skill.spi_f / 100)
  222.         
  223.         #伤害处理
  224.         self.damage = skill_damage
  225.       end
  226.    
  227.       #处理施法后的消耗以及死亡判断
  228.       attacker_status.mp -= $data_skills[sklid].mp_cost
  229.       if self.is_a?(Game_Player)
  230.         $game_actors[1].hp -= self.damage
  231.         $scene = Scene_Gameover.new if $game_actors[1].hp <= 0
  232.       elsif self.is_a?(Game_Event)
  233.         self.hp -= self.damage
  234.         if self.hp <= 0
  235.           $game_actors[1].gain_exp(enemy_status.exp, 1)
  236.           if @die == 1            #如果该单位非不死,擦除
  237.             self.erase
  238.           elsif @die == 2         #如果该单位不死,复活该单位
  239.             key = [$game_map.map_id, self.id, "A"]
  240.             $game_self_switches[key] = true
  241.           end
  242.           refresh
  243.         end
  244.       end
  245.     end
  246.   end
  247.   
  248.   def follow_hero(dx, dy)
  249.     sx = @x - dx
  250.     sy = @y - dy
  251.    
  252.     if sx == 0 and sy == 0
  253.       return
  254.     end
  255.    
  256.     abs_sx = sx.abs
  257.     abs_sy = sy.abs
  258.     if abs_sx == 0
  259.       sy > 0 ? move_up : move_down
  260.       if not moving? and sx != 0
  261.         sx > 0 ? move_left : move_right
  262.       end
  263.       return
  264.     elsif abs_sy == 0
  265.       sx > 0 ? move_left : move_right
  266.       if not moving? and sy != 0
  267.         sy > 0 ? move_up : move_down
  268.       end
  269.       return
  270.     end
  271.    
  272.     if abs_sx == abs_sy
  273.       rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
  274.     end
  275.    
  276.     if abs_sx > abs_sy
  277.       sx > 0 ? move_left : move_right
  278.       if not moving? and sy != 0
  279.         sy > 0 ? move_up : move_down
  280.       end
  281.     else
  282.       sy > 0 ? move_up : move_down
  283.       if not moving? and sx != 0
  284.         sx > 0 ? move_left : move_right
  285.       end
  286.     end
  287.    
  288.   end
  289.   def raio(dx, dy)
  290.     ax = (@x - dx) ** 2
  291.     ay = (@y - dy) ** 2
  292.     return Math.sqrt(ax + ay)
  293.   end
  294.   
  295. end
  296. #--------------------------------------------------------------
  297. # Game Event
  298. #--------------------------------------------------------------
  299. class Game_Event < Game_Character
  300.   attr_reader :inimigo
  301.   attr_reader :enemy_status
  302.   attr_reader :range            #敌人攻击距离
  303.   alias vlad_abs_gevent_initialize initialize
  304.   alias vlad_abs_gevent_update update
  305.   alias vlad_abs_gevent_refresh refresh
  306.   def initialize(map_id, event)
  307.     @inimigo = false
  308.     @automove = false
  309.     @range = 0
  310.     vlad_abs_gevent_initialize(map_id, event)
  311.   end
  312.   def check_com(comentario)
  313.     return false if @list.nil? or @list.size <= 0
  314.     for item in @list
  315.       if item.code == 108 or item.code == 408
  316.         if item.parameters[0].downcase.include?(comentario.downcase)
  317.           return true
  318.         end
  319.       end
  320.     end
  321.   end
  322.   def check_comment(comentario)
  323.     com = comentario.downcase
  324.     return 0 if @list.nil? or @list.size <= 0
  325.     for item in @list
  326.       if item.code == 108 or item.code == 408
  327.         if item.parameters[0].downcase =~ /#{com}[ ]?(\d+)?/
  328.           return $1.to_i
  329.         end
  330.       end
  331.     end
  332.     return 0
  333.   end
  334.   def update
  335.     vlad_abs_gevent_update
  336.     if @inimigo
  337.       new_x = (@x + (@direction == 4 ? -1 : @direction == 6 ? 1 : 0))
  338.       new_y = (@y + (@direction == 8 ? -1 : @direction == 2 ? 1 : 0))
  339.       if self.wait_ataque > 0
  340.         self.wait_ataque -= 1
  341.       elsif can_attack?(new_x, new_y, self.range)
  342.          $game_player.recebe_atk(self)
  343.          $game_player.animation_id = self.enemy_atk_animation_id
  344.          $game_player.jump(0,0)
  345.         self.wait_ataque = get_attack_speed(@enemy_status.agi)
  346.       end
  347.     end
  348.      if @automove
  349.        unless moving?
  350.             self.follow_hero($game_player.x, $game_player.y)
  351.           end
  352.         end
  353.       end
  354.   
  355.   #获得敌人的攻击间隔
  356.   def get_attack_speed(agi)
  357.     return Enemy_Base_Attack_speed - agi
  358.   end
  359.   #判断敌人攻击距离内是否有玩家
  360.   def can_attack?(x, y, range = 0)
  361.     for i in 0...range
  362.       new_x = (x + (@direction == 4 ? -i : @direction == 6 ? i : 0))
  363.       new_y = (y + (@direction == 8 ? -i : @direction == 2 ? i : 0))
  364.       if $game_player.x == new_x and $game_player.y == new_y
  365.         return true
  366.       end
  367.     end
  368.     return false
  369.   end
  370.   
  371.   def refresh
  372.     vlad_abs_gevent_refresh
  373.    
  374.     @inimigo = false
  375.     @enemy_id = check_comment("Enemy")                  #获取敌人ID
  376.     @automove = true if check_com("Follow") == true     #获取敌人移动方式
  377.     @die = check_comment("Die")                         #获取敌人不死属性
  378.     @range = check_comment("Range")                     #获取敌人攻击距离
  379.     @drop_item = check_comment("Drop")                  #获取掉落物品
  380.     @drop_rate = check_comment("Drop_rate")             #获取物品掉率
  381.     if @enemy_id > 0
  382.       @inimigo = true
  383.       @enemy_status = Game_Enemy.new(@enemy_id, @enemy_id)
  384.             self.hp = @enemy_status.maxhp
  385.             self.mp = @enemy_status.maxmp
  386.     end
  387.    
  388.   end
  389.   
  390.   def enemy_atk_animation_id
  391.     if Enemy_atk_ani[@enemy_id]
  392.       return (@enemy_status.nil? ? 0 : Enemy_atk_ani[@enemy_id])
  393.     else
  394.       return (@enemy_status.nil? ? 0 : 1)
  395.     end
  396.   end
  397.   
  398.   def Enemy_atk_ani
  399.     return Enemy_atk_ani
  400.   end
  401.   
  402. end

  403. #--------------------------------------------------------------
  404. # Game Player
  405. #--------------------------------------------------------------
  406. class Game_Player < Game_Character
  407.   alias vlad_abs_gplayer_update update
  408.   alias vlad_abs_gplayer_refresh refresh
  409.   def update
  410.     vlad_abs_gplayer_update
  411.     self.wait_ataque = 0 if self.wait_ataque == nil
  412.     if self.wait_ataque > 0
  413.       self.wait_ataque -= 1
  414.     end
  415.     self.skill_wait_ataque = 0 if self.skill_wait_ataque == nil
  416.     if self.skill_wait_ataque > 0
  417.       self.skill_wait_ataque -= 1
  418.     end
  419.   def refresh
  420.     vlad_abs_gplayer_refresh
  421.     self.hp = $game_actors[1].hp
  422.     self.mp = $game_actors[1].mp
  423.   end
  424.     if Input.trigger?(Attack_Button) and self.wait_ataque <= 0 #test
  425.       new_x = (@x + ($game_player.direction == 4 ? -1 : $game_player.direction == 6 ? 1 : 0))
  426.       new_y = (@y + ($game_player.direction == 8 ? -1 : $game_player.direction == 2 ? 1 : 0))
  427.       for event in $game_map.events.values
  428.         if event.inimigo
  429.           if can_attack?(new_x, new_y, event, Attack_Range)
  430.             event.recebe_atk(self)
  431.             event.animation_id = self.player_atk_animation_id
  432.             event.jump(0,0)
  433.             self.wait_ataque = get_attack_speed($game_actors[1].agi)
  434.             break
  435.           end
  436.         end
  437.       end
  438.     end
  439.     for key in Skill_Button.keys
  440.     if Input.trigger?(key) and can_use_skill?(self, Skill_Button[key])
  441.       
  442.       #如果使用的技能是回复技能,则对自己使用
  443.       if $data_skills[Skill_Button[key]].base_damage < 0
  444.         self.recebe_skl(self)
  445.         self.animation_id = self.player_skl_animation_id
  446.         self.skill_wait_ataque = Skill_Wait_Ataque
  447.       #否则查看该伤害技能是否能攻击到敌人
  448.       else
  449.         new_x = (@x + ($game_player.direction == 4 ? -1 : $game_player.direction == 6 ? 1 : 0))
  450.         new_y = (@y + ($game_player.direction == 8 ? -1 : $game_player.direction == 2 ? 1 : 0))
  451.         for event in $game_map.events.values
  452.           if event.inimigo
  453.             if can_attack?(new_x, new_y, event, Attack_Range)
  454.               event.recebe_skl(self)
  455.               event.animation_id = self.player_skl_animation_id
  456.               event.jump(0,0)
  457.               self.skill_wait_ataque = Skill_Wait_Ataque
  458.               break
  459.             end
  460.           end
  461.         end
  462.       end
  463.     end
  464.   end
  465.   #判断是否能使用技能
  466.   def can_use_skill?(player, skill_key)
  467.     return false if skill_key == nil
  468.     return false if skill_key == 0
  469.     return false if $game_actors[1].mp < $data_skills[skill_key].mp_cost
  470.     return false if player.skill_wait_ataque > 0
  471.     return true
  472.   end
  473.   #获得玩家的攻击速度
  474.   def get_attack_speed(agi)
  475.     return Player_Base_Attack_Speed - agi
  476.   end
  477.   #判断玩家攻击距离内是否有敌人
  478.   def can_attack?(x, y, event, range = 0)
  479.     for i in 0...range
  480.       next_x = (x + ($game_player.direction == 4 ? -i : $game_player.direction == 6 ? i : 0))
  481.       next_y = (y + ($game_player.direction == 8 ? -i : $game_player.direction == 2 ? i : 0))
  482.       if event.x == next_x and event.y == next_y
  483.         return true
  484.       end
  485.     end
  486.     return false
  487.   end
  488.     def player_atk_animation_id
  489.     return ($game_actors[1].nil? ? 0 : $game_actors[1].atk_animation_id)
  490.   end
  491.   def player_skl_animation_id
  492.     for key in Skill_Button.keys
  493.       sklid = Skill_Button[key]
  494.     return ($game_actors[1].nil? ? 0 : $data_skills[sklid].animation_id)
  495.     end
  496.   end
  497.     def Attack_Button
  498.     return Attack_Button
  499.   end
  500.   def Skill_Button
  501.     return Skill_Button
  502.   end
  503.   end
  504. end

  505. #--------------------------------------------------------------
  506. # Game Actor
  507. #--------------------------------------------------------------
  508. class Game_Actor
  509.   alias vlad_abs_change_exp change_exp
  510.   
  511.   def change_exp(exp, show)
  512.     last_level = @level
  513.     last_skills = skills
  514.     @exp = [[exp, 9999999].min, 0].max
  515.     while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
  516.       level_up
  517.     end
  518.     while @exp < @exp_list[@level]
  519.       level_down
  520.     end
  521.     @hp = [@hp, maxhp].min
  522.     @mp = [@mp, maxmp].min
  523.     if show and @level > last_level
  524.       show_level_up
  525.     end
  526.     vlad_abs_change_exp(exp,show)
  527.   end
  528.   
  529.   def show_level_up
  530.     $game_player.animation_id = LevelUp_Ani
  531.     $game_actors[1].hp = $game_actors[1].maxhp
  532.     $game_actors[1].mp = $game_actors[1].maxmp
  533.   end
  534.   
  535.   def LevelUp_Ani
  536.     return LevelUp_Ani
  537.   end
  538. end
  539. #--------------------------------------------------------------
  540. # Sprite Character
  541. #--------------------------------------------------------------
  542. class Sprite_Character < Sprite_Base
  543.   alias vlad_abs_spchar_update update
  544.   
  545.   #--------------------------------------------------------------------------
  546.   # ● 初始化
  547.   #--------------------------------------------------------------------------
  548.   def initialize(viewport, character = nil)
  549.     super(viewport)
  550.     @character = character
  551.     @balloon_duration = 0
  552.     @_damage_sprites = []
  553.     @_damage_durations = []
  554.     @_critical_durations = []
  555.     @_critical_sprites = []
  556.     update
  557.   end
  558.   
  559.   def update
  560.     vlad_abs_spchar_update
  561.     if $game_switches[Switch_Number] == true
  562.       if @character != nil and @character.damage != nil
  563.         process_damage(@character.damage, @character.critical)
  564.         @character.damage = nil
  565.         @character.critical = false
  566.       end
  567.       process_sprites   #处理精灵数组
  568.       
  569.       #显示伤害的精灵
  570.       if @_damage_sprites.size > 0
  571.         for i in 0...@_damage_sprites.size
  572.           if @_damage_durations[i] > 0
  573.             @_damage_durations[i] -= 1
  574.             @_damage_sprites[i].x = self.x
  575.             @_damage_sprites[i].y -= 1 if @_damage_durations[i] % 2
  576.           end
  577.           if @_damage_durations[i] <= 0
  578.             @_damage_sprites[i].bitmap.dispose
  579.             @_damage_sprites[i].dispose
  580.             @_damage_durations[i] = nil
  581.             @_damage_sprites[i] = nil
  582.           end
  583.         end
  584.       end
  585.       
  586.       #显示暴击标志的精灵
  587.       if @_critical_sprites.size > 0
  588.         for i in 0...@_critical_sprites.size
  589.           if @_critical_durations[i] > 0
  590.             @_critical_durations[i] -= 1
  591.             @_critical_sprites[i].x = self.x
  592.             @_critical_sprites[i].y -=1 if @_critical_durations[i] % 2
  593.           end
  594.           if @_critical_durations[i] <= 0
  595.             @_critical_sprites[i].bitmap.dispose
  596.             @_critical_sprites[i].dispose
  597.             @_critical_durations[i] = nil
  598.             @_critical_sprites[i] = nil
  599.           end
  600.         end
  601.       end
  602.       #显示获得物品的精灵
  603.       if @_item_sprite != nil
  604.         @_item_duration -= 1
  605.         @_item_sprite.y -= 1 if @_item_duration % 2
  606.         @_item_sprite.x = self.x
  607.         if @_item_duration <= 0
  608.           @_item_sprite.bitmap.dispose
  609.           @_item_sprite.dispose
  610.           @_item_sprite = nil
  611.         end
  612.       end
  613.       if @character.drop_flag
  614.         process_get_item(@character.drop_item)
  615.         @character.drop_flag = false
  616.       end
  617.     end
  618.   end
  619.   
  620.   def process_sprites
  621.     @_damage_durations = @_damage_durations.compact if @_damage_durations != nil
  622.     @_damage_sprites = @_damage_sprites.compact if @_damage_sprites != nil
  623.     @_critical_durations = @_critical_durations.compact if @_critical_durations != nil
  624.     @_critical_sprites = @_critical_sprites.compact if @_critical_sprites != nil
  625.   end
  626.   #--------------------------------------------------------------------------
  627.   # ● 伤害显示
  628.   #--------------------------------------------------------------------------
  629.   def process_damage(value, critical)
  630.     if value.is_a?(Numeric)
  631.       damage_string = value.abs.to_s
  632.     else
  633.       damage_string = value.to_s
  634.     end
  635.    
  636.     bitmap = Bitmap.new(160, 48)
  637.     bitmap.font.name = "Georgia"
  638.     bitmap.font.size = 20
  639.     bitmap.font.italic = true
  640.     if value.is_a?(Numeric) and value == 0
  641.       bitmap = Cache.picture("Invalid")
  642.     elsif value.is_a?(Numeric) and value < 0
  643.       bitmap.draw_number(0, 10, value.abs, "B") #一箭烂大的图片数字脚本
  644.     else
  645.       bitmap.draw_number(0, 10, value.abs, "A") #一箭烂大的图片数字脚本
  646.     end
  647.    
  648.     if critical and value > 0
  649.       critical_bitmap = Cache.picture("Critical")
  650.       _critical_sprite = ::Sprite.new(self.viewport)
  651.       _critical_sprite.bitmap = critical_bitmap
  652.       _critical_sprite.ox = 40
  653.       _critical_sprite.oy = 20
  654.       _critical_sprite.x = self.x
  655.       _critical_sprite.y = self.y - self.oy / 2 - 60
  656.       _critical_sprite.z += 99999
  657.       _critical_duration = 30
  658.       @_critical_sprites.push (_critical_sprite)
  659.       @_critical_durations.push (_critical_duration)
  660.       Sound.play_critical
  661.     end
  662.    
  663.     _damage_sprite = ::Sprite.new(self.viewport)
  664.     _damage_sprite.bitmap = bitmap
  665.     _damage_sprite.ox = 10 * get_horizontal(value.abs)
  666.     _damage_sprite.x = self.x
  667.     _damage_sprite.y = self.y - 80
  668.     _damage_sprite.z += 99999
  669.     _damage_duration = 30
  670.     @_damage_sprites.push  (_damage_sprite)
  671.     @_damage_durations.push (_damage_duration)
  672.   end
  673.   
  674.   def process_get_item(drop_item)
  675.     if @_item_sprite != nil
  676.       @_item_sprite.bitmap.dispose
  677.       @_item_sprite.dispose
  678.       @_item_sprite = nil
  679.     end
  680.     bitmap = Cache.picture("Drop_Item")
  681.     viewport = Viewport.new(0, 0, 544, 416)
  682.     @_item_sprite = Sprite.new(viewport)
  683.     @_item_sprite.bitmap = bitmap
  684.     @_item_sprite.ox = 60
  685.     @_item_sprite.oy = 20
  686.     @_item_sprite.x = self.x
  687.     @_item_sprite.y = self.y - 100
  688.     @_item_sprite.z += 99999
  689.     @_item_duration = 30
  690.     Sound.play_gain_item
  691.   end
  692.   
  693.   def get_horizontal(value)
  694.     if value == 0
  695.       return 3
  696.     end
  697.     horizontal = 0
  698.     while (value > 0)
  699.       value = (value / 10).truncate
  700.       horizontal += 1
  701.     end
  702.     return horizontal
  703.   end
  704. end
  705.   
  706. #--------------------------------------------------------------
  707. # Window Skill
  708. #--------------------------------------------------------------
  709. class Scene_Skill
  710.   alias vlad_abs_sskill_initialize initialize
  711.   alias vlad_abs_sskill_update update
  712.   
  713.   def initialize(actor_index = 0, equip_index = 0)
  714.     @memory = Window_Command.new(150, ["记录S键技能"])
  715.     @memory.active = false
  716.     @memory.visible = false
  717.     @memory.x = (544 - @memory.width) / 2
  718.     @memory.y = (416 - @memory.height) / 2
  719.     @memory.z = 1500
  720.     vlad_abs_sskill_initialize
  721.   end
  722.   
  723.   def update
  724.     update_skill
  725.     @memory.update if @memory.active
  726.     return update_memory if @memory.active
  727.     vlad_abs_sskill_update
  728.   end
  729.   
  730.   def update_skill
  731.     for key in Skill_Button.keys
  732.       if Input.trigger?(key)
  733.         Sound.play_decision
  734.         Skill_Button[key] = @skill_window.skill.id
  735.         @memory.active = @memory.visible = true
  736.         @skill_window.active = false
  737.       end
  738.     end
  739.   end
  740.   
  741.   def update_memory
  742.     if Input.trigger?(Input::C)
  743.       Sound.play_decision
  744.       @memory.active = @memory.visible = false
  745.       @skill_window.active = true
  746.     end
  747.   end
  748.   
  749.   def Skill_Button
  750.     return Skill_Button
  751.   end
  752.   
  753. end

  754. #--------------------------------------------------------------
  755. # FINISH
  756. #--------------------------------------------------------------
复制代码
  1. #=============================================================================
  2. # Window Hud
  3. #=============================================================================

  4. class Window_Hud < Window_Base
  5.   def initialize
  6.     super(0,0,128,96)
  7.     self.opacity = 0
  8.     self.visible = false
  9.     refresh
  10.   end
  11.   def refresh
  12.     self.contents.clear
  13.       actor = $game_actors[1]
  14.       draw_actor_hp(actor, 0, 0, 96)
  15.       draw_actor_mp(actor, 0, 32, 96)
  16.    end
  17.    def update
  18.      self.visible = false
  19.      self.visible = true if $game_switches[95] == true
  20.      refresh
  21.    end
  22. end

  23. class Scene_Map
  24.   alias hud_main main
  25.   alias hud_update update
  26.   alias hud_terminate terminate
  27.   def main
  28.     @hud = Window_Hud.new
  29.     hud_main
  30.   end
  31.   def update
  32.     @hud.update
  33.     hud_update
  34.   end
  35.   def terminate
  36.     @hud.dispose
  37.   end
  38. end

  39. module Sound
  40.   def self.play_critical
  41.     Audio.se_play("Audio/SE/Critical", 100)
  42.   end
  43.   
  44.   def self.play_gain_item
  45.     Audio.se_play("Audio/SE/Get_Item")
  46.   end
  47. end
复制代码
范例……

ARPG.rar

648.14 KB, 下载次数: 2466

退屈すぎ…

Lv1.梦旅人

梦石
0
星屑
209
在线时间
63 小时
注册时间
2010-12-12
帖子
30
2
发表于 2014-6-7 20:19:45 | 只看该作者
有个问题,还能修改技能快捷键吗?我想多弄几个,还有  把S修改为Q什么的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
209
在线时间
63 小时
注册时间
2010-12-12
帖子
30
3
发表于 2014-6-7 20:20:08 | 只看该作者
wazg0258 发表于 2014-6-7 20:19
有个问题,还能修改技能快捷键吗?我想多弄几个,还有  把S修改为Q什么的

我挖坟了  我去……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2504
在线时间
2357 小时
注册时间
2012-3-1
帖子
735
4
发表于 2014-6-12 20:20:58 | 只看该作者
好简单的ARPG系统,不过已经很赞了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
116
在线时间
26 小时
注册时间
2014-8-4
帖子
28
5
发表于 2014-8-6 17:29:36 | 只看该作者
很棒很棒,请问一下我是新人怎么设置怪物血量
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
464
在线时间
4 小时
注册时间
2017-1-5
帖子
4
6
发表于 2017-1-5 15:10:52 | 只看该作者
我新手,想问一下,是不是复制粘贴就能用?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
116
在线时间
26 小时
注册时间
2014-8-4
帖子
28
7
发表于 2020-8-24 17:27:59 | 只看该作者
2020考古,感谢大佬这个脚本帮助我曾经在教室多媒体上装逼
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-19 13:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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