Project1

标题: 如何在地图上凭空显示伤害 [打印本页]

作者: lxzuz    时间: 2018-6-15 21:39
标题: 如何在地图上凭空显示伤害
请问一下怎么才能在地图上凭空显示一段伤害值呢?
而且是不影响角色血量那种。[groupid=282]糯米团工作室[/groupid]
作者: Tsar_NicholasII    时间: 2018-6-15 23:46
下一个魔塔样板7630,里面有现成的显伤脚本
作者: Tsar_NicholasII    时间: 2018-6-15 23:51
本帖最后由 guoxiaomi 于 2018-7-21 00:42 编辑
  1. # 显伤脚本 By 正灌
  2. #1.搭配样板优化执行效率大概是传统显伤数十倍
  3. #2.能够自动判断埋伏怪之类的情况
  4. #3.支持怪物移动显伤跟随平滑移动
  5. #4.支持大地图(超过13*13)显伤
  6. #5.切换地图时显伤跟随平滑渐变

  7. MAX_EVENT_SIZE=169  #最大事件数,默认13*13=169

  8. class Map_damage
  9.   
  10.   attr_accessor :canvas, :refresh_on_step
  11.   #初始化
  12.   def initialize
  13.     @canvas=[]
  14.     for i in 1...MAX_EVENT_SIZE+1
  15.       @canvas[i]=Sprite.new
  16.       @canvas[i].bitmap=Bitmap.new(32,32)
  17.       @canvas[i].z=40
  18.     end
  19.     @refresh_on_step = false
  20.     @save_count=0
  21.     @colordata=[
  22.       Color.new(0,0,0),Color.new(0, 255, 0),Color.new(255, 255, 255),
  23.       Color.new(255, 255, 0),Color.new(255, 127, 0),Color.new(255, 0, 0),
  24.       Color.new(128, 255, 255, 255),Color.new(6,6,6,155),Color.new(255, 0, 255),
  25.       Color.new(255,24,224, 255),Color.new(25,25,25,100),Color.new(210, 255, 30),
  26.       Color.new(0, 255, 255),Color.new(0, 0, 255)
  27.     ]
  28.   end
  29.   def dispose
  30.     for i in 1...MAX_EVENT_SIZE+1
  31.       @canvas[i].bitmap.dispose
  32.       @canvas[i].dispose
  33.     end
  34.   end

  35.   # 这里设置启用前提条件(怪物手册等等),必须返回true(启用)或false(禁用)
  36.   def enable?
  37.     # 怪物手册(4号物品)持有时启用
  38.     # 同时要求55号开关开启,可以在初始化中进行调整
  39.     return false if !$game_switches[55]
  40.     return $game_party.item_number(4) != 0
  41.   end
  42.   def clear
  43.     for i in 1...MAX_EVENT_SIZE+1
  44.       @canvas[i].bitmap.clear
  45.     end
  46.   end
  47.   
  48.   def resetxy(id,x,y)
  49.     @canvas[id].x=x-17
  50.     @canvas[id].y=y-9
  51.   end
  52.   def setvisible(id,sw)
  53.     @canvas[id].visible=sw
  54.   end

  55.   # 这里设置显示前提条件(潜伏怪、机关不显示等等)
  56.   def render?(id, x, y, eid)
  57.     old = false
  58.     # 兼容性测试
  59.     test = got_p(id,1) rescue old = true
  60.    
  61.     if old
  62.       if got_p(id,11)
  63.         # 有潜伏怪则每步刷新
  64.         @refresh_on_step = true
  65.         if $game_party.item_number($game_variables[79]) == 0
  66.           return false # 潜伏怪不显示伤害(持有反潜伏的79号物品后显示)
  67.         elsif !((x-$game_player.x).abs+(y-$game_player.y).abs <= $game_variables[84])
  68.           return false
  69.         end
  70.       end
  71.       norevive = false
  72.       iserase = $game_map.events[eid].iserase rescue norevive = true
  73.       if !norevive
  74.         if got_p(id,16) and iserase # 重生怪打败后暂时不显示伤害
  75.           return false
  76.         end
  77.       end
  78.     else
  79.       # 兼容性测试
  80.       special = true

  81.       if got_p(id,11)
  82.         # 有潜伏怪则每步刷新
  83.         @refresh_on_step = true
  84.         if $game_party.item_number($game_variables[79]) == 0
  85.           return false # 潜伏怪不显示伤害(持有反潜伏的物品后显示)
  86.         elsif !((x-$game_player.x).abs+(y-$game_player.y).abs<=$game_variables[84])
  87.           return false
  88.         end
  89.       end
  90.       
  91.       if got_p(id,16) and $game_map.events[eid].iserase # 重生怪打败后暂时不显示伤害
  92.         return false
  93.       end
  94.     end
  95.     return true
  96.   end

  97.   # 这里设置不同伤害的不同颜色,damage是敌人伤害,必须返回Color类的实例(用Color.new生成)
  98.   def color?(damage)
  99.     hp = $game_actors[$game_variables[1] + 1].hp # 勇士生命
  100.     ratio = 1.0 * damage / hp
  101.     if ratio <= 0 # 无伤害
  102.       return @colordata[2] # 绿
  103.     elsif ratio < 1.0 / 4.0 # 伤害小于勇士血量1/4
  104.       return @colordata[1] # 白
  105.     elsif ratio < 2.0 / 4.0 # 伤害在勇士血量1/4到1/2之间
  106.       return @colordata[3] # 黄
  107.     elsif ratio < 3.0 / 4.0 # 伤害在勇士血量1/2到3/4之间
  108.       return @colordata[4] # 橙
  109.     elsif ratio < 1.0 # 伤害在勇士血量3/4到1之间
  110.       return @colordata[9] # 紫
  111.     elsif damage != 2147483646 # 伤害大于等于勇士血量
  112.       return @colordata[5] # 红
  113.     else # 无敌怪且无十字架
  114.       return @colordata[0] # 黑
  115.     end
  116.   end

  117.   # 刷新。手动刷新也用这个方法
  118.   def refresh
  119.     return if @save_count==Graphics.frame_count
  120.     @save_count=Graphics.frame_count
  121.     EnemyReady.refresh
  122.     if enable?
  123.       @refresh_on_step = false
  124.       clear
  125.       $game_map.events.each_value{ |value|
  126.         event = value.event
  127.         name = event.name
  128.         if name[0, 6] == "怪物" && value.character_name !=""
  129.           draw_by_id(name[6, name.length - 1].to_i, event.x, event.y, event.id)
  130.         end
  131.       }
  132.     end
  133.   end

  134.   def draw_by_id(id, x, y, eid)
  135.     # 获得Enemy_property对象
  136.     if !render?(id, x, y, eid)
  137.       @canvas[eid].visible=false
  138.     else
  139.       @canvas[eid].visible=true
  140.     end
  141.     # 获得伤害字符串
  142.     j=0
  143.     for i in $floorenemies
  144.       if i==id
  145.         damage = $fledam[j]
  146.         res = $fleres[j]
  147.         break
  148.       end
  149.       j+=1
  150.     end
  151.     if res ==1
  152.       damage_s = "????"
  153.     elsif res==2
  154.       damage_s = "????"
  155.     else
  156.       damage_s = damage.to_s
  157.     end
  158.     # 画出来并加边框
  159.     t = @canvas[eid].bitmap
  160.     main_color = color?(damage)

  161.     t.font.name = "萝莉体 第二版" # 字体随便换
  162.     t.font.size = 15 # 字体大小不能太大
  163.     t.font.color = @colordata[0]
  164.     t.draw_text(2,0, 12 * damage_s.length, 12, damage_s)
  165.     t.draw_text(0,0, 12 * damage_s.length, 12, damage_s)
  166.     t.draw_text(2,2, 12 * damage_s.length, 12, damage_s)
  167.     t.draw_text(0,2, 12 * damage_s.length, 12, damage_s)
  168.     t.font.color = main_color
  169.     t.draw_text(1,1 ,12 * damage_s.length, 12, damage_s)
  170.   end

  171. end

  172. # 追加定义Window_PlayerDate类,能力改变时刷新
  173. class Window_PlayerDate
  174.   alias :old_refresh :refresh
  175.   def refresh
  176.     old_refresh
  177.     $mapdamage_obj.refresh
  178.   end

  179. end

  180. # 追加定义Game_Party类
  181. class Game_Party
  182.   
  183.   alias :old_gain_item :gain_item
  184.   alias :old_increase_steps :increase_steps
  185.   
  186.   # 获得怪物手册或反潜伏物品或反无敌物品时刷新
  187.   def gain_item(item_id, n)
  188.     old_gain_item(item_id, n)
  189.     if item_id == 4 or item_id == $game_variables[79] or item_id == $game_variables[71]
  190.       $mapdamage_obj.refresh if $mapdamage_obj != nil
  191.     end
  192.   end
  193.   
  194.   # 若有潜伏怪则每步刷新
  195.   def increase_steps
  196.     old_increase_steps
  197.     if $mapdamage_obj != nil and $mapdamage_obj.refresh_on_step
  198.       $game_map.events.each_value{ |value|
  199.         event = value.event
  200.         name = event.name
  201.         if name[0, 6] == "怪物" && value.character_name !=""
  202.           if !$mapdamage_obj.render?(name[6, name.length - 1].to_i, event.x, event.y, event.id)
  203.             $mapdamage_obj.canvas[event.id].visible=false
  204.           else
  205.             $mapdamage_obj.canvas[event.id].visible=true
  206.           end
  207.         end
  208.       }
  209.     end
  210.   end
  211.   
  212. end

  213. class Game_Map
  214.   def refresh
  215.     # 地图 ID 有效
  216.     if @map_id > 0
  217.       check=false
  218.       # 刷新全部的地图事件
  219.       for event in @events.values
  220.         check=true if event.refresh==true && event.event.name[0,6] == "怪物"
  221.       end
  222.       $mapdamage_obj.refresh if check
  223.       # 刷新全部的公共事件
  224.       for common_event in @common_events.values
  225.         common_event.refresh
  226.       end
  227.     end
  228.     # 清除刷新要求标志
  229.     @need_refresh = false
  230.   end
  231. end

  232. # 追加定义Game_Event类,提供是否擦除的获取器
  233. class Game_Event
  234.   def iserase
  235.     return @erased
  236.   end
  237.   def refresh
  238.     # 初始化本地变量 new_page
  239.     new_page = nil
  240.     # 无法暂时小时的情况下
  241.     unless @erased
  242.       # 从编号大的事件页按顺序调查
  243.       for page in @event.pages.reverse
  244.         # 可以参考事件条件 c
  245.         c = page.condition
  246.         # 确认开关条件 1
  247.         if c.switch1_valid
  248.           if $game_switches[c.switch1_id] == false
  249.             next
  250.           end
  251.         end
  252.         # 确认开关条件 2
  253.         if c.switch2_valid
  254.           if $game_switches[c.switch2_id] == false
  255.             next
  256.           end
  257.         end
  258.         # 确认变量条件
  259.         if c.variable_valid
  260.           if $game_variables[c.variable_id] < c.variable_value
  261.             next
  262.           end
  263.         end
  264.         # 确认独立开关条件
  265.         if c.self_switch_valid
  266.           key = [@map_id, @event.id, c.self_switch_ch]
  267.           if $game_self_switches[key] != true
  268.             next
  269.           end
  270.         end
  271.         # 设置本地变量 new_page
  272.         new_page = page
  273.         # 放弃循环
  274.         break
  275.       end
  276.     end
  277.     # 与上次同一事件页的情况下
  278.     if new_page == @page
  279.       # 过程结束
  280.       return
  281.     end
  282.     # @page 设置为现在的事件页
  283.     @page = new_page
  284.     # 清除启动中标志
  285.     clear_starting
  286.     # 没有满足条件的页面的时候
  287.     if @page == nil
  288.       # 设置各实例变量
  289.       @tile_id = 0
  290.       @character_name = ""
  291.       @character_hue = 0
  292.       @move_type = 0
  293.       @through = true
  294.       @trigger = nil
  295.       @list = nil
  296.       @interpreter = nil
  297.       # 过程结束
  298.       return true
  299.     end
  300.     # 设置各实例变量
  301.     @tile_id = @page.graphic.tile_id
  302.     @character_name = @page.graphic.character_name
  303.     @character_hue = @page.graphic.character_hue
  304.     if @original_direction != @page.graphic.direction
  305.       @direction = @page.graphic.direction
  306.       @original_direction = @direction
  307.       @prelock_direction = 0
  308.     end
  309.     if @original_pattern != @page.graphic.pattern
  310.       @pattern = @page.graphic.pattern
  311.       @original_pattern = @pattern
  312.     end
  313.     @opacity = @page.graphic.opacity
  314.     @blend_type = @page.graphic.blend_type
  315.     @move_type = @page.move_type
  316.     @move_speed = @page.move_speed
  317.     @move_frequency = @page.move_frequency
  318.     @move_route = @page.move_route
  319.     @move_route_index = 0
  320.     @move_route_forcing = false
  321.     @walk_anime = @page.walk_anime
  322.     @step_anime = @page.step_anime
  323.     @direction_fix = @page.direction_fix
  324.     @through = @page.through
  325.     @always_on_top = @page.always_on_top
  326.     @trigger = @page.trigger
  327.     @list = @page.list
  328.     @interpreter = nil
  329.     # 目标是 [并行处理] 的情况下
  330.     if @trigger == 4
  331.       # 生成并行处理用解释器
  332.       @interpreter = Interpreter.new
  333.     end
  334.     # 自动事件启动判定
  335.     check_event_trigger_auto
  336.     return true
  337.   end
  338. end

  339. # 追加定义Sprite_Character类
  340. class Sprite_Character < RPG::Sprite
  341.   alias :old_update :update
  342.   def update
  343.     old_update
  344.     if self != $game_player && @character.id>0
  345.       $mapdamage_obj.resetxy(@character.id,self.x,self.y)
  346.     end
  347.   end
  348. end

  349. # 追加定义Scene_Map类
  350. class Scene_Map

  351.   # 地图初始化时初始化并刷新
  352.   def initialize
  353.     $mapdamage_obj.dispose if $mapdamage_obj != nil && !$mapdamage_obj.canvas[1].disposed?
  354.     $mapdamage_obj = Map_damage.new
  355.     $mapdamage_obj.refresh
  356.   end
  357.   
  358.   # 场所移动时刷新
  359.   def transfer_player
  360.     # 清除主角场所移动调试标志
  361.     $game_temp.player_transferring = false
  362.     # 移动目标与现在的地图有差异的情况下
  363.     if $game_map.map_id != $game_temp.player_new_map_id
  364.       # 设置新地图
  365.       $game_map.setup($game_temp.player_new_map_id)
  366.     end
  367.     # 设置主角位置
  368.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  369.     # 设置主角朝向
  370.     case $game_temp.player_new_direction
  371.     when 2  # 下
  372.       $game_player.turn_down
  373.     when 4  # 左
  374.       $game_player.turn_left
  375.     when 6  # 右
  376.       $game_player.turn_right
  377.     when 8  # 上
  378.       $game_player.turn_up
  379.     end
  380.     # 矫正主角姿势
  381.     $game_player.straighten
  382.     # 刷新地图 (执行并行事件)
  383.     $game_map.update
  384.     # 在生成活动块
  385.     @spriteset.dispose
  386.     @spriteset = Spriteset_Map.new
  387.     # 处理过渡中的情况下
  388.     $mapdamage_obj.refresh_on_step = false
  389.     $mapdamage_obj.refresh
  390.     if $game_temp.transition_processing
  391.       # 清除过渡处理中标志
  392.       $game_temp.transition_processing = false
  393.       # 执行过渡
  394.       Graphics.transition(20)
  395.     end
  396.     # 执行地图设置的 BGM、BGS 的自动切换
  397.     $game_map.autoplay
  398.     # 设置画面
  399.     Graphics.frame_reset
  400.     # 刷新输入信息
  401.     Input.update
  402.   end

  403. end

  404. # 追加定义Scene_Title类,返回标题画面时去除所有伤害显示
  405. class Scene_Title
  406.   
  407.   def initialize
  408.     $mapdamage_obj.clear if $mapdamage_obj != nil && !$mapdamage_obj.canvas[1].disposed?
  409.   end
  410.   
  411. end

  412. # 追加定义Interpreter类
  413. class Interpreter
  414.   
  415.   alias :old_command_117 :command_117
  416.   alias :old_command_end :command_end
  417.   alias :old_setup :setup
  418.   
  419.   def command_117
  420.     @common_event_id = @parameters[0]
  421.     old_command_117
  422.   end
  423.   
  424.   def command_end
  425.     old_command_end
  426.     return if @common_event_id == nil or $mapdamage_obj == nil
  427.     # 战斗事件结束后刷新
  428.     if @common_event_id == 1
  429.       $mapdamage_obj.refresh
  430.     end
  431.     # 结局判定后清除
  432.     if @common_event_id == 12
  433.       $mapdamage_obj.clear
  434.     end
  435.     @common_event_id = 0
  436.   end
  437. end

  438. def got_p(id,val)
  439.   table=[false,true,false,false,false,false,false]
  440.   return false if $data_enemies[id].element_ranks[val]==nil
  441.   return table[$data_enemies[id].element_ranks[val]]
  442. end
