Project1

标题: 请问下怎么能设置一个NPC站在原地并且还有动作? [打印本页]

作者: fyldgp    时间: 2014-5-24 17:10
标题: 请问下怎么能设置一个NPC站在原地并且还有动作?
NPC图片素材已有,比如做一个可以动态扇扇子的NPC商人(各个帧的图片已经有),问题是怎么把这些图片整合起来,使其原地站着就可以做出动画效果呢?

用行走图显然是不行的啊。。。
作者: 573932914    时间: 2014-5-24 17:42
请问能不能说详细点。。。
作者: 日月星辰    时间: 2014-5-24 17:49
本帖最后由 日月星辰 于 2014-5-24 18:11 编辑

待机图片…手机码字暂时不能帮你找  你可以试着自己搜索

@︶ㄣ牛排ぶ
[line]1[/line]
这个,,行走图用 _w作为待机动画后缀

RUBY 代码复制
  1. #==============================================================================
  2. # 本脚本来自[url]www.66rpg.com[/url],转载和使用请保留此信息
  3. #==============================================================================
  4.  
  5. #==============================================================================
  6. # ■ Game_Character (分割定义 1)
  7. #------------------------------------------------------------------------------
  8. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  9. # 类的超级类使用。
  10. #==============================================================================
  11.  
  12. class Game_Character
  13. attr_accessor :time
  14. #--------------------------------------------------------------------------
  15. # ● 初始化对像
  16. #--------------------------------------------------------------------------
  17. alias old_ini initialize
  18. def initialize
  19.    old_ini
  20.    [url=home.php?mod=space&uid=134219]@Time[/url] = 0
  21. end
  22. end
  23.  
  24. #==============================================================================
  25. # ■ Game_Player
  26. #------------------------------------------------------------------------------
  27. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  28. # 本类的实例请参考 $game_player。
  29. #==============================================================================
  30.  
  31. class Game_Player < Game_Character
  32. TIME_LIMIT = 200  # 抓耳挠腮前的等待时间 (好象也不是帧…不知道是什么单位了)
  33. #--------------------------------------------------------------------------
  34. # ● 画面更新
  35. #--------------------------------------------------------------------------
  36. def update
  37.    # 本地变量记录移动信息
  38.    last_moving = moving?
  39.    if @time == TIME_LIMIT
  40.      @character_name = @character_name + "_W"
  41.      @scratch = true
  42.      @step_anime = true
  43.      @time = TIME_LIMIT + 1
  44.    elsif @time < TIME_LIMIT
  45.      @scratch = false
  46.      @step_anime = false
  47.    end
  48.    if @scratch == false
  49.      @old_pic = @character_name
  50.    end
  51.    # 移动中、事件执行中、强制移动路线中、
  52.    # 信息窗口一个也不显示的时候
  53.    unless moving? or $game_system.map_interpreter.running? or
  54.           @move_route_forcing or $game_temp.message_window_showing
  55.      # 如果方向键被按下、主角就朝那个方向移动
  56.      case Input.dir4
  57.      when 2
  58.        move_down
  59.        @time = 0
  60.        @scratch = false
  61.        @character_name = @old_pic
  62.      when 4
  63.        move_left
  64.        @time = 0
  65.        @scratch = false
  66.        @character_name = @old_pic
  67.      when 6
  68.        move_right
  69.        @time = 0
  70.        @scratch = false
  71.        @character_name = @old_pic
  72.      when 8
  73.        move_up
  74.        @time = 0
  75.        @scratch = false
  76.        @character_name = @old_pic
  77.      end
  78.    end
  79.    # 本地变量记忆坐标
  80.    last_real_x = @real_x
  81.    last_real_y = @real_y
  82.    super
  83.    # 角色向下移动、画面上的位置在中央下方的情况下
  84.    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  85.      # 画面向下卷动
  86.      $game_map.scroll_down(@real_y - last_real_y)
  87.    end
  88.    # 角色向左移动、画面上的位置在中央左方的情况下
  89.    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  90.      # 画面向左卷动
  91.      $game_map.scroll_left(last_real_x - @real_x)
  92.    end
  93.    # 角色向右移动、画面上的位置在中央右方的情况下
  94.    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  95.      # 画面向右卷动
  96.      $game_map.scroll_right(@real_x - last_real_x)
  97.    end
  98.    # 角色向上移动、画面上的位置在中央上方的情况下
  99.    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  100.      # 画面向上卷动
  101.      $game_map.scroll_up(last_real_y - @real_y)
  102.    end
  103.    # 不在移动中的情况下
  104.    unless moving?
  105.      @time += 1 if @time < TIME_LIMIT
  106.      # 上次主角移动中的情况
  107.      if last_moving
  108.        # 与同位置的事件接触就判定为事件启动
  109.        result = check_event_trigger_here([1,2])
  110.        # 没有可以启动的事件的情况下
  111.        if result == false
  112.          # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  113.          unless $DEBUG and Input.press?(Input::CTRL)
  114.            # 遇敌计数下降
  115.            if @encounter_count > 0
  116.              @encounter_count -= 1
  117.            end
  118.          end
  119.        end
  120.      end
  121.      # 按下 C 键的情况下
  122.      if Input.trigger?(Input::C)
  123.        # 判定为同位置以及正面的事件启动
  124.        check_event_trigger_here([0])
  125.        check_event_trigger_there([0,1,2])
  126.      end
  127.    end
  128. end
  129. end
  130.  
  131. #==============================================================================
  132. # 本脚本来自[url]www.66rpg.com[/url],转载和使用请保留此信息
  133. #==============================================================================

