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

Project1

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

简易的ARPG脚本。。。

 关闭 [复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2008-8-2 06:15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
帮我朋友写,结果他不玩RM了。发上来给大家。。
这个系统是全宇宙最简单的了。。。
设置方法:
事件:敌人,队伍id
队伍:第一个敌人会出场。。。
然后并行,循环
  1. (($game_player.x-$game_map.events[id].x).abs == 1) and ($game_player.y == $game_map.events[id].y)
复制代码

判断Kboard.repeat?($R_Key_A)Kboard.repeat?($R_Key_B)………………
执行
em = $game_map.events[id].enemy
z = $game_map.events[id]
  sk = $data_skills[$skill['a']]
  em.skill_effect($game_party.actors[0],sk)
  z.damage = em.damage
  z.critical = em.critical
  z.damage_pop = true
  kk = $game_party.actors[0].sp
  $game_party.actors[0].sp = kk - 15
#$skill是存放按键对应的招式的hash
退出循环
判断$game_map.events[id].enemy.hp <= 0
刮掉
否则
if rand(3) == 2
  ev = $game_map.events[@event_id]
  action = ev.enemy.make_action
  case ev.enemy.current_action.kind
  when 0
    command_356
  when 1
    command_357(current_action.skill_id)
  end
end
#bug一只——敌人不会用特技
退出判断
退出判断
外挂代码:
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================
  4. #
  5. # 使用方法:
  6. #
  7. # ★、对角色显示伤害,如下3步:
  8. #
  9. # 1、设置伤害内容:$game_player.damage = 数值
  10. #    注意:如果数值是负数,就变成补血的颜色了。
  11. #
  12. # 2、设置是否会心一击:$game_player.critical = true/false
  13. #    如果不是会心一击,就不用这一步了
  14. #
  15. # 3、释放伤害:$game_player.damage_pop = true
  16. #
  17. #
  18. # ★、对普通NPC和事件进行伤害,类似的3步:
  19. #
  20. # 1、设置伤害内容:$game_map.events[事件编号].damage = 数值
  21. #
  22. # 2、设置是否会心一击:$game_map.events[事件编号].critical = true/false
  23. #
  24. # 3、释放伤害:$game_map.events[事件编号].damage_pop = true
  25. #
  26. # 注意,事件编号是事件的ID号,如果目标是“本事件”,那么在事件编号输入@event_id
  27. #
  28. #------------------------------------------------------------------------------
  29. # 预祝有人能早日做出华丽的ARPG来,别忘了到网站发布哦~
  30. #------------------------------------------------------------------------------
  31. class Sprite_Character < RPG::Sprite
  32.   alias carol3_66RPG_damage_pop_update update
  33.   def update
  34.     carol3_66RPG_damage_pop_update
  35.     if @character.damage_pop
  36.       damage(@character.damage, @character.critical)
  37.       @character.damage = nil
  38.       @character.critical = false
  39.       @character.damage_pop = false
  40.     end
  41.   end  
  42. end
  43. class Game_Character
  44.   attr_accessor :damage_pop
  45.   attr_accessor :damage
  46.   attr_accessor :critical
  47.   alias carol3_66RPG_damage_pop_initialize initialize
  48.   def initialize
  49.     @damage_pop = false
  50.     @damage = 0
  51.     @critical = false
  52.     carol3_66RPG_damage_pop_initialize
  53.   end
  54. end

  55. #==============================================================================
  56. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  57. #==============================================================================
  58.   #==========================================================================
  59.   # 以下是全键盘按键列表
  60.   #--------------------------------------------------------------------------
  61.   $Rmouse_BUTTON_L = 0x01        # left mouse button
  62.   $Rmouse_BUTTON_R = 0x02        # right mouse button
  63.   $Rmouse_BUTTON_M = 0x04        # middle mouse button
  64.   $Rmouse_BUTTON_4 = 0x05        # 4th mouse button
  65.   $Rmouse_BUTTON_5 = 0x06        # 5th mouse button
  66.   #--------------------------------------------------------------------------
  67.   $R_Key_BACK      = 0x08        # BACKSPACE key
  68.   $R_Key_TAB       = 0x09        # TAB key
  69.   $R_Key_RETURN    = 0x0D        # ENTER key
  70.   $R_Key_SHIFT     = 0x10        # SHIFT key
  71.   $R_Key_CTLR      = 0x11        # CTLR key
  72.   $R_Key_ALT       = 0x12        # ALT key
  73.   $R_Key_PAUSE     = 0x13        # PAUSE key
  74.   $R_Key_CAPITAL   = 0x14        # CAPS LOCK key
  75.   $R_Key_ESCAPE    = 0x1B        # ESC key
  76.   $R_Key_SPACE     = 0x20        # SPACEBAR
  77.   $R_Key_PRIOR     = 0x21        # PAGE UP key
  78.   $R_Key_NEXT      = 0x22        # PAGE DOWN key
  79.   $R_Key_END       = 0x23        # END key
  80.   $R_Key_HOME      = 0x24        # HOME key
  81.   $R_Key_LEFT      = 0x25        # LEFT ARROW key
  82.   $R_Key_UP        = 0x26        # UP ARROW key
  83.   $R_Key_RIGHT     = 0x27        # RIGHT ARROW key
  84.   $R_Key_DOWN      = 0x28        # DOWN ARROW key
  85.   $R_Key_SELECT    = 0x29        # SELECT key
  86.   $R_Key_PRINT     = 0x2A        # PRINT key
  87.   $R_Key_SNAPSHOT  = 0x2C        # PRINT SCREEN key
  88.   $R_Key_INSERT    = 0x2D        # INS key
  89.   $R_Key_DELETE    = 0x2E        # DEL key
  90.   #--------------------------------------------------------------------------
  91.   $R_Key_0         = 0x30        # 0 key
  92.   $R_Key_1         = 0x31        # 1 key
  93.   $R_Key_2         = 0x32        # 2 key
  94.   $R_Key_3         = 0x33        # 3 key
  95.   $R_Key_4         = 0x34        # 4 key
  96.   $R_Key_5         = 0x35        # 5 key
  97.   $R_Key_6         = 0x36        # 6 key
  98.   $R_Key_7         = 0x37        # 7 key
  99.   $R_Key_8         = 0x38        # 8 key
  100.   $R_Key_9         = 0x39        # 9 key
  101.   #--------------------------------------------------------------------------
  102.   $R_Key_A         = 0x41        # A key
  103.   $R_Key_B         = 0x42        # B key
  104.   $R_Key_C         = 0x43        # C key
  105.   $R_Key_D         = 0x44        # D key
  106.   $R_Key_E         = 0x45        # E key
  107.   $R_Key_F         = 0x46        # F key
  108.   $R_Key_G         = 0x47        # G key
  109.   $R_Key_H         = 0x48        # H key
  110.   $R_Key_I         = 0x49        # I key
  111.   $R_Key_J         = 0x4A        # J key
  112.   $R_Key_K         = 0x4B        # K key
  113.   $R_Key_L         = 0x4C        # L key
  114.   $R_Key_M         = 0x4D        # M key
  115.   $R_Key_N         = 0x4E        # N key
  116.   $R_Key_O         = 0x4F        # O key
  117.   $R_Key_P         = 0x50        # P key
  118.   $R_Key_Q         = 0x51        # Q key
  119.   $R_Key_R         = 0x52        # R key
  120.   $R_Key_S         = 0x53        # S key
  121.   $R_Key_T         = 0x54        # T key
  122.   $R_Key_U         = 0x55        # U key
  123.   $R_Key_V         = 0x56        # V key
  124.   $R_Key_W         = 0x57        # W key
  125.   $R_Key_X         = 0x58        # X key
  126.   $R_Key_Y         = 0x59        # Y key
  127.   $R_Key_Z         = 0x5A        # Z key
  128.   #--------------------------------------------------------------------------
  129.   $R_Key_LWIN      = 0x5B        # Left Windows key (Microsoft Natural keyboard)
  130.   $R_Key_RWIN      = 0x5C        # Right Windows key (Natural keyboard)
  131.   $R_Key_APPS      = 0x5D        # Applications key (Natural keyboard)
  132.   #--------------------------------------------------------------------------
  133.   $R_Key_NUMPAD0   = 0x60        # Numeric keypad 0 key
  134.   $R_Key_NUMPAD1   = 0x61        # Numeric keypad 1 key
  135.   $R_Key_NUMPAD2   = 0x62        # Numeric keypad 2 key
  136.   $R_Key_NUMPAD3   = 0x63        # Numeric keypad 3 key
  137.   $R_Key_NUMPAD4   = 0x64        # Numeric keypad 4 key
  138.   $R_Key_NUMPAD5   = 0x65        # Numeric keypad 5 key
  139.   $R_Key_NUMPAD6   = 0x66        # Numeric keypad 6 key
  140.   $R_Key_NUMPAD7   = 0x67        # Numeric keypad 7 key
  141.   $R_Key_NUMPAD8   = 0x68        # Numeric keypad 8 key
  142.   $R_Key_NUMPAD9  = 0x69        # Numeric keypad 9 key
  143.   $R_Key_MULTIPLY  = 0x6A        # Multiply key (*)
  144.   $R_Key_ADD       = 0x6B        # Add key (+)
  145.   $R_Key_SEPARATOR = 0x6C        # Separator key
  146.   $R_Key_SUBTRACT  = 0x6D        # Subtract key (-)
  147.   $R_Key_DECIMAL   = 0x6E        # Decimal key
  148.   $R_Key_DIVIDE    = 0x6F        # Divide key (/)
  149.   #--------------------------------------------------------------------------
  150.   $R_Key_F1        = 0x70        # F1 key
  151.   $R_Key_F2        = 0x71        # F2 key
  152.   $R_Key_F3        = 0x72        # F3 key
  153.   $R_Key_F4        = 0x73        # F4 key
  154.   $R_Key_F5        = 0x74        # F5 key
  155.   $R_Key_F6        = 0x75        # F6 key
  156.   $R_Key_F7        = 0x76        # F7 key
  157.   $R_Key_F8        = 0x77        # F8 key
  158.   $R_Key_F9        = 0x78        # F9 key
  159.   $R_Key_F10       = 0x79        # F10 key
  160.   $R_Key_F11       = 0x7A        # F11 key
  161.   $R_Key_F12       = 0x7B        # F12 key
  162.   #--------------------------------------------------------------------------
  163.   $R_Key_NUMLOCK   = 0x90        # NUM LOCK key
  164.   $R_Key_SCROLL    = 0x91        # SCROLL LOCK key
  165.   #--------------------------------------------------------------------------
  166.   $R_Key_LSHIFT    = 0xA0        # Left SHIFT key
  167.   $R_Key_RSHIFT    = 0xA1        # Right SHIFT key
  168.   $R_Key_LCONTROL  = 0xA2        # Left CONTROL key
  169.   $R_Key_RCONTROL  = 0xA3        # Right CONTROL key
  170.   $R_Key_L_ALT    = 0xA4        # Left ALT key
  171.   $R_Key_R_ALT    = 0xA5        # Right ALT key
  172.   #--------------------------------------------------------------------------
  173.   $R_Key_SEP      = 0xBC        # , key
  174.   $R_Key_DASH      = 0xBD        # - key
  175.   $R_Key_DOTT      = 0xBE        # . Key

  176. module Kboard
  177. module_function

  178. @R_Key_Hash = {}
  179. @R_Key_Repeat = {}

  180. GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  181. def press?(rkey)
  182.    return GetKeyState.call(rkey) != 0
  183. end

  184. def repeat?(rkey)
  185.    result = GetKeyState.call(rkey)
  186.    if result != 0
  187.      if @R_Key_Repeat[rkey].nil?
  188.        @R_Key_Repeat[rkey] = 0
  189.        return true
  190.      end
  191.      @R_Key_Repeat[rkey] += 1
  192.    else
  193.      @R_Key_Repeat[rkey] = nil
  194.      @R_Key_Hash[rkey] = 0
  195.    end
  196.    if !@R_Key_Repeat[rkey].nil? and @R_Key_Repeat[rkey] > 4 # 4乃准确数字
  197.      @R_Key_Repeat[rkey] = 0
  198.      return true
  199.    else
  200.      return false
  201.    end
  202. end

  203. def trigger?(rkey)
  204.    result = GetKeyState.call(rkey)
  205.    if @R_Key_Hash[rkey] == 1 and result != 0
  206.      return false
  207.    end
  208.    if result != 0
  209.      @R_Key_Hash[rkey] = 1
  210.      return true
  211.    else
  212.      @R_Key_Hash[rkey] = 0
  213.      return false
  214.    end
  215. end

  216. end# ▼▲▼ XRXS34. パノラマスクロール ▼▲▼
  217. # by ぷのくー

  218. #——————————————————————————————————————
  219. # 这是一个非常简单的脚本,只要自定义自动滚动的地图编号和绝对不滚动的地图编号
  220. # 即可实现对远景的操作。
  221. #——————————————————————————————————————

  222. #==============================================================================
  223. # 初始化的一些常量
  224. #==============================================================================
  225. class Game_Map
  226.   
  227.   # 远景横向飘移速度速度
  228.   PANORAMA_SX = -10
  229.   
  230.   # 远景纵向飘移速度速度
  231.   PANORAMA_SY = 0
  232.   
  233.   # 自动滚动远景的地图编号(编号为1、4、7、5的地图远景会自动移动)
  234.   AUTO_SCROLL_PANORAMA_IDS = [1,2,3,4,5,26]
  235. end


  236. class Spriteset_Map
  237.   
  238.   # 锁定远景的地图编号(编号为2、8、10的地图远景会锁定)
  239.   SCROLL_FREEZE_PANORAMA_IDS = []  
  240.   
  241.   #——说明:如果自动滚动和锁定都包括了某张地图,则该地图不滚动。
  242.   #——如果自动滚动和锁定都没有包括某图,则还是会使用默认效果。
  243. end

  244. #==============================================================================
  245. # ■ Game_Map
  246. #==============================================================================
  247. class Game_Map
  248.   attr_accessor :panorama_sx         
  249.   attr_accessor :panorama_sy           
  250.   attr_reader   :panorama_ox              
  251.   attr_reader   :panorama_oy           
  252.   def setup(map_id)
  253.     @map_id = map_id
  254.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  255.     tileset = $data_tilesets[@map.tileset_id]
  256.     @tileset_name = tileset.tileset_name
  257.     @autotile_names = tileset.autotile_names
  258.     @panorama_name = tileset.panorama_name
  259.     @panorama_hue = tileset.panorama_hue
  260.     @fog_name = tileset.fog_name
  261.     @fog_hue = tileset.fog_hue
  262.     @fog_opacity = tileset.fog_opacity
  263.     @fog_blend_type = tileset.fog_blend_type
  264.     @fog_zoom = tileset.fog_zoom
  265.     @fog_sx = tileset.fog_sx
  266.     @fog_sy = tileset.fog_sy
  267.     # ===================================
  268.      if AUTO_SCROLL_PANORAMA_IDS.include?(map_id)
  269.        @panorama_sx = PANORAMA_SX
  270.        @panorama_sy = PANORAMA_SY
  271.      else
  272.        @panorama_sx = 0
  273.        @panorama_sy = 0
  274.      end
  275.     # ===================================
  276.     @battleback_name = tileset.battleback_name
  277.     @passages = tileset.passages
  278.     @priorities = tileset.priorities
  279.     @terrain_tags = tileset.terrain_tags
  280.     @display_x = 0
  281.     @display_y = 0
  282.     @need_refresh = false
  283.     @events = {}
  284.     for i in @map.events.keys
  285.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  286.     end
  287.     @common_events = {}
  288.     for i in 1...$data_common_events.size
  289.       @common_events[i] = Game_CommonEvent.new(i)
  290.     end
  291.     @fog_ox = 0
  292.     @fog_oy = 0
  293.     @panorama_ox = 0
  294.     @panorama_oy = 0
  295.     @fog_tone = Tone.new(0, 0, 0, 0)
  296.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  297.     @fog_tone_duration = 0
  298.     @fog_opacity_duration = 0
  299.     @fog_opacity_target = 0
  300.     @scroll_direction = 2
  301.     @scroll_rest = 0
  302.     @scroll_speed = 4
  303.   end
  304.   def update
  305.     if $game_map.need_refresh
  306.       refresh
  307.     end
  308.     if @scroll_rest > 0
  309.       distance = 2 ** @scroll_speed
  310.       case @scroll_direction
  311.       when 2  # 下
  312.         scroll_down(distance)
  313.       when 4  # 左
  314.         scroll_left(distance)
  315.       when 6  # 右
  316.         scroll_right(distance)
  317.       when 8  # 上
  318.         scroll_up(distance)
  319.       end
  320.       @scroll_rest -= distance
  321.     end
  322.     for event in @events.values
  323.       event.update
  324.     end
  325.     for common_event in @common_events.values
  326.       common_event.update
  327.     end
  328.     @fog_ox -= @fog_sx / 8.0
  329.     @fog_oy -= @fog_sy / 8.0
  330.     # ===================================
  331.     @panorama_ox -= @panorama_sx / 8.0
  332.     @panorama_oy -= @panorama_sy / 8.0
  333.     # ===================================
  334.     if @fog_tone_duration >= 1
  335.       d = @fog_tone_duration
  336.       target = @fog_tone_target
  337.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  338.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  339.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  340.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  341.       @fog_tone_duration -= 1
  342.     end
  343.     if @fog_opacity_duration >= 1
  344.       d = @fog_opacity_duration
  345.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  346.       @fog_opacity_duration -= 1
  347.     end
  348.   end
  349. end

  350. #==============================================================================
  351. # ■ Spriteset_Map
  352. #==============================================================================
  353. class Spriteset_Map
  354.   def update
  355.     if @panorama_name != $game_map.panorama_name or
  356.        @panorama_hue != $game_map.panorama_hue
  357.       @panorama_name = $game_map.panorama_name
  358.       @panorama_hue = $game_map.panorama_hue
  359.       if @panorama.bitmap != nil
  360.         @panorama.bitmap.dispose
  361.         @panorama.bitmap = nil
  362.       end
  363.       if @panorama_name != ""
  364.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  365.       end
  366.       Graphics.frame_reset
  367.     end
  368.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  369.       @fog_name = $game_map.fog_name
  370.       @fog_hue = $game_map.fog_hue
  371.       if @fog.bitmap != nil
  372.         @fog.bitmap.dispose
  373.         @fog.bitmap = nil
  374.       end
  375.       if @fog_name != ""
  376.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  377.       end
  378.       Graphics.frame_reset
  379.     end
  380.     @tilemap.ox = $game_map.display_x / 4
  381.     @tilemap.oy = $game_map.display_y / 4
  382.     @tilemap.update
  383.     # ===================================
  384.     if SCROLL_FREEZE_PANORAMA_IDS.include?($game_map.map_id)
  385.      @panorama.ox = 0
  386.      @panorama.oy = 0
  387.     else
  388.       @panorama.ox = $game_map.display_x / 8 +$game_map.panorama_ox
  389.       @panorama.oy = $game_map.display_y / 8 +$game_map.panorama_oy
  390.     end
  391.   # ===================================
  392.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  393.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  394.     @fog.opacity = $game_map.fog_opacity
  395.     @fog.blend_type = $game_map.fog_blend_type
  396.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  397.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  398.     @fog.tone = $game_map.fog_tone
  399.     for sprite in @character_sprites
  400.       sprite.update
  401.     end
  402.     @weather.type = $game_screen.weather_type
  403.     @weather.max = $game_screen.weather_max
  404.     @weather.ox = $game_map.display_x / 4
  405.     @weather.oy = $game_map.display_y / 4
  406.     @weather.update
  407.     for sprite in @picture_sprites
  408.       sprite.update
  409.     end
  410.     @timer_sprite.update
  411.     @viewport1.tone = $game_screen.tone
  412.     @viewport1.ox = $game_screen.shake
  413.     @viewport3.color = $game_screen.flash_color
  414.     @viewport1.update
  415.     @viewport3.update
  416.   end
  417. end
复制代码
哎呀,蛋疼什么的最有爱了

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

2
 楼主| 发表于 2008-8-2 06:15:59 | 只看该作者
还有程序呢:
  1. =begin
  2. ==============================================================================

  3. 彩虹神剑(伤害分段显示)显示总伤害版 v1.0d

  4. ==============================================================================

  5. 彩虹神剑 -柳柳

  6. 6-20-2006 v1.0 -叶子
  7. 在彩虹神剑的基础上增加了显示总伤害的功能,而且总伤害的数字是弹出伤害时逐渐增加的

  8. v1.0a -叶子
  9. 修正了显示伤害和实际伤害有差别的问题
  10. 修正了miss的情况下显示miss混乱的问题
  11. 修正了对己方技能重复显示伤害的问题
  12. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  13. v1.0b -叶子
  14. 修改了总伤害数字的位置和z坐标
  15. 未修正播放目标动画第一帧时目标有时无端跳动的BUG

  16. v1.0c -柳柳
  17. ? ? ?

  18. v1.0d -柳柳
  19. 1.0d最终解决了那个闪光问题,还有最末帧伤害多次的算法

  20. 7-24-2006 v1.0e -叶子
  21. 修正全屏幕闪烁弹出伤害错误的问题
  22. 修正连续伤害不会弹出伤害的问题
  23. 仍然未修正播放目标动画第一帧时目标有时无端跳动的BUG

  24. 我鼓起很大勇气才敢动偶像们的脚本的,不知道会不会出问题啊......  -cftx
  25. 修正了总伤害显示
  26. 增加了伤害美化和HIT数显示
  27. 修正了两次音效

  28. ==============================================================================
  29. =end
  30. # 核心的说明:
  31. # damage_pop 不再附带damage()的功能,这个放到animation里面去了

  32. module RPG
  33. #--------------------------------------------------------------------------
  34. # ● 常量设定
  35. #--------------------------------------------------------------------------
  36. # 是否显示总伤害
  37. SHOW_TOTAL_DAMAGE = false
  38. # 角色受攻击时是否跳一下
  39. BATTLER_JUMP = false
  40. # 连续伤害的动画ID
  41. SLIP_DAMAGE_ANIMATION_ID = 105

  42. class Sprite < ::Sprite
  43.    #==========================================
  44.    # 修改说明:
  45.    # @flash_shake用来制作挨打时候跳跃
  46.    # @_damage    用来记录每次打击之后弹出数字
  47.    # @_total_damage 记录总伤害
  48.    # @_total_damage_duration 总伤害持续帧
  49.    #==========================================
  50.    #alias 66RPG_rainbow_initialize : initialize
  51.    
  52.    def initialize(viewport = nil)
  53.      #66RPG_rainbow_initialize(viewport)
  54.      super(viewport)
  55.      @_whiten_duration = 0
  56.      @_appear_duration = 0
  57.      @_escape_duration = 0
  58.      @_collapse_duration = 0
  59.      @_damage_duration = 0
  60.      @_animation_duration = 0
  61.      @_blink = false
  62.      # 挨打时候跳跃
  63.      @flash_shake = 0
  64.      # 伤害记录数组
  65.      @_damage = []
  66.      # 总伤害数字
  67.      @_total_damage = 0
  68.      # 总伤害持续帧
  69.      @_total_damage_duration = 0
  70.      #记录已经发生的伤害的变量★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  71.      @p_dam=0
  72.      @hits=0
  73.    end
  74. #美化的伤害处理★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  75. def damage(value, critical)
  76.       # 释放伤害,效果是伤害数字快速消失,觉得不如不消失好看......
  77.       #dispose_damage
  78.       #清除hit数
  79.       dispose_hit
  80.       # 如果伤害值是数值
  81.       if value.is_a?(Numeric)
  82.         # 绝对值转为字符串
  83.         damage_string = value.abs.to_s
  84.       else
  85.         # 转为字符串
  86.         damage_string = value.to_s
  87.       end
  88.       # 初始化位图
  89.       bitmap = Bitmap.new(162, 64)
  90.       bitmap.font.name = ["黑体","华文行楷", "宋体"]
  91.       bitmap.font.size = 32
  92.       # 伤害值是数值的情况下
  93.       if value.is_a?(Numeric)
  94.         # 分割伤害值字符串
  95.         damage_array = damage_string.scan(/./)
  96.         damage_x = 81 - damage_string.size * 9
  97.         # 伤害值为负的情况下
  98.         if value < 0
  99.           # 调用回复数字表
  100.           rect_y = 32
  101.         else
  102.           # 调用伤害数字表
  103.           rect_y = 0
  104.         end
  105.         # 循环伤害值字符串
  106.         for char in damage_array
  107.           number = char.to_i
  108.           # 显示伤害数字
  109.           bitmap.blt(damage_x, 32, RPG::Cache.picture("Damage"),
  110.           Rect.new(number * 18, rect_y, 18, 32))
  111.           # 后移一位
  112.           damage_x += 18
  113.         end
  114.       # 伤害值不是数值的情况
  115.       else
  116.         # 如果伤害值不是 Miss
  117.         unless value == "Miss"
  118.           # 系统默认描画字符串
  119.           bitmap.font.color.set(0, 0, 0)
  120.           bitmap.draw_text(-1, 27, 162, 36, damage_string, 1)
  121.           bitmap.draw_text(+1, 27, 162, 36, damage_string, 1)
  122.           bitmap.draw_text(-1, 29, 162, 36, damage_string, 1)
  123.           bitmap.draw_text(+1, 29, 162, 36, damage_string, 1)
  124.           bitmap.font.color.set(255, 255, 255)
  125.           bitmap.draw_text(0, 28, 162, 36, damage_string, 1)
  126.         # Miss 的情况下
  127.         else
  128.           # 显示未击中图画
  129.           bitmap.blt(36, 28, RPG::Cache.picture("Damage"), Rect.new(90, 64, 90, 32))
  130.         end
  131.       end
  132.       # 会心一击标志打开的情况
  133.       if critical
  134.         # 显示会心一击图画
  135.         bitmap.blt(36, 0, RPG::Cache.picture("Damage"), Rect.new(0, 64, 90, 32))
  136.       end
  137.       # 伤害值定位
  138.       @_damage_sprite = ::Sprite.new(self.viewport)
  139.       @_damage_sprite.bitmap = bitmap
  140.       @_damage_sprite.ox = 81
  141.       @_damage_sprite.oy = 20
  142.       @_damage_sprite.x = self.x
  143.       @_damage_sprite.y = self.y - self.oy / 2
  144.       @_damage_sprite.z = 3000
  145.       @_damage_duration = 40
  146.       @_damage.push([@_damage_sprite,@_damage_duration-10,0, rand(30) - 15, rand(3)])
  147.       make_total_damage(value)  

  148.     end

  149. #   ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  150. # hit数的美化描绘
  151.     def hit
  152.       @_hits_sprite.bitmap.dispose if @_hits_sprite != nil
  153.       # 如果伤害值是数值
  154.       # 转为字符串
  155.       value=@hits
  156.         hits_string = value.to_s
  157.       # 初始化位图
  158.        bitmap = Bitmap.new(320, 64)
  159.        bitmap.font.name = "Arial Black"
  160.        bitmap.font.size = 32
  161.        # 分割伤害值字符串
  162.         hits_array = hits_string.scan(/./)
  163.         hits_x = 81 - hits_string.size * 18.1
  164.           rect_y = 0
  165.         # 循环伤害值字符串
  166.         for char in hits_array
  167.           number = char.to_i
  168.           # 显示伤害数字
  169.           bitmap.blt(hits_x, 0, RPG::Cache.picture("Number"),
  170.           Rect.new(number * 36.2, rect_y, 36.2, 50))
  171.           # 后移一位
  172.           hits_x += 36.2
  173.         end
  174.         bitmap.blt(hits_x, 0, RPG::Cache.picture("HITS"),
  175.         Rect.new(0, -21, 90, 50))

  176.       # 伤害值定位
  177.       @_hits_sprite = ::Sprite.new(self.viewport)
  178.       @_hits_sprite.bitmap = bitmap
  179.       @_hits_sprite.ox = 81
  180.       @_hits_sprite.oy = 20
  181.       @_hits_sprite.x = 500
  182.       @_hits_sprite.y = 100
  183.       @_hits_sprite.z = 3000
  184.       @_hits_duration = 40
  185.     end
  186. #--------------------------------------------------------------------------
  187.    # ● 总伤害处理
  188.    #--------------------------------------------------------------------------
  189.    def make_total_damage(value)
  190.      if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE
  191.        @_total_damage += value
  192.         # 绝对值转为字符串
  193.         damage_string = @_total_damage.abs.to_s
  194.       else
  195.         return
  196.       end
  197.       # 初始化位图
  198.       bitmap = Bitmap.new(300, 150)
  199.       bitmap.font.name = "Arial Black"
  200.       bitmap.font.size = 32
  201.       # 伤害值是数值的情况下
  202.       if value.is_a?(Numeric)
  203.         # 分割伤害值字符串
  204.         damage_array = damage_string.scan(/./)
  205.         damage_x = 40 - damage_string.size * 9
  206.         # 伤害值为负的情况下
  207.         if value < 0
  208.           # 调用回复数字表
  209.           name="Number3"
  210.         else
  211.           # 调用伤害数字表
  212.           name="Number2"
  213.         end
  214.         # 循环伤害值字符串
  215.         for char in damage_array
  216.           number = char.to_i
  217.           # 显示伤害数字
  218.           bitmap.blt(damage_x, 0, RPG::Cache.picture(name),
  219.           Rect.new(number * 36.2, 0, 36.2, 50))
  220.           # 后移一位
  221.           damage_x += 36.2
  222.         end
  223.       end
  224.       
  225.       
  226.         
  227.         
  228. #     if value.is_a?(Numeric) and SHOW_TOTAL_DAMAGE
  229. #       @_total_damage += value
  230. #     else
  231. #       return
  232. #     end
  233. #     bitmap = Bitmap.new(300, 150)
  234. #     bitmap.font.name = "Arial Black"
  235. #     bitmap.font.size = 40
  236. #     bitmap.font.color.set(0, 0, 0)
  237. #     bitmap.draw_text(+2, 12+2, 160, 40, @_total_damage.abs.to_s, 1)
  238. #     if @_total_damage < 0
  239. #       bitmap.font.color.set(80, 255, 00)
  240. #    else
  241. #       bitmap.font.color.set(255, 140, 0)
  242. #     end
  243. #     bitmap.draw_text(0, 12, 160, 40, @_total_damage.abs.to_s, 1)
  244. #     bitmap.font.color.set(55, 55,255)
  245.      
  246.      
  247.      if @_total_damage_sprite.nil?
  248.        @_total_damage_sprite = ::Sprite.new(self.viewport)
  249.        @_total_damage_sprite.ox = 80
  250.        @_total_damage_sprite.oy = 20
  251.        @_total_damage_sprite.z = 3000

  252.      end
  253.      @_total_damage_sprite.bitmap = bitmap
  254.      @_total_damage_sprite.zoom_x = 0.8
  255.      @_total_damage_sprite.zoom_y = 0.8
  256.      @_total_damage_sprite.x = self.x
  257.      @_total_damage_sprite.y = self.y  - self.oy / 2 - 64
  258.      @_total_damage_sprite.z = 3001
  259.      @_total_damage_duration = 80
  260.      #hit数描绘
  261.      @hits+=1
  262.     if @_total_damage > 0
  263.       hit
  264.     end
  265.    end


  266.    def animation(animation, hit, battler_damage="", battler_critical=false)
  267.      dispose_animation      
  268.      #=======================================
  269.      # 修改:记录伤害和critical
  270.      #=======================================
  271.      @battler_damage = battler_damage
  272.      @battler_critical = battler_critical
  273.      @_animation = animation
  274.      return if @_animation == nil
  275.      @_animation_hit = hit
  276.      @_animation_duration = @_animation.frame_max
  277.      animation_name = @_animation.animation_name
  278.      animation_hue = @_animation.animation_hue
  279.      bitmap = RPG::Cache.animation(animation_name, animation_hue)
  280.      #=======================================
  281.      # 修改:计算总闪光权限值
  282.      #=======================================
  283.      for timing in @_animation.timings
  284.        quanzhong = animation_process_timing(timing, @_animation_hit,true)
  285.        @all_quanzhong += quanzhong
  286.        # 记录最后一次闪光
  287.        @_last_frame = timing.frame if quanzhong != 0
  288.      end      
  289.      if @@_reference_count.include?(bitmap)
  290.        @@_reference_count[bitmap] += 1
  291.      else
  292.        @@_reference_count[bitmap] = 1
  293.      end
  294.      #=======================================
  295.      # 修改:行动方动画不显示伤害
  296.      #=======================================
  297.      if $scene.is_a?(Scene_Battle)
  298.        if $scene.animation1_id == @battler.animation_id
  299.          @battler_damage = ""
  300.        end
  301.      end
  302.      @_animation_sprites = []
  303.      if @_animation.position != 3 or not @@_animations.include?(animation)
  304.        for i in 0..15
  305.          sprite = ::Sprite.new(self.viewport)
  306.          sprite.bitmap = bitmap
  307.          sprite.visible = false
  308.          @_animation_sprites.push(sprite)
  309.        end
  310.        unless @@_animations.include?(animation)
  311.          @@_animations.push(animation)
  312.        end
  313.      end
  314.      update_animation
  315.   end
  316.    #=======================================
  317.    # 修改:更换清除伤害的算法,以防万一
  318.    #       本内容在脚本中没有使用过
  319.    #=======================================
  320.    def dispose_damage
  321.      for damage in @_damage.reverse
  322.        damage[0].bitmap.dispose
  323.        damage[0].dispose
  324.        @_damage.delete(damage)
  325.      end
  326.      @_total_damage = 0
  327.      @_last_frame = -1
  328.      if @_total_damage_sprite != nil
  329.        @_total_damage_duration = 0
  330.        @_total_damage_sprite.bitmap.dispose
  331.        @_total_damage_sprite.dispose
  332.        @_total_damage_sprite = nil
  333.      end
  334.    end
  335.    #=======================================
  336.    # 清除hit数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  337.    #=======================================
  338.    def dispose_hit
  339.      if @_hits_sprite != nil
  340.        @_hits_sprite.bitmap.dispose
  341.        @_hits_sprite.dispose
  342.        @_hits_sprite = nil
  343.      end
  344.    end
  345.    def dispose_animation
  346.      #=======================================
  347.      # 修改:清除记录的伤害,清除权重记录
  348.      #=======================================
  349.      @battler_damage = nil
  350.      @battler_critical = nil
  351.      @all_quanzhong = 1
  352.      @_total_damage = 0
  353.      @_last_frame = -1
  354.      if @_animation_sprites != nil
  355.        sprite = @_animation_sprites[0]
  356.        if sprite != nil
  357.          @@_reference_count[sprite.bitmap] -= 1
  358.          if @@_reference_count[sprite.bitmap] == 0
  359.            sprite.bitmap.dispose
  360.          end
  361.        end
  362.        for sprite in @_animation_sprites
  363.          sprite.dispose
  364.        end
  365.        @_animation_sprites = nil
  366.        @_animation = nil
  367.      end
  368.    end
  369.    def update
  370.      super
  371.      if @_whiten_duration > 0
  372.        @_whiten_duration -= 1
  373.        self.color.alpha = 128 - (16 - @_whiten_duration) * 10
  374.      end
  375.      if @_appear_duration > 0
  376.        @_appear_duration -= 1
  377.        self.opacity = (16 - @_appear_duration) * 16
  378.      end
  379.      if @_escape_duration > 0
  380.        @_escape_duration -= 1
  381.        self.opacity = 256 - (32 - @_escape_duration) * 10
  382.      end
  383.      if @_collapse_duration > 0
  384.        @_collapse_duration -= 1
  385.        self.opacity = 256 - (48 - @_collapse_duration) * 6
  386.      end
  387.      #=======================================
  388.      # 修改:更新算法,更新弹出
  389.      #=======================================
  390.      if @_damage_duration > 0
  391.        @_damage_duration -= 1
  392.        for damage in @_damage
  393.          damage[0].x = self.x + self.viewport.rect.x -
  394.                        self.ox + self.src_rect.width / 2 +
  395.                        (40 - damage[1]) * damage[3] / 10
  396.          damage[0].y -= damage[4]+damage[1]/10
  397.          damage[0].opacity = damage[1]*20
  398.          damage[1] -= 1
  399.          if damage[1]==0
  400.            damage[0].bitmap.dispose
  401.            damage[0].dispose
  402.            @_damage.delete(damage)

  403.            next
  404.          end
  405.        end
  406.      end
  407.      #=======================================
  408.      # 添加:弹出总伤害
  409.      #=======================================
  410.      if @_total_damage_duration > 0
  411.        @_total_damage_duration -= 1
  412.        @_total_damage_sprite.y -= 1 if @_total_damage_duration % 2 == 0
  413.        if @_total_damage_sprite.zoom_x > 1.0
  414.          @_total_damage_sprite.zoom_x -= 0.05
  415.        end
  416.        if @_total_damage_sprite.zoom_y > 1.0
  417.          @_total_damage_sprite.zoom_y -= 0.05
  418.        end
  419.        @_total_damage_sprite.opacity = 256 - (24 - @_total_damage_duration) * 16
  420.        if @_total_damage_duration <= 0
  421.          dispose_hit#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  422.          @_total_damage = 0
  423.          @_total_damage_duration = 0
  424.          @_total_damage_sprite.bitmap.dispose
  425.          @_total_damage_sprite.dispose
  426.          @_total_damage_sprite = nil
  427.        end
  428.      end
  429.      #=======================================
  430.      if @_animation != nil and (Graphics.frame_count % 2 == 0)
  431.        @_animation_duration -= 1
  432.        update_animation
  433.      end
  434.      if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
  435.        update_loop_animation
  436.        @_loop_animation_index += 1
  437.        @_loop_animation_index %= @_loop_animation.frame_max
  438.      end
  439.      if @_blink
  440.        @_blink_count = (@_blink_count + 1) % 32
  441.        if @_blink_count < 16
  442.          alpha = (16 - @_blink_count) * 6
  443.        else
  444.          alpha = (@_blink_count - 16) * 6
  445.        end
  446.        self.color.set(255, 255, 255, alpha)
  447.      end
  448.      @@_animations.clear
  449.    end
  450.    def update_animation
  451.     if @_animation_duration > 0
  452.        frame_index = @_animation.frame_max - @_animation_duration
  453.        cell_data = @_animation.frames[frame_index].cell_data
  454.        position = @_animation.position
  455.        animation_set_sprites(@_animation_sprites, cell_data, position)
  456.        #=======================================
  457.        # 修改:弹出伤害,权重计算
  458.        #=======================================
  459.        for timing in @_animation.timings
  460.          if timing.frame == frame_index
  461.            t = 1.0 * animation_process_timing(timing, @_animation_hit)  
  462.                    if timing.se.name != ""
  463.           se=timing.se
  464.           Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  465.         end
  466.            #p t,"当前权重", @all_quanzhong,"总权重"
  467.            if @battler_damage.is_a?(Numeric) and t != 0
  468.              t *= @battler_damage
  469.              t /= @all_quanzhong
  470.              t = t.to_i
  471.              #在闪光不是最后一次的情况下,把这次伤害加入到已经发生的伤害中★★★★★★★★★★★★★★★★★★★★★★★★★★
  472.              if frame_index != @_last_frame
  473.              @p_dam+= t
  474.              end
  475.              #p @p_dam,"已发生伤害",@battler_damage,"总伤害"(调试用)★★★★★★★★★★★★★★★★★★★★★★★★★★
  476.              #闪光为最后一次的情况下,改变这次伤害的计算方法(总伤害-已经发生伤害)★★★★★★★★★★★★★★★★★★★★★★★★★★
  477.              if frame_index == @_last_frame
  478.                t=@battler_damage-@p_dam
  479.              end
  480.              #p t,"当前伤害",@battler_damage,"总伤害"
  481.              # 最后一次闪光的话,伤害修正
  482.              if frame_index == @_last_frame
  483.                @_total_damage = @battler_damage - t
  484.                @p_dam=0      #已经发生的伤害归0★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  485.             end
  486.              #p t,@battler_damage,@all_quanzhong
  487.              damage(t,@battler_critical)
  488.             #连击次数归0★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  489.             if frame_index == @_last_frame
  490.                       @hits=0  
  491.             end
  492.            # 防止重复播放miss
  493.            elsif !@battler_damage.is_a?(Numeric) and timing.flash_scope != 0
  494.              damage(@battler_damage,@battler_critical)
  495.            end
  496.          end
  497.        end
  498.      else
  499.        dispose_animation
  500.      end
  501.    end
  502.    #=======================================
  503.    # 修改:敌人跳跃的功能 + 添加返回数值
  504.    #=======================================
  505.     def animation_process_timing(timing, hit,dontflash=false)
  506.       if (timing.condition == 0) or
  507.          (timing.condition == 1 and hit == true) or
  508.          (timing.condition == 2 and hit == false)
  509.         case timing.flash_scope
  510.         when 1
  511.           unless dontflash
  512.             self.flash(timing.flash_color, timing.flash_duration * 2)
  513.             if @_total_damage >0
  514.               @flash_shake_switch = true
  515.               @flash_shake = 10
  516.             end
  517.           end
  518.           return timing.flash_color.alpha * timing.flash_duration
  519.         when 2
  520.           unless dontflash
  521.             if self.viewport != nil
  522.               self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  523.             end
  524.           end
  525.           return timing.flash_color.alpha * timing.flash_duration
  526.         when 3
  527.           unless dontflash
  528.             self.flash(nil, timing.flash_duration * 2)
  529.           end
  530.           return timing.flash_color.alpha * timing.flash_duration
  531.         end
  532.       end      
  533.       return 0
  534.     end   
  535. end
  536. end
复制代码
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

3
 楼主| 发表于 2008-8-2 06:16:36 | 只看该作者
太长了
  1. $ud_ok = true #上下失效
  2. $airjump = 1  #空中连跳
  3. #==============================================================================
  4. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  5. #==============================================================================

  6. # ————————————————————————————————————
  7. # 全方向ドット移動 Ver ε
  8. # 配布元・サポートURL
  9. # http://members.jcom.home.ne.jp/cogwheel/

  10. #==============================================================================
  11. # ■ Game_Player
  12. #------------------------------------------------------------------------------
  13. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  14. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  15. #==============================================================================
  16. class Game_Player < Game_Character
  17.   #--------------------------------------------------------------------------
  18.   # ● 定数
  19.   #--------------------------------------------------------------------------
  20.   UP    = 48                  # 上方向の余裕(0 < UP < 63)
  21.   DOWN  = 16                  # 下方向の余裕(0 < DOWN <63)
  22.   SIDE  = 32                  # 左右方向の余裕(0 < SIDE <63)
  23.   SLANT = false               # 移動ルートの斜め移動時、速度修正
  24.   JUMPADD = 10              
  25.   #--------------------------------------------------------------------------
  26.   # ● 公開インスタンス変数
  27.   #--------------------------------------------------------------------------
  28.   attr_reader   :event                    # イベント時移動速度
  29.   attr_accessor :move_speed               # 移動速度
  30.   #--------------------------------------------------------------------------
  31.   # ● フレーム更新
  32.   #--------------------------------------------------------------------------
  33.   alias :update_original :update
  34.   def update
  35.     # @walk:歩行速度 @dash:ダッシュ時移動速度
  36.     # @event:イベント時移動速度(0の時は、イベント時に速度変更をしない)
  37.     @JUMPMAX = $game_variables[1]
  38.     @walk  = 4
  39.     @dash  = 5
  40.     @event = 4
  41.     @dot_m = true
  42.     #ダッシュ機能。エンターキーが押されている間、移動速度を変更する。
  43.     unless moving? or $game_system.map_interpreter.running? or
  44.             @move_route_forcing or $game_temp.message_window_showing
  45.       if @walk != @dash
  46.         if Input.press?(Input::C)
  47.           if @move_speed != @dash
  48.             if $game_switches[2]
  49.             @move_speed = @dash
  50.             end
  51.           end
  52.         else
  53.           if @move_speed != @walk
  54.             @move_speed = @walk
  55.           end
  56.         end
  57.       end
  58.     end
  59.     if @revise_x == nil and @revise_y == nil
  60.       @revise_x = 0
  61.       @revise_y = 0
  62.     end
  63.     unless @dot_m
  64.       update_original
  65.       return
  66.     end
  67.     if @move_route_forcing
  68.       # ローカル変数に移動中かどうかを記憶
  69.       last_moving = moving?
  70.       # ローカル変数に座標を記憶
  71.       last_real_x = @real_x
  72.       last_real_y = @real_y
  73.       # 座標がずれている場合
  74.       if (@revise_x != 0 or @revise_y != 0) and not jumping? and @move == true
  75.         if @revise_x != @real_x - @x * 128 or @revise_y != @real_y - @y * 128
  76.           @revise_x = @real_x - @x * 128
  77.           @revise_y = @real_y - @y * 128
  78.         end
  79.         # 移動距離distance1と目標距離distance2を設定
  80.         distance1 = 2 ** @move_speed
  81.         distance2 = Math.sqrt(@revise_x ** 2 + @revise_y ** 2)
  82.         # 移動距離が目標距離を越えた場合
  83.         if distance1 > distance2
  84.           # 強制的に補正座標を零にする
  85.           @real_x = @real_x - @revise_x
  86.           @real_y = @real_y - @revise_y
  87.           @revise_x = 0
  88.           @revise_y = 0
  89.           anime_update
  90.         # 移動距離が目標距離に達しない場合
  91.         else
  92.           # 移動距離分目標距離に近づく
  93.           @real_x -= (distance1 * @revise_x / distance2).round
  94.           @real_y -= (distance1 * @revise_y / distance2).round
  95.           @revise_x = @real_x - @x * 128
  96.           @revise_y = @real_y - @y * 128
  97.           anime_update
  98.         end
  99.       else
  100.         super
  101.       end
  102.     else
  103.       @move = false
  104.       # 移動中、イベント実行中、移動ルート強制中、
  105.       # メッセージウィンドウ表示中のいずれでもない場合
  106.       unless moving? or $game_system.map_interpreter.running? or
  107.              @move_route_forcing or $game_temp.message_window_showing
  108.         @event_run = false
  109.         # 方向ボタンが押されていれば、その方向へプレイヤーを移動
  110. #---------------------------上下失效-----------------------------------------
  111.       case Input.dir8
  112.         when 1
  113.           $ud_ok ? move_lower_left_p : move_left_p
  114.         when 2
  115. #          $ud_ok ? move_down_p : move_down_aaaagq
  116.           move_down_p if $ud_ok
  117.         when 3
  118.          $ud_ok ? move_lower_right_p : move_right_p
  119.         when 4
  120.           move_left_p
  121.         when 6
  122.           move_right_p
  123.         when 7
  124.          $ud_ok ? move_upper_left_p : move_left_p
  125.         when 8
  126. #         $ud_ok ? move_up_p : move_up_aaaagq
  127.          move_up_p if $ud_ok
  128.         when 9
  129.          $ud_ok ? move_upper_right_p : move_right_p
  130.         end
  131.       end
  132.       # ローカル変数に座標を記憶
  133.       last_real_x = @real_x
  134.       last_real_y = @real_y
  135.       # 移動処理
  136.       @real_x = @x * 128 + @revise_x
  137.       @real_y = @y * 128 + @revise_y
  138.       # ローカル変数に移動中かどうかを記憶
  139.       last_moving = moving?
  140.       # 座標更新
  141.       move_on
  142.       # 現在の座標と以前の座標が異なる場合
  143.       if (last_real_x != @real_x or last_real_y != @real_y)
  144.         @move_distance = 0 if @move_distance == nil
  145.         @move_distance += Math.sqrt((last_real_x - @real_x) ** 2 +
  146.                                       (last_real_y - @real_y) ** 2)
  147.         if @move_distance >= 128
  148.           @move_distance %= 128
  149.           increase_steps
  150.         end
  151.         # アニメーションを更新
  152.         anime_update
  153.       else
  154.         @pattern = 0
  155.       end
  156.     end
  157.     # キャラクターが下に移動し、かつ画面上の位置が中央より下の場合
  158.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  159.       # マップを下にスクロール
  160.       $game_map.scroll_down(@real_y - last_real_y)
  161.     end
  162.     # キャラクターが左に移動し、かつ画面上の位置が中央より左の場合
  163.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  164.       # マップを左にスクロール
  165.       $game_map.scroll_left(last_real_x - @real_x)
  166.     end
  167.     # キャラクターが右に移動し、かつ画面上の位置が中央より右の場合
  168.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  169.       # マップを右にスクロール
  170.       $game_map.scroll_right(@real_x - last_real_x)
  171.     end
  172.     # キャラクターが上に移動し、かつ画面上の位置が中央より上の場合
  173.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  174.       # マップを上にスクロール
  175.       $game_map.scroll_up(last_real_y - @real_y)
  176.     end
  177.     # 前回プレイヤーが移動中だった場合
  178.     if last_moving
  179.       # 同位置のイベントとの接触によるイベント起動判定
  180.       result = check_event_trigger_here([1,2])
  181.       if result == true
  182.         if (last_real_x / 128.0).round != @x and
  183.             (last_real_y / 128.0).round != @y
  184.           if @direction == 2 or @direction == 8
  185.             if (last_real_x / 128.0).round > @x
  186.               turn_left
  187.             else
  188.               turn_right
  189.             end
  190.           else
  191.             if (last_real_y / 128.0).round > @y
  192.               turn_up
  193.             else
  194.               turn_down
  195.             end
  196.           end
  197.         elsif (last_real_x / 128.0).round > @x
  198.           turn_left
  199.         elsif (last_real_x / 128.0).round < @x
  200.           turn_right
  201.         elsif (last_real_y / 128.0).round > @y
  202.           turn_up
  203.         elsif (last_real_y / 128.0).round < @y
  204.           turn_down
  205.         end
  206.       end
  207.       # 起動したイベントがない場合
  208.       if result == false
  209.         # デバッグモードが ON かつ CTRL キーが押されている場合を除き
  210.         unless $DEBUG and Input.press?(Input::CTRL)
  211.           # エンカウント カウントダウン
  212.           if @encounter_count > 0
  213.             @encounter_count -= 1
  214.           end
  215.         end
  216.       end
  217.     end
  218. #-----------------------按跳跃-----------------------------------------------
  219. # A ボタンが押された場合
  220.     if Input.press?(Input::A) and not $ud_ok   
  221.       @twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
  222.           ((@y * 128 + @revise_y) / 128.0).round, 5, true)
  223.       if (not @apassed) and @twojump <= $airjump
  224.         Audio.se_play("Audio/SE/016-Jump02")
  225.         @apassed = true
  226.         @jumpnow = @JUMPMAX
  227.         @twojump += 1
  228.       else
  229.         @jumpnow += 3        
  230.       end
  231.     else
  232.       @apassed = false
  233.     end
  234. #----------------------自由落体--------------------------------
  235.     if not $ud_ok
  236.       @jumpnow -= 10
  237.       if @jumpnow < 0
  238.         @jumpnow = [@jumpnow, -@JUMPMAX].max
  239.         if not down1(((@x * 128 + @revise_x) / 128.0).round,
  240.           ((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
  241.           @jumpnow = 0
  242.           @twojump = 0
  243.         end
  244.       elsif @jumpnow > 0
  245.         @jumpnow = [@jumpnow, @JUMPMAX].min
  246.         if not up1(((@x * 128 + @revise_x) / 128.0).round,
  247.           ((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
  248.           @jumpnow = 0
  249.         end
  250.       end
  251.     end
  252.     if Input.trigger?(Input::C)
  253.       # 同位置および正面のイベント起動判定
  254.       check_event_trigger_here([0])
  255.       check_event_trigger_there([0,1,2])
  256.     end
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ● オブジェクト初期化
  260.   #--------------------------------------------------------------------------
  261.   def initialize
  262.     @jumpnow = 0
  263.     @twojump = 0
  264.     @apassed = false
  265.     @revise_x = 0
  266.     @revise_y = 0
  267.     @move == false
  268.     super
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   # ● 移動判定
  272.   #--------------------------------------------------------------------------
  273.   def moving?
  274.     unless @dot_m
  275.       result = super
  276.       return result
  277.     end
  278.     # 強制移動の場合オリジナルの判定をさせる
  279.     if @move_route_forcing
  280.       if @move == false
  281.         return false
  282.       end
  283.       super
  284.     # 通常時は現座標が実座標と異なる場合のみ移動中と判定
  285.     else
  286.       return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
  287.     end
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ● 移動判定
  291.   #--------------------------------------------------------------------------
  292.   def moving_a?
  293.     if @move == false
  294.       if (@move_route.list[@move_route_index].code <= 14 or
  295.           @move_route.list[@move_route_index].code == 25)
  296.         @move = true
  297.       end
  298.       return false
  299.     end
  300.     moving?
  301.   end
  302.   #--------------------------------------------------------------------------
  303.   # ● フレーム更新 (ジャンプ)
  304.   #--------------------------------------------------------------------------
  305.   def update_jump
  306.     # ジャンプカウントを 1 減らす
  307.     @jump_count -= 1
  308.     # 新しい座標を計算
  309.     @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
  310.     @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  311.     if @jump_count == 0
  312.       @revise_x = 0
  313.       @revise_y = 0
  314.     end
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # ● 移動タイプ : カスタム
  318.   #--------------------------------------------------------------------------
  319.   def move_type_custom
  320.     unless @dot_m
  321.       super
  322.       return
  323.     end
  324.     # 停止中でなければ中断
  325.     if jumping? or moving_a?
  326.       return
  327.     end
  328.     # 移動コマンドのリストの最後に到達するまでループ
  329.     while @move_route_index < @move_route.list.size
  330.       # 移動コマンドを取得
  331.       command = @move_route.list[@move_route_index]
  332.       # コマンドコード 0 番 (リストの最後) の場合
  333.       if command.code == 0
  334.         # オプション [動作を繰り返す] が ON の場合
  335.         if @move_route.repeat
  336.           # 移動ルートのインデックスを最初に戻す
  337.           @move_route_index = 0
  338.         end
  339.         # オプション [動作を繰り返す] が OFF の場合
  340.         unless @move_route.repeat
  341.           # 移動ルート強制中の場合
  342.           if @move_route_forcing and not @move_route.repeat
  343.             # 移動ルートの強制を解除
  344.             @move_route_forcing = false
  345.             # オリジナルの移動ルートを復帰
  346.             @move_route = @original_move_route
  347.             @move_route_index = @original_move_route_index
  348.             @original_move_route = nil
  349.           end
  350.           # 停止カウントをクリア
  351.           @stop_count = 0
  352.         end
  353.         return
  354.       end
  355.       # 移動系コマンド (下に移動~ジャンプ) の場合
  356.       if command.code <= 14
  357.         # コマンドコードで分岐
  358.         case command.code
  359.         when 1  # 下に移動
  360.           move_down
  361.         when 2  # 左に移動
  362.           move_left
  363.         when 3  # 右に移動
  364.           move_right
  365.         when 4  # 上に移動
  366.           move_up
  367.         when 5  # 左下に移動
  368.           move_lower_left
  369.         when 6  # 右下に移動
  370.           move_lower_right
  371.         when 7  # 左上に移動
  372.           move_upper_left
  373.         when 8  # 右上に移動
  374.           move_upper_right
  375.         when 9  # ランダムに移動
  376.           move_random
  377.         when 10  # プレイヤーに近づく
  378.           move_toward_player
  379.         when 11  # プレイヤーから遠ざかる
  380.           move_away_from_player
  381.         when 12  # 一歩前進
  382.           move_forward
  383.         when 13  # 一歩後退
  384.           move_backward
  385.         when 14  # ジャンプ
  386.           jump(command.parameters[0], command.parameters[1])
  387.         end
  388.         # オプション [移動できない場合は無視] が OFF で、移動失敗の場合
  389.         if not @move_route.skippable and not moving? and not jumping?
  390.           return
  391.         end
  392.         @move_route_index += 1
  393.         return
  394.       end
  395.       # ウェイトの場合
  396.       if command.code == 15
  397.         # ウェイトカウントを設定
  398.         @wait_count = command.parameters[0] * 2 - 1
  399.         @move_route_index += 1
  400.         return
  401.       end
  402.       # 向き変更系のコマンドの場合
  403.       if command.code >= 16 and command.code <= 26
  404.         # コマンドコードで分岐
  405.         case command.code
  406.         when 16  # 下を向く
  407.           turn_down
  408.         when 17  # 左を向く
  409.           turn_left
  410.         when 18  # 右を向く
  411.           turn_right
  412.         when 19  # 上を向く
  413.           turn_up
  414.         when 20  # 右に 90 度回転
  415.           turn_right_90
  416.         when 21  # 左に 90 度回転
  417.           turn_left_90
  418.         when 22  # 180 度回転
  419.           turn_180
  420.         when 23  # 右か左に 90 度回転
  421.           turn_right_or_left_90
  422.         when 24  # ランダムに方向転換
  423.           turn_random
  424.         when 25  # プレイヤーの方を向く
  425.           turn_toward_player
  426.         when 26  # プレイヤーの逆を向く
  427.           turn_away_from_player
  428.         end
  429.         @move_route_index += 1
  430.         return
  431.       end
  432.       # その他のコマンドの場合
  433.       if command.code >= 27
  434.         # コマンドコードで分岐
  435.         case command.code
  436.         when 27  # スイッチ ON
  437.           $game_switches[command.parameters[0]] = true
  438.           $game_map.need_refresh = true
  439.         when 28  # スイッチ OFF
  440.           $game_switches[command.parameters[0]] = false
  441.           $game_map.need_refresh = true
  442.         when 29  # 移動速度の変更
  443.           @move_speed = command.parameters[0]
  444.         when 30  # 移動頻度の変更
  445.           @move_frequency = command.parameters[0]
  446.         when 31  # 移動時アニメ ON
  447.           @walk_anime = true
  448.         when 32  # 移動時アニメ OFF
  449.           @walk_anime = false
  450.         when 33  # 停止時アニメ ON
  451.           @step_anime = true
  452.         when 34  # 停止時アニメ OFF
  453.           @step_anime = false
  454.         when 35  # 向き固定 ON
  455.           @direction_fix = true
  456.         when 36  # 向き固定 OFF
  457.           @direction_fix = false
  458.         when 37  # すり抜け ON
  459.           @through = true
  460.         when 38  # すり抜け OFF
  461.           @through = false
  462.         when 39  # 最前面に表示 ON
  463.           @always_on_top = true
  464.         when 40  # 最前面に表示 OFF
  465.           @always_on_top = false
  466.         when 41  # グラフィック変更
  467.           @tile_id = 0
  468.           @character_name = command.parameters[0]
  469.           @character_hue = command.parameters[1]
  470.           if @original_direction != command.parameters[2]
  471.             @direction = command.parameters[2]
  472.             @original_direction = @direction
  473.             @prelock_direction = 0
  474.           end
  475.           if @original_pattern != command.parameters[3]
  476.             @pattern = command.parameters[3]
  477.             @original_pattern = @pattern
  478.           end
  479.         when 42  # 不透明度の変更
  480.           @opacity = command.parameters[0]
  481.         when 43  # 合成方法の変更
  482.           @blend_type = command.parameters[0]
  483.         when 44  # SE の演奏
  484.           $game_system.se_play(command.parameters[0])
  485.         when 45  # スクリプト
  486.           result = eval(command.parameters[0])
  487.         end
  488.         @move_route_index += 1
  489.         return
  490.       end
  491.     end
  492.   end
  493.   #--------------------------------------------------------------------------
  494.   # ● 下に移動
  495.   #--------------------------------------------------------------------------
  496.   def move_down_p
  497.     # 下を向く
  498.     turn_down
  499.     # 移動距離を算出
  500.     distance = 2 ** @move_speed
  501.     down1(((@x * 128 + @revise_x) / 128.0).round,
  502.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  503.   end
  504.   def move_down_aaaagq
  505.     distance = 2 ** @move_speed
  506.     down1(((@x * 128 + @revise_x) / 128.0).round,
  507.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  508.   end
  509.   #--------------------------------------------------------------------------
  510.   # ● 下に移動可能かどうかの判定1
  511.   #--------------------------------------------------------------------------
  512.   def down1(x, y, distance, down = false)
  513.     result = down2(x, y, distance)
  514.     if result == false
  515.       @event_run = check_event_trigger_touch(x, y+1)
  516.       return result
  517.     end
  518.     if @revise_x < -SIDE
  519.       result = down2(x, y + 1, distance, 4)
  520.       result &= down2(x - 1, y, distance)
  521.       if result == false
  522.         if down
  523.           move_lower_right_p
  524.           if @revise_x > SIDE
  525.             @revise_x = SIDE
  526.           end
  527.         end
  528.         return result
  529.       end
  530.     elsif @revise_x > SIDE
  531.       result = down2(x, y + 1, distance, 6)
  532.       result &= down2(x + 1, y, distance)
  533.       if result == false
  534.         if down
  535.           move_lower_left_p
  536.           if @revise_x < -SIDE
  537.             @revise_x = -SIDE
  538.           end
  539.         end
  540.         return result
  541.       end
  542.     end
  543.     # 下に移動可能ならば距離分移動
  544.     @revise_y += distance
  545.     return result
  546.   end
  547.   #--------------------------------------------------------------------------
  548.   # ● 下に移動可能かどうかの判定2
  549.   #--------------------------------------------------------------------------
  550.   def down2(x, y, distance, d = 2)
  551.     if @revise_y + distance > DOWN
  552.       unless passable?(x, y, d)
  553.         if @revise_y < DOWN
  554.           @revise_y = DOWN
  555.         end
  556.         return false
  557.       end
  558.     end
  559.     return true
  560.   end
  561.   #--------------------------------------------------------------------------
  562.   # ● 左に移動
  563.   #--------------------------------------------------------------------------
  564.   def move_left_p
  565.     # 左を向く
  566.     turn_left
  567.     distance = 2 ** @move_speed
  568.     left1(((@x * 128 + @revise_x) / 128.0).round,
  569.           ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  570.   end
  571.   #--------------------------------------------------------------------------
  572.   # ● 左に移動可能かどうかの判定1
  573.   #--------------------------------------------------------------------------
  574.   def left1(x, y, distance, left = false)
  575.     result = left2(x, y, distance)
  576.     if result == false
  577.       @event_run = check_event_trigger_touch(x-1, y)
  578.       return result
  579.     end
  580.     if @revise_y < -UP and $ud_ok
  581.       result = left2(x - 1, y, distance, 8)
  582.       result &= left2(x, y - 1, distance)

复制代码
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

4
 楼主| 发表于 2008-8-2 06:17:15 | 只看该作者
next
这个可以做出比较美观的ARPG了
带ACT风~~
  1.       if result == false
  2.         if left
  3.           move_lower_left_p
  4.           if @revise_y > DOWN
  5.             @revise_y = DOWN
  6.           end
  7.         end
  8.         return result
  9.       end
  10.     elsif @revise_y > DOWN and $ud_ok
  11.       result = left2(x - 1, y, distance, 2)
  12.       result &= left2(x, y + 1, distance)
  13.       if result == false
  14.         if left
  15.           move_upper_left_p
  16.           if @revise_y < -UP
  17.             @revise_y = -UP
  18.           end
  19.         end
  20.         return result
  21.       end
  22.     end
  23.     @revise_x -= distance
  24.     return result
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 左に移動可能かどうかの判定2
  28.   #--------------------------------------------------------------------------
  29.   def left2(x, y, distance, d = 4)
  30.     if @revise_x - distance < -SIDE
  31.       unless passable?(x, y, d)
  32.         if @revise_x > -SIDE
  33.           @revise_x = -SIDE
  34.         end
  35.         return false
  36.       end
  37.     end
  38.     return true
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 右に移動
  42.   #--------------------------------------------------------------------------
  43.   def move_right_p
  44.       # 右を向く
  45.       turn_right
  46.     distance = 2 ** @move_speed
  47.     right1(((@x * 128 + @revise_x) / 128.0).round,
  48.             ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ● 右に移動可能かどうかの判定1
  52.   #--------------------------------------------------------------------------
  53.   def right1(x, y, distance, right = false)
  54.     result = right2(x, y, distance)
  55.     if result == false
  56.       @event_run = check_event_trigger_touch(x+1, y)
  57.       return result
  58.     end
  59.     if @revise_y < -UP and $ud_ok
  60.       result = right2(x + 1, y, distance, 8)
  61.       result &= right2(x, y - 1, distance)
  62.       if result == false
  63.         if right
  64.           move_lower_right_p
  65.           if @revise_y > DOWN
  66.             @revise_y = DOWN
  67.           end
  68.         end
  69.         return result
  70.       end
  71.     elsif @revise_y > DOWN and $ud_ok
  72.       result = right2(x + 1, y, distance, 2)
  73.       result &= right2(x, y + 1, distance)
  74.       if result == false
  75.         if right
  76.           move_upper_right_p
  77.           if @revise_y < -UP
  78.             @revise_y = -UP
  79.           end
  80.         end
  81.         return result
  82.       end
  83.     end
  84.     @revise_x += distance
  85.     return result
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ● 右に移動可能かどうかの判定2
  89.   #--------------------------------------------------------------------------
  90.   def right2(x, y, distance, d = 6)
  91.     if @revise_x + distance > SIDE
  92.       unless passable?(x, y, d)
  93.         if @revise_x < SIDE
  94.           @revise_x = SIDE
  95.         end
  96.         return false
  97.       end
  98.     end
  99.     return true
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ● 上に移動
  103.   #--------------------------------------------------------------------------
  104.   def move_up_p
  105.     # 上を向く
  106.     turn_up
  107.     # 下に移動
  108.     distance = 2 ** @move_speed
  109.     up1(((@x * 128 + @revise_x) / 128.0).round,
  110.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  111.   end
  112.   def move_up_aaaagq
  113.     distance = 2 ** @move_speed
  114.     up1(((@x * 128 + @revise_x) / 128.0).round,
  115.         ((@y * 128 + @revise_y) / 128.0).round, distance, true)
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 上に移動可能かどうかの判定1
  119.   #--------------------------------------------------------------------------
  120.   def up1(x, y, distance, up = false)
  121.     result = up2(x, y, distance)
  122.     if result == false
  123.       @event_run = check_event_trigger_touch(x, y-1)
  124.       return result
  125.     end
  126.     if @revise_x < -SIDE
  127.       result = up2(x, y - 1, distance, 4)
  128.       result &= up2(x - 1, y, distance)
  129.       if result == false
  130.         if up
  131.           move_upper_right_p
  132.           if @revise_x > SIDE
  133.             @revise_x = SIDE
  134.           end
  135.         end
  136.         return result
  137.       end
  138.     elsif @revise_x > SIDE
  139.       result = up2(x, y - 1, distance, 6)
  140.       result &= up2(x + 1, y, distance)
  141.       if result == false
  142.         if up
  143.           move_upper_left_p
  144.           if @revise_x < -SIDE
  145.             @revise_x = -SIDE
  146.           end
  147.         end
  148.         return result
  149.       end
  150.     end
  151.     @revise_y -= distance
  152.     return result
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 上に移動可能かどうかの判定2
  156.   #--------------------------------------------------------------------------
  157.   def up2(x, y, distance, d = 8)
  158.     if @revise_y - distance < -UP
  159.       unless passable?(x, y, d)
  160.         if @revise_y > -UP
  161.           @revise_y = -UP
  162.         end
  163.         return false
  164.       end
  165.     end
  166.     return true
  167.   end
  168.   #--------------------------------------------------------------------------
  169.   # ● 左下に移動
  170.   #--------------------------------------------------------------------------
  171.   def move_lower_left_p
  172.     # 向き固定でない場合
  173.     unless @direction_fix
  174.       # 右向きだった場合は左を、上向きだった場合は下を向く
  175.       @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
  176.     end
  177.     # 左下に移動
  178.     distance = (2 ** @move_speed) / Math.sqrt(2)
  179.     if @direction == 2
  180.       turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  181.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  182.       turn_down if @event_run
  183.       unless @event_run
  184.         if last_move?(@real_x, @real_y, 2, distance)
  185.           result = check_event_trigger_here([1,2], false)
  186.           if result == true
  187.             return
  188.           end
  189.         end
  190.         move_on
  191.         if @revise_y > DOWN and -UP > @revise_y - distance
  192.           @revise_y = DOWN
  193.         end
  194.         turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  195.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  196.         turn_left if @event_run
  197.       end
  198.     else
  199.       turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
  200.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  201.       turn_left if @event_run
  202.       unless @event_run
  203.         if last_move?(@real_x, @real_y, 4, distance)
  204.           result = check_event_trigger_here([1,2], false)
  205.           if result == true
  206.             return
  207.           end
  208.         end
  209.         move_on
  210.         if  @revise_x + distance> SIDE and -SIDE > @revise_x
  211.           @revise_x = -SIDE
  212.         end
  213.         turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
  214.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  215.         turn_down if @event_run
  216.       end
  217.     end
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 右下に移動
  221.   #--------------------------------------------------------------------------
  222.   def move_lower_right_p
  223.     # 向き固定でない場合
  224.     unless @direction_fix
  225.       # 左向きだった場合は右を、上向きだった場合は下を向く
  226.       @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
  227.     end
  228.     # 右下に移動
  229.     distance = (2 ** @move_speed) / Math.sqrt(2)
  230.     if @direction == 2
  231.       turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  232.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  233.       turn_down if @event_run
  234.       unless @event_run
  235.         if last_move?(@real_x, @real_y, 2, distance)
  236.           result = check_event_trigger_here([1,2], false)
  237.           if result == true
  238.             return
  239.           end
  240.         end
  241.         move_on
  242.         if @revise_y > DOWN and -UP > @revise_y - distance
  243.           @revise_y = DOWN
  244.         end
  245.         turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  246.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  247.         turn_right if @event_run
  248.       end
  249.     else
  250.       turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
  251.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  252.       turn_right if @event_run
  253.       unless @event_run
  254.         if last_move?(@real_x, @real_y, 6, distance)
  255.           result = check_event_trigger_here([1,2], false)
  256.           if result == true
  257.             return
  258.           end
  259.         end
  260.         move_on
  261.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  262.           @revise_x = SIDE
  263.         end
  264.         turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
  265.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  266.         turn_down if @event_run
  267.       end
  268.     end
  269.   end
  270.   #--------------------------------------------------------------------------
  271.   # ● 左上に移動
  272.   #--------------------------------------------------------------------------
  273.   def move_upper_left_p
  274.     # 向き固定でない場合
  275.     unless @direction_fix
  276.       # 右向きだった場合は左を、下向きだった場合は上を向く
  277.       @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
  278.     end
  279.     # 左上に移動
  280.     distance = (2 ** @move_speed) / Math.sqrt(2)
  281.     if @direction == 8
  282.       turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  283.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  284.       turn_up if @event_run
  285.       unless @event_run
  286.         if last_move?(@real_x, @real_y, 8, distance)
  287.           result = check_event_trigger_here([1,2], false)
  288.           if result == true
  289.             return
  290.           end
  291.         end
  292.         move_on
  293.         if @revise_y + distance > DOWN and -UP > @revise_y
  294.           @revise_y = -UP
  295.         end
  296.         turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  297.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  298.         turn_left if @event_run
  299.       end
  300.     else
  301.       turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
  302.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  303.       turn_left if @event_run
  304.       unless @event_run
  305.         if last_move?(@real_x, @real_y, 4, distance)
  306.           result = check_event_trigger_here([1,2], false)
  307.           if result == true
  308.             return
  309.           end
  310.         end
  311.         move_on
  312.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  313.           @revise_x = SIDE
  314.         end
  315.         turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
  316.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  317.         turn_up if @event_run
  318.       end
  319.     end
  320.   end
  321.   #--------------------------------------------------------------------------
  322.   # ● 右上に移動
  323.   #--------------------------------------------------------------------------
  324.   def move_upper_right_p
  325.     # 向き固定でない場合
  326.     unless @direction_fix
  327.       # 左向きだった場合は右を、下向きだった場合は上を向く
  328.       @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
  329.     end
  330.     # 右上に移動
  331.     distance = (2 ** @move_speed) / Math.sqrt(2)
  332.     if @direction == 8
  333.       turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  334.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  335.       turn_up if @event_run
  336.       unless @event_run
  337.         if last_move?(@real_x, @real_y, 8, distance)
  338.           result = check_event_trigger_here([1,2], false)
  339.           if result == true
  340.             return
  341.           end
  342.         end
  343.         move_on
  344.         if @revise_y + distance > DOWN and -UP > @revise_y
  345.           @revise_y = -UP
  346.         end
  347.         turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  348.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  349.         turn_right if @event_run
  350.       end
  351.     else
  352.       turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
  353.                             ((@y * 128 + @revise_y) / 128.0).round, distance)
  354.       turn_right if @event_run
  355.       unless @event_run
  356.         if last_move?(@real_x, @real_y, 6, distance)
  357.           result = check_event_trigger_here([1,2], false)
  358.           if result == true
  359.             return
  360.           end
  361.         end
  362.         move_on
  363.         if @revise_x > SIDE and -SIDE > @revise_x - distance
  364.           @revise_x = SIDE
  365.         end
  366.         turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
  367.                               ((@y * 128 + @revise_y) / 128.0).round, distance)
  368.         turn_up if @event_run
  369.       end
  370.     end
  371.   end
  372.   #--------------------------------------------------------------------------
  373.   # ● 同位置のイベント起動判定
  374.   #--------------------------------------------------------------------------
  375.   def check_event_trigger_here(triggers, run = true)
  376.     result = false
  377.     # イベント実行中の場合
  378.     if $game_system.map_interpreter.running?
  379.       return result
  380.     end
  381.     # 全イベントのループ
  382.     for event in $game_map.events.values
  383.       # イベントの座標とトリガーが一致した場合
  384.       if event.x == ((@x * 128 + @revise_x) / 128.0).round and
  385.           event.y == ((@y * 128 + @revise_y) / 128.0).round and
  386.           triggers.include?(event.trigger)
  387.         # ジャンプ中以外で、起動判定が同位置のイベントなら
  388.         if not event.jumping? and event.over_trigger?
  389.           if event.list.size > 1
  390.             if run == true
  391.               event.start
  392.             end
  393.             result = true
  394.           end
  395.         end
  396.       end
  397.     end
  398.     return result
  399.   end
  400.   #--------------------------------------------------------------------------
  401.   # ● 座標修正
  402.   #--------------------------------------------------------------------------
  403.   def move_on
  404.     if @y < (@y + @revise_y / 128.0).round
  405.       @y += 1
  406.       @revise_y -= 128
  407.     end
  408.     if @x > (@x + @revise_x / 128.0).round
  409.       @x -= 1
  410.       @revise_x += 128
  411.     end
  412.     if @x < (@x + @revise_x / 128.0).round
  413.       @x += 1
  414.       @revise_x -= 128
  415.     end
  416.     if @y > (@y + @revise_y / 128.0).round
  417.       @y -= 1
  418.       @revise_y += 128
  419.     end
  420.   end
  421.   #--------------------------------------------------------------------------
  422.   # ● アニメーションアップデート
  423.   #--------------------------------------------------------------------------
  424.   def anime_update
  425.     # 移動時アニメが ON の場合
  426.     if @walk_anime
  427.       # アニメカウントを 1.5 増やす
  428.       @anime_count += 5
  429.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  430.     elsif @step_anime
  431.       # アニメカウントを 1 増やす
  432.       @anime_count += 1
  433.     end
  434.     # アニメカウントが最大値を超えた場合
  435.     # ※最大値は、基本値 18 から移動速度 * 1 を引いた値
  436.     if @anime_count > 18 - @move_speed * 2
  437.       # 停止時アニメが OFF かつ 停止中の場合
  438.       if not @step_anime and @stop_count > 0
  439.         # パターンをオリジナルに戻す
  440.         @pattern = @original_pattern
  441.       # 停止時アニメが ON または 移動中の場合
  442.       else
  443.         # パターンを更新
  444.         @pattern = (@pattern + 1) % 9
  445.       end
  446.       # アニメカウントをクリア
  447.       @anime_count = 0
  448.     end
  449.   end
  450.   #--------------------------------------------------------------------------
  451.   # ● 指定位置に移動
  452.   #--------------------------------------------------------------------------
  453.   # オリジナルのイベントを改名
  454.   alias :moveto_original :moveto
  455.   def moveto(x, y)
  456.     # 補正座標を初期化
  457.     @revise_x = 0
  458.     @revise_y = 0
  459.     # オリジナルのイベントを呼び出し
  460.     moveto_original(x, y)
  461.   end
  462.   #--------------------------------------------------------------------------
  463.   # ● 移動したかどうかの判定
  464.   #--------------------------------------------------------------------------
  465.   def last_move?(x, y, direction, distance)
  466.     if direction == 2 or direction == 6
  467.       distance *= -1
  468.     end
  469.     if (direction == 2 or direction == 8) and
  470.         (y / 128.0).round != ((y - distance) / 128.0).round
  471.       return true
  472.     end
  473.     if (direction == 4 or direction == 6) and
  474.         (x / 128.0).round != ((x - distance) / 128.0).round
  475.       return true
  476.     end
  477.     return false
  478.   end
  479. end

  480. #==============================================================================
  481. # ■ Game_Character (分割定義 1)
  482. #------------------------------------------------------------------------------
  483. #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
  484. # クラスのスーパークラスとして使用されます。
  485. #==============================================================================

  486. class Game_Character
  487.   #--------------------------------------------------------------------------
  488.   # ● フレーム更新 (移動)
  489.   #--------------------------------------------------------------------------
  490.   def update_move
  491.     # 移動速度からマップ座標系での移動距離に変換
  492.     distance = 2 ** @move_speed
  493.     if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
  494.       distance /= Math.sqrt(2)
  495.     end
  496.     # 論理座標が実座標より下の場合
  497.     if @y * 128 > @real_y
  498.       # 下に移動
  499.       @real_y = [@real_y + distance, @y * 128].min
  500.     end
  501.     # 論理座標が実座標より左の場合
  502.     if @x * 128 < @real_x
  503.       # 左に移動
  504.       @real_x = [@real_x - distance, @x * 128].max
  505.     end
  506.     # 論理座標が実座標より右の場合
  507.     if @x * 128 > @real_x
  508.       # 右に移動
  509.       @real_x = [@real_x + distance, @x * 128].min
  510.     end
  511.     # 論理座標が実座標より上の場合
  512.     if @y * 128 < @real_y
  513.       # 上に移動
  514.       @real_y = [@real_y - distance, @y * 128].max
  515.     end
  516.     # 移動時アニメが ON の場合
  517.     if @walk_anime
  518.       # アニメカウントを 1.5 増やす
  519.       @anime_count += 1.5
  520.     # 移動時アニメが OFF で、停止時アニメが ON の場合
  521.     elsif @step_anime
  522.       # アニメカウントを 1 増やす
  523.       @anime_count += 1
  524.     end
  525.   end
  526. end

  527. #==============================================================================
  528. # ■ Game_Event
  529. #------------------------------------------------------------------------------
  530. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  531. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  532. #==============================================================================

  533. class Game_Event < Game_Character
  534.   #--------------------------------------------------------------------------
  535.   # ● イベント起動
  536.   #--------------------------------------------------------------------------
  537.   def start
  538.     # 実行内容が空でない場合
  539.     if @list.size > 1
  540.       # $game_player.event が0でない場合
  541.       if $game_player.event != 0
  542.         # 移動速度を $game_player.event にする
  543.         $game_player.move_speed = $game_player.event
  544.       end
  545.       @starting = true
  546.     end
  547.   end
  548. end

  549. #==============================================================================
  550. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  551. #==============================================================================
复制代码
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

5
发表于 2008-8-2 06:17:36 | 只看该作者
话说有了队伍为什么还要有敌人……  = =
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

6
 楼主| 发表于 2008-8-2 06:18:29 | 只看该作者
  1. #==============================================================================
  2. # ■ Game_Event
  3. #------------------------------------------------------------------------------
  4. #  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
  5. # 在 Game_Map 类的内部使用。
  6. #==============================================================================

  7. class Game_Event < Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :trigger                  # 目标
  12.   attr_reader   :list                     # 执行内容
  13.   attr_reader   :starting                 # 启动中标志
  14.   attr_accessor :enemy                    # 敌人
  15.   attr_reader   :name
  16.   #--------------------------------------------------------------------------
  17.   # ● 初始化对像
  18.   #     map_id : 地图 ID
  19.   #     event  : 事件 (RPG::Event)
  20.   #--------------------------------------------------------------------------
  21.   def initialize(map_id, event)
  22.     super()
  23.     @map_id = map_id
  24.     @event = event
  25.     @id = @event.id
  26.     @erased = false
  27.     @starting = false
  28.     @through = true
  29.     @name = @event.name
  30.     # 初期位置的移动
  31.     moveto(@event.x, @event.y)
  32.     if @event.name.split(/,/)[0] == "敌人"
  33.       a = @event.name.split(/,/)[1].to_i
  34.       a = 1 if a.to_s == ""
  35.       @enemy = Game_Enemy.new(a,0)
  36.     end
  37.     refresh
  38.   end
  39. end
复制代码
  1. #==============================================================================
  2. # ■ Sprite_Character
  3. #------------------------------------------------------------------------------
  4. #  角色显示用脚本。监视 Game_Character 类的实例、
  5. # 自动变化脚本状态。
  6. #==============================================================================

  7. class Sprite_Character < RPG::Sprite
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :character                # 角色
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始化对像
  14.   #     viewport  : 查看端口
  15.   #     character : 角色 (Game_Character)
  16.   #--------------------------------------------------------------------------
  17.   def initialize(viewport, character = nil)
  18.     super(viewport)
  19.     @character = character
  20.     if @character.is_a?(Game_Event)
  21.       if @character.name.split(/,/)[0] == "敌人"
  22.         @sp = Sprite.new
  23.         @sp.bitmap = Bitmap.new(128,32)
  24.         @sp.bitmap.draw_text(@sp.bitmap.text_size(@character.enemy.hp.to_s),@character.enemy.hp.to_s)
  25.       end
  26.     end
  27.     update
  28.   end
  29.   def dispose
  30.     if @character.is_a?(Game_Event)
  31.       if @character.name.split(/,/)[0] == "敌人"
  32.         @sp.bitmap.dispose
  33.         @sp.dispose
  34.       end
  35.     end
  36.     super
  37.   end  #--------------------------------------------------------------------------
  38.   # ● 更新画面
  39.   #--------------------------------------------------------------------------
  40.   def update
  41.     super
  42.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  43.     if @tile_id != @character.tile_id or
  44.        @character_name != @character.character_name or
  45.        @character_hue != @character.character_hue
  46.       # 记忆元件 ID 与文件名、色相
  47.       @tile_id = @character.tile_id
  48.       @character_name = @character.character_name
  49.       @character_hue = @character.character_hue
  50.       # 元件 ID 为有效值的情况下
  51.       if @tile_id >= 384
  52.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  53.           @tile_id, @character.character_hue)
  54.         self.src_rect.set(0, 0, 32, 32)
  55.         self.ox = 16
  56.         self.oy = 32
  57.       # 元件 ID 为无效值的情况下
  58.       else
  59.         self.bitmap = RPG::Cache.character(@character.character_name,
  60.           @character.character_hue)
  61.         @cw = bitmap.width / 9
  62.         @ch = bitmap.height / 4
  63.         self.ox = @cw / 2
  64.         self.oy = @ch
  65.       end
  66.     end
  67.     # 设置可视状态
  68.     self.visible = (not @character.transparent)
  69.     # 图形是角色的情况下
  70.     if @tile_id == 0
  71.       # 设置传送目标的矩形
  72.       sx = @character.pattern * @cw
  73.       sy = (@character.direction - 2) / 2 * @ch
  74.       self.src_rect.set(sx, sy, @cw, @ch)
  75.     end
  76.     # 设置脚本的坐标
  77.     self.x = @character.screen_x
  78.     self.y = @character.screen_y
  79.     self.z = @character.screen_z(@ch)
  80.     if @character.is_a?(Game_Event)
  81.       if @character.name.split(/,/)[0] == "敌人"
  82.         @sp.bitmap = Bitmap.new(128,32)
  83.         @sp.bitmap.draw_text(@sp.bitmap.text_size(@character.enemy.hp.to_s),@character.enemy.hp.to_s)
  84.         @sp.x = self.x
  85.         @sp.y = self.y-32
  86.         @sp.z = self.z+1
  87.       end
  88.     end
  89.     # 设置不透明度、合成方式、茂密
  90.     self.opacity = @character.opacity
  91.     self.blend_type = @character.blend_type
  92.     self.bush_depth = @character.bush_depth
  93.     # 动画
  94.     if @character.animation_id != []
  95.       for j in @character.animation_id
  96.       animation = $data_animations[j]
  97.       animation(animation, true)
  98.       end
  99.       @character.animation_id = []
  100.     end
  101.   end
  102. end
复制代码

基本就这些了
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

7
 楼主| 发表于 2008-8-2 06:19:00 | 只看该作者
以下引用越前リョーマ于2008-8-1 22:17:36的发言:

话说有了队伍为什么还要有敌人……  = =

就是中文:“敌人”
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

8
发表于 2008-8-2 06:19:09 | 只看该作者
看着这么多还真复杂…… = =
做个范例包吧……
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

9
 楼主| 发表于 2008-8-2 06:20:29 | 只看该作者
以下引用越前リョーマ于2008-8-1 22:19:09的发言:

看着这么多还真复杂…… = =
做个范例包吧……

范例本来是有的。但是不见了
主程序在最后,很少。但是美化上下了一定功夫。挂进来的脚本精简了最有用的。。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

10
 楼主| 发表于 2008-8-2 06:21:40 | 只看该作者
因为攻击范围是左右各两格,如果不是做act没效果。下一步是远程攻击
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 14:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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