复制代码

作者: lxzuz    时间: 2018-6-16 12:25
Tsar_NicholasII 发表于 2018-6-15 23:51
# 显伤脚本 By 正灌
#1.搭配样板优化执行效率大概是传统显伤数十倍
#2.能够自动判断埋伏怪之类的情况

看了一下魔板,伤害好像并没有在地图上显上,怎么使用显伤呢
作者: Tsar_NicholasII    时间: 2018-6-16 22:52
lxzuz 发表于 2018-6-16 14:25
看了一下魔板,伤害好像并没有在地图上显上,怎么使用显伤呢

不知道,我从魔塔样板里酒能正常使用
作者: lxzuz    时间: 2018-6-16 22:55
Tsar_NicholasII 发表于 2018-6-16 22:52
不知道,我从魔塔样板里酒能正常使用

虽然我用不了,但是还是谢谢了
作者: 灯笼菜刀王    时间: 2018-6-17 00:38
本帖最后由 灯笼菜刀王 于 2018-6-17 00:39 编辑

如果只是要显示伤害,  那只要事件脚本这样写

a = RPG::Sprite.new
a.damage(1000,false)

就可以了

运行的时候就会显示一个1000在左上角 后面的false改成true 就会变成 暴击显示

当然数字随便你添, 要添字符串也可以.  a.damage("爆炸吧",false)  这样写也行, 注意符号都要用半角符号