作者: 邪月长啸    时间: 2014-5-24 18:51
  1. =begin
  2. *******************************************************************************
  3. ===============================================================================
  4. ★ 停止时动画 ★         
  5. ---------------------------------------------------------------------------
  6.   by ->  芯☆淡茹水
  7. ===============================================================================
  8. ● 使用方法:复制该脚本,插入到 main 前。
  9. ===============================================================================
  10. ● 行走图的制作和命名:
  11.         
  12.          和默认行走图类似,只是多了四方向的停止动画。
  13.       从上到下依次为:停止动画(面向下,面向左,面向右,面向上);行走动画
  14.       (面向下,面向左,面向右,面向上)。做好的素材按上面顺序拼接好即可。
  15.       
  16.          行走图命名:拥有 停止动画 的行走图,在命名时,名字前加一个符号“$”
  17.       即可。
  18.       
  19.          名字前没有“$”符号的行走图文件,为默认行走图(基础版四方向)。
  20.          
  21.       详见范例的行走图制作和命名。
  22. ===============================================================================
  23. ● 冲突的可能:按键加速;队伍跟随。
  24. ===============================================================================
  25. =end
  26. #=============================================================================
  27. class Game_Character
  28.   #--------------------------------------------------------------------------
  29.   attr_reader   :standby                     
  30.   #---------------------------
  31.   alias add_initialize_xdrs initialize
  32.   def initialize
  33.     add_initialize_xdrs
  34.     @standby = 0
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   def update_move
  38.     if @standby > 0
  39.       if @direction <= @standby / 2
  40.         @direction = @direction + @standby / 2
  41.       end
  42.     end
  43.     # 移动速度转换为地图坐标系的移动距离
  44.     distance = 2 ** @move_speed
  45.     # 理论坐标在实际坐标下方的情况下
  46.     if @y * 128 > @real_y
  47.       # 向下移动
  48.       @real_y = [@real_y + distance, @y * 128].min
  49.     end
  50.     # 理论坐标在实际坐标左方的情况下
  51.     if @x * 128 < @real_x
  52.       # 向左移动
  53.       @real_x = [@real_x - distance, @x * 128].max
  54.     end
  55.     # 理论坐标在实际坐标右方的情况下
  56.     if @x * 128 > @real_x
  57.       # 向右移动
  58.       @real_x = [@real_x + distance, @x * 128].min
  59.     end
  60.     # 理论坐标在实际坐标上方的情况下
  61.     if @y * 128 < @real_y
  62.       # 向上移动
  63.       @real_y = [@real_y - distance, @y * 128].max
  64.     end
  65.     # 移动时动画为 ON 的情况下
  66.     if @walk_anime
  67.       # 动画计数增加 1.5
  68.       @anime_count += 1.5
  69.     # 移动时动画为 OFF、停止时动画为 ON 的情况下
  70.     elsif @step_anime
  71.       # 动画计数增加 1
  72.       @anime_count += 1
  73.     end
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   def update_stop
  77.     if @standby > 0
  78.       @direction = @direction - 8 if @direction > @standby / 2
  79.       @anime_count += 1
  80.       if @anime_count > (18 - @move_speed * 2)
  81.         @pattern = (@pattern + 1) % 4
  82.         @anime_count = 0
  83.       end
  84.     else
  85.     # 停止时动画为 ON 的情况下
  86.       if @step_anime
  87.         # 动画计数增加 1
  88.         @anime_count += 1
  89.       # 停止时动画为 OFF 并且、现在的图像与原来的不同的情况下
  90.       elsif @pattern != @original_pattern
  91.         # 动画计数增加 1.5
  92.         @anime_count += 1.5
  93.       end
  94.     end
  95.     # 事件执行待机中并且不是锁定状态的情况下
  96.     # ※锁定、处理成立刻停止执行中的事件
  97.     unless @starting or lock?
  98.       # 停止计数增加 1
  99.       @stop_count += 1
  100.     end
  101.   end
  102. end
  103. #=============================================================================
  104. class Game_Event < Game_Character
  105.   #--------------------------------------------------------------------------
  106.   def refresh
  107.     # 初始化本地变量 new_page
  108.     new_page = nil
  109.     # 无法暂时消失的情况下
  110.     unless @erased
  111.       # 从编号大的事件页按顺序调查
  112.       for page in @event.pages.reverse
  113.         # 可以参考事件条件 c
  114.         c = page.condition
  115.         # 确认开关条件 1
  116.         if c.switch1_valid
  117.           if $game_switches[c.switch1_id] == false
  118.             next
  119.           end
  120.         end
  121.         # 确认开关条件 2
  122.         if c.switch2_valid
  123.           if $game_switches[c.switch2_id] == false
  124.             next
  125.           end
  126.         end
  127.         # 确认变量条件
  128.         if c.variable_valid
  129.           if $game_variables[c.variable_id] < c.variable_value
  130.             next
  131.           end
  132.         end
  133.         # 确认独立开关条件
  134.         if c.self_switch_valid
  135.           key = [@map_id, @event.id, c.self_switch_ch]
  136.           if $game_self_switches[key] != true
  137.             next
  138.           end
  139.         end
  140.         # 设置本地变量 new_page
  141.         new_page = page
  142.         # 跳出循环
  143.         break
  144.       end
  145.     end
  146.     # 与上次同一事件页的情况下
  147.     if new_page == @page
  148.       # 过程结束
  149.       return
  150.     end
  151.     # @page 设置为现在的事件页
  152.     @page = new_page
  153.     # 清除启动中标志
  154.     clear_starting
  155.     # 没有满足条件的页面的时候
  156.     if @page == nil
  157.       # 设置各实例变量
  158.       @tile_id = 0
  159.       @character_name = ""
  160.       @character_hue = 0
  161.       @move_type = 0
  162.       @through = true
  163.       @trigger = nil
  164.       @list = nil
  165.       @interpreter = nil
  166.       # 过程结束
  167.       return
  168.     end
  169.     # 设置各实例变量
  170.     @tile_id = @page.graphic.tile_id
  171.     @character_name = @page.graphic.character_name
  172.     @character_hue = @page.graphic.character_hue
  173.     sign = @character_name[/^[\!\$]./]
  174.     @standby = (sign != nil and sign.include?('$')) ? 16 : 0
  175.     if @original_direction != @page.graphic.direction
  176.       @direction = @page.graphic.direction
  177.       @original_direction = @direction
  178.       @prelock_direction = 0
  179.     end
  180.     if @original_pattern != @page.graphic.pattern
  181.       @pattern = @page.graphic.pattern
  182.       @original_pattern = @pattern
  183.     end
  184.     [url=home.php?mod=space&uid=316553]@opacity[/url] = @page.graphic.opacity
  185.     @blend_type = @page.graphic.blend_type
  186.     @move_type = @page.move_type
  187.     @move_speed = @page.move_speed
  188.     @move_frequency = @page.move_frequency
  189.     @move_route = @page.move_route
  190.     @move_route_index = 0
  191.     @move_route_forcing = false
  192.     @walk_anime = @page.walk_anime
  193.     @step_anime = @page.step_anime
  194.     @direction_fix = @page.direction_fix
  195.     @through = @page.through
  196.     @always_on_top = @page.always_on_top
  197.     @trigger = @page.trigger
  198.     @list = @page.list
  199.     @interpreter = nil
  200.     # 目标是 [并行处理] 的情况下
  201.     if @trigger == 4
  202.       # 生成并行处理用解释器
  203.       @interpreter = Interpreter.new
  204.     end
  205.     # 自动事件启动判定
  206.     check_event_trigger_auto
  207.   end
  208. end
  209. #==============================================================================
  210. class Game_Player < Game_Character
  211.   #--------------------------------------------------------------------------
  212.   def refresh
  213.     # 同伴人数为 0 的情况下
  214.     if $game_party.actors.size == 0
  215.       # 清除角色的文件名及对像
  216.       @character_name = ""
  217.       @character_hue = 0
  218.       # 分支结束
  219.       return
  220.     end
  221.     # 获取带头的角色
  222.     actor = $game_party.actors[0]
  223.     # 设置角色的文件名及对像
  224.     @character_name = actor.character_name
  225.     @character_hue = actor.character_hue
  226.     sign = @character_name[/^[\!\$]./]
  227.     @standby = (sign != nil and sign.include?('$')) ? 16 : 0
  228.     # 初始化不透明度和合成方式
  229.     @opacity = 255
  230.     @blend_type = 0
  231.   end
  232. end
  233. #==============================================================================
  234. class Sprite_Character < RPG::Sprite
  235.   #--------------------------------------------------------------------------
  236.   def update
  237.     super
  238.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  239.     if @tile_id != @character.tile_id or
  240.        @character_name != @character.character_name or
  241.        @character_hue != @character.character_hue
  242.       # 记忆元件 ID 与文件名、色相
  243.       @tile_id = @character.tile_id
  244.       @character_name = @character.character_name
  245.       @character_hue = @character.character_hue
  246.       # 元件 ID 为有效值的情况下
  247.       if @tile_id >= 384
  248.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  249.           @tile_id, @character.character_hue)
  250.         self.src_rect.set(0, 0, 32, 32)
  251.         self.ox = 16
  252.         self.oy = 32
  253.       # 元件 ID 为无效值的情况下
  254.       else
  255.         self.bitmap = RPG::Cache.character(@character.character_name,
  256.           @character.character_hue)
  257.         @cw = bitmap.width / 4
  258.         @ch = @character.standby > 0 ? bitmap.height / 8 : bitmap.height / 4
  259.         self.ox = @cw / 2
  260.         self.oy = @ch
  261.       end
  262.     end
  263.     # 设置可视状态
  264.     self.visible = (not @character.transparent)
  265.     # 图形是角色的情况下
  266.     if @tile_id == 0
  267.       # 设置传送目标的矩形
  268.       sx = @character.pattern * @cw
  269.       sy = (@character.direction - 2) / 2 * @ch
  270.       self.src_rect.set(sx, sy, @cw, @ch)
  271.     end
  272.     # 设置脚本的坐标
  273.     self.x = @character.screen_x
  274.     self.y = @character.screen_y
  275.     self.z = @character.screen_z(@ch)
  276.     # 设置不透明度、合成方式、茂密
  277.     self.opacity = @character.opacity
  278.     self.blend_type = @character.blend_type
  279.     self.bush_depth = @character.bush_depth
  280.     # 动画
  281.     if @character.animation_id != 0
  282.       animation = $data_animations[@character.animation_id]
  283.       animation(animation, true)
  284.       @character.animation_id = 0
  285.     end
  286.   end
  287. end
  288. #==============================================================================
  289. class Window_Base < Window
  290.   #--------------------------------------------------------------------------
  291.   def draw_actor_graphic(actor, x, y)
  292.     bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
  293.     sign = actor.character_name[/^[\!\$]./]   
  294.     cw = bitmap.width / 4
  295.     n = (sign != nil and sign.include?('$')) ?  8 : 4
  296.     ch =  bitmap.height / n
  297.     src_rect = Rect.new(0, 0, cw, ch)
  298.     self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  299.   end
  300. end
  301. #==============================================================================
