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

Project1

 找回密码
 注册会员
搜索
查看: 4471|回复: 21

[已经解决] 如何在地图上凭空显示伤害

[复制链接]

Lv2.观梦者

梦石
0
星屑
657
在线时间
333 小时
注册时间
2011-3-14
帖子
121
发表于 2018-6-15 21:39:44 | 显示全部楼层 |阅读模式

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

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

x
请问一下怎么才能在地图上凭空显示一段伤害值呢?
而且是不影响角色血量那种。

Lv4.逐梦者

梦石
0
星屑
6245
在线时间
558 小时
注册时间
2018-6-5
帖子
129
发表于 2018-6-15 23:46:47 | 显示全部楼层
下一个魔塔样板7630,里面有现成的显伤脚本
俄罗斯帝国末代沙皇尼古拉二世
#俄文转写 = Царь Николай II
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6245
在线时间
558 小时
注册时间
2018-6-5
帖子
129
发表于 2018-6-15 23:51:06 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 我很赞同

查看全部评分

俄罗斯帝国末代沙皇尼古拉二世
#俄文转写 = Царь Николай II
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
657
在线时间
333 小时
注册时间
2011-3-14
帖子
121
 楼主| 发表于 2018-6-16 12:25:47 | 显示全部楼层
Tsar_NicholasII 发表于 2018-6-15 23:51
# 显伤脚本 By 正灌
#1.搭配样板优化执行效率大概是传统显伤数十倍
#2.能够自动判断埋伏怪之类的情况

看了一下魔板,伤害好像并没有在地图上显上,怎么使用显伤呢
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6245
在线时间
558 小时
注册时间
2018-6-5
帖子
129
发表于 2018-6-16 22:52:44 | 显示全部楼层
lxzuz 发表于 2018-6-16 14:25
看了一下魔板,伤害好像并没有在地图上显上,怎么使用显伤呢

不知道,我从魔塔样板里酒能正常使用
俄罗斯帝国末代沙皇尼古拉二世
#俄文转写 = Царь Николай II
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
657
在线时间
333 小时
注册时间
2011-3-14
帖子
121
 楼主| 发表于 2018-6-16 22:55:41 | 显示全部楼层
Tsar_NicholasII 发表于 2018-6-16 22:52
不知道,我从魔塔样板里酒能正常使用

虽然我用不了,但是还是谢谢了
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37641
在线时间
5311 小时
注册时间
2006-11-10
帖子
6541
发表于 2018-6-17 00:38:07 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 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,所以也就只是显示出来而已, 然后自然消失......

评分

参与人数 1星屑 +25 收起 理由
guoxiaomi + 25 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
13088
在线时间
2273 小时
注册时间
2011-6-4
帖子
613
发表于 2018-6-17 05:43:33 | 显示全部楼层
Tsar_NicholasII 发表于 2018-6-16 22:52
不知道,我从魔塔样板里酒能正常使用

不进行修改的话,这个应该只能在魔塔样板里用
BUG反馈请加QQ 529283039
水友群 917854767

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
657
在线时间
333 小时
注册时间
2011-3-14
帖子
121
 楼主| 发表于 2018-6-17 14:11:00 | 显示全部楼层
真·可乐 发表于 2018-6-17 05:43
不进行修改的话,这个应该只能在魔塔样板里用

似乎是的呢
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
657
在线时间
333 小时
注册时间
2011-3-14
帖子
121
 楼主| 发表于 2018-6-17 14:14:24 | 显示全部楼层
灯笼菜刀王 发表于 2018-6-17 00:38
如果只是要显示伤害,  那只要事件脚本这样写

a = RPG::Sprite.new

十分感谢!请问能不能控制显示时间呢,还有把数字换成变量显示行不行
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 22:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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