要移动位置调整X,Y的值就可以了,  比如 加上  a.x,a.y = 320,240   这样就是在屏幕中间了

不过因为没有update,所以也就只是显示出来而已, 然后自然消失......

作者: 真·可乐    时间: 2018-6-17 05:43
Tsar_NicholasII 发表于 2018-6-16 22:52
不知道,我从魔塔样板里酒能正常使用

不进行修改的话,这个应该只能在魔塔样板里用
作者: lxzuz    时间: 2018-6-17 14:11
真·可乐 发表于 2018-6-17 05:43
不进行修改的话,这个应该只能在魔塔样板里用

似乎是的呢
作者: lxzuz    时间: 2018-6-17 14:14
灯笼菜刀王 发表于 2018-6-17 00:38
如果只是要显示伤害,  那只要事件脚本这样写

a = RPG::Sprite.new

十分感谢!请问能不能控制显示时间呢,还有把数字换成变量显示行不行
作者: 灯笼菜刀王    时间: 2018-6-17 17:17
本帖最后由 灯笼菜刀王 于 2018-6-17 17:18 编辑
lxzuz 发表于 2018-6-17 14:14
十分感谢!请问能不能控制显示时间呢,还有把数字换成变量显示行不行


正常的伤害是跳一下就没了哦, 现在已经是超额显示了