复制代码
按照附件的行走图拼合,名字前加个$就可以实现待机了
脚本来自@芯☆淡茹水  

$ddd.png (279.04 KB, 下载次数: 14)

$ddd.png

作者: 紫英晓狼1130    时间: 2014-5-24 19:29
把人物的动态图拼成4*4的行走图,在事件中勾选停止时动画
作者: 日月星辰    时间: 2014-5-24 19:35
紫英晓狼1130 发表于 2014-5-24 19:29
把人物的动态图拼成4*4的行走图,在事件中勾选停止时动画

lz要的是两张图片
作者: yang1zhi    时间: 2014-5-24 21:21
用行走图也是可以的啊。停止时动画勾起来,其他就是图片的事了
作者: fyldgp    时间: 2014-5-25 11:50
本帖最后由 fyldgp 于 2014-5-25 11:51 编辑
日月星辰 发表于 2014-5-24 19:35
lz要的是两张图片




比如这样子的NPC,如何实现图中的动作?

未标题-1.png (558.41 KB, 下载次数: 17)

未标题-1.png

作者: fyldgp    时间: 2014-5-25 11:52
yang1zhi 发表于 2014-5-24 21:21
用行走图也是可以的啊。停止时动画勾起来,其他就是图片的事了

比如楼下这样子的NPC,怎么做出效果?
作者: 日月星辰    时间: 2014-5-25 13:00
fyldgp 发表于 2014-5-25 11:50
比如这样子的NPC,如何实现图中的动作?

如果是一张4*8的图片,你可以尝试4楼的脚本啊

两张4*4的用3楼的脚本




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