想要让它消失, 就 damege(nil,false)就可以了, 不过如果不是写在同一个事件脚本框里, 那就要用 @a 赋值

如果是要跳一下消失的正常伤害显示, 那想办法到scene map的update里刷新这个精灵就可以了

提示: 可以用全局变量, 这样就不受事件和脚本限制了,

至于后面的那个问题, 行还是不行, 自己实验一下不就清楚了?  不经过自己动手想学会脚本可是不可能的哦, 所以咱就不给你直接的方法了, 自己尝试吧,记得备份, 能做到运行游戏不弹出什么玩意就算成功
作者: lxzuz    时间: 2018-6-17 17:30
灯笼菜刀王 发表于 2018-6-17 17:17
正常的伤害是跳一下就没了哦, 现在已经是超额显示了

想要让它消失, 就 damege(nil,false)就可 ...

问题解决了,十分感谢!
作者: clear仔    时间: 2018-7-7 20:03
这是我自己写的任意显示伤害的脚本,用的时候只要初始化一个Damage对象就行了,
然后填参数(显示在屏幕上的x坐标,显示在屏幕上的y坐标,显示的数值,可选颜色,可选是否暴击)
移动轨迹是随机一个0-180度的斜抛运动+落地反弹,想改轨迹可以在update里面改,
该时间的话可以改update里面有关@t的判断
  1. module POP
  2.         G = 0.25
  3.         V = 1.5
  4.         E = 1.0
  5. end
  6. class Damage < Sprite
  7.         def initialize(x,y,num,color=Color.new(200,200,200),critical=false)
  8.                 super()
  9.                 width = num.to_s.size*18
  10.                 self.x = x
  11.                 self.y = y - 50
  12.                 @ori_y = y - 25
  13.                 self.bitmap = Bitmap.new(width,36)
  14.                 self.bitmap.font.size = 22
  15.                 self.bitmap.font.name = "Arial Black"
  16.                 if num.is_a?(Integer)
  17.                         if num > 0
  18.                                 self.bitmap.font.color = color#Color.new(255,55,55)
  19.                         elsif num < 0
  20.                                 self.bitmap.font.color = Color.new(55,255,55)
  21.                         else
  22.                                 self.bitmap.font.color = Color.new(200,200,200)
  23.                         end
  24.                 else
  25.                         self.bitmap.font.name = "黑体"
  26.                         self.bitmap.font.color = Color.new(200,200,200)
  27.                 end
  28.                 self.bitmap.draw_text(2,14,width,22,num.to_s)
  29.                 if critical
  30.                         self.bitmap.font.size = 12
  31.                         self.bitmap.font.color = Color.new(255,255,55)
  32.                         self.bitmap.font.name = "黑体"
  33.                         self.bitmap.draw_text(2,4,width,12,"致命")
  34.                 end
  35.                 v = POP::V
  36.                 angle = ((rand(90)+45)/(180.to_f))*Math::PI
  37.                 @t = 0
  38.                 @e = POP::E
  39.                 @vx = v*Math.cos(angle)*0.6
  40.                 @vy = v*Math.sin(angle)
  41.                 Graphics.damages << self
  42.         end
  43.         def update
  44.                 @t += 1
  45.                 @vy -= POP::G#g
  46.                 self.x += @vx*@t
  47.                 self.y -= @vy*@t
  48.                 if self.y >= @ori_y
  49.                         @vy = @e*(@vy).abs
  50.                         @vx = @e*@vx
  51.       self.y = @ori_y
  52.                 end
  53.                 if self.zoom_x < 1
  54.                         self.zoom_x += 0.1
  55.                         self.zoom_y += 0.1
  56.                 end
  57.                 if @t > 20
  58.                         self.opacity -= 40
  59.                 elsif @t >= 40
  60.                         self.dispose
  61.                 end
  62.         end
  63. end
  64. module Graphics
  65.         @damages = []
  66.         class << self
  67.                 attr_accessor :damages
  68.                 alias damage_update update
  69.                 def update
  70.                         @damages.freshen
  71.                         damage_update
  72.                         for i in @damages
  73.                                 next if i.disposed?
  74.                                 i.update
  75.                                 #return
  76.                         end
  77.                 end
  78.         end
  79. end
复制代码

作者: guoxiaomi    时间: 2018-7-21 00:41
可以参考这个:
https://rpg.blue/thread-409207-1-1.html




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1