Project1

标题: 如何实现角色接近有对话的npc,npc头上跳出talk标志 [打印本页]

作者: 鲜鲜兔    时间: 2010-9-10 14:50
标题: 如何实现角色接近有对话的npc,npc头上跳出talk标志
我是这么操作的
一、先在npc事件页进行变量操作,变量1=角色x坐标、变量2=角色y坐标
二、条件分歧:角色移动到npc附近一定区域,显示动画(出现talk标志的动画)
三、继续条件分歧:如果按下C键,执行对话内容

之后就是问题了,我走到npc附近时,确实有显示动画,但是当我按下空格键或回车键时,
对话不是按一下键就能跳出来,有时要按3、4下才出来,只有碰巧的时候按一下会有用,
这样感觉很怪。
是不是我哪里设置的不对呀,请各位大虾给点建议啊啊,感激不尽!!!!!!!

作者: 八云紫    时间: 2010-9-10 15:37
估计是处理速度上的问题吧~~~

并行的话,可能会这样。

LZ 可以用开关,变量先判断下按键,然后再条件分歧什么的,~~~
作者: 禾西    时间: 2010-9-10 15:53
我近來正好在寫這個功能的腳本,當然因為時間問題還沒有弄好。這是半成品的思路(這個思路是kaza提供的,應該是和澤是一個人吧--a):

  1. #========================
  2. class Scene_Map
  3.   TANCE = 1 #动画ID
  4. end
  5. #========================
  6. #Game_Event========================
  7. class Game_Event
  8.   attr_reader :event
  9. end
  10. #Game_Map========================
  11. class Game_Map
  12.   def tance
  13.     for event in @events.values
  14.       if event.event.name.split(/,/)[0] == "shine"
  15.         $scene.shine.push event.event if $scene.is_a?(Scene_Map)
  16.       end
  17.     end
  18.   end
  19. end
  20. class Game_Player < Game_Character
  21.   alias tance_increase_steps increase_steps
  22.   def increase_steps
  23.     tance_increase_steps
  24.     if $scene.is_a?(Scene_Map)
  25.       $scene.check_tance
  26.     end
  27.   end
  28. end
  29. #Scene_Map========================
  30. class Scene_Map
  31.   attr_accessor :shine
  32.   def initialize
  33.     @shine = []
  34.   end
  35.   alias tance_main main
  36.   def main
  37.     $game_map.tance
  38.     @tance_wait = 0
  39.     check_tance
  40.     tance_main
  41.   end
  42.   alias tance_update update
  43.   def update
  44.     if @tance

  45.           if Input.trigger?(Input::C)

  46.           end

  47.           if @tance_wait == 0
  48.             #$game_player.animation_id = TANCE #靠近目标事件动作
  49.             $game_map.events[@tance].animation_id = TANCE
  50.             @tance_wait = 60
  51.           else
  52.             @tance_wait -= 1
  53.           end
  54.           if Input.trigger?(Input::C)
  55.             $game_map.events[@tance].start
  56.             @tance = nil
  57.           end
  58.         #=================================================
  59.     end
  60.     tance_update
  61.   end
  62.   def check_tance
  63.     for event in @shine
  64.       if (($game_player.x - event.x) ** 2 + ($game_player.y - event.y) ** 2) <= event.name.split(/,/)[1].to_i ** 2
  65.         @tance = event.id
  66.       else
  67.         @tance = false
  68.       end
  69.     end
  70.   end
  71. end
复制代码
核心其實很簡單,就是根據角色名字是否含有shine這個字符串來判斷事件類型,再根據 , 號後的第一個數字來判斷有效范圍。也就是把事件名字設定爲這樣:
shine,6

作者: lxdsh2009    时间: 2010-9-10 16:30
VX有这种脚本
好吧这是XP
作者: fux2    时间: 2010-9-10 20:52
本帖最后由 fux2 于 2010-9-10 20:54 编辑

回复 鲜鲜兔 的帖子


    给你开个门http://rpg.blue/thread-133326-1-7.html
这里的范例公共事件里删掉下面一个脚本(上下2个一样),把上面的l=5改成l=1,把wait去掉,就可以判断主角是否在事件身边了,而且效率极高。
作者: 逸豫    时间: 2010-9-10 20:55
http://rpg.blue/forum.php?mod=viewthread&tid=133326
作者: 鲜鲜兔    时间: 2010-9-11 21:24
非常感谢各位的回帖,5楼和6楼的脚本真的很有用,多谢了。
不过现在又有个新问题了,和npc说完话,npc应该没有对话了,这时候npc头上却仍有
talk标志,我在想只要把npc的名字改成"EV"开头应该就没问题了吧,可是我不知道用脚
本怎么改事件名称  :dizzy:
       麻烦各位指导一下,谢谢了!!


作者: 逸豫    时间: 2010-9-12 00:08
事件第三页脚本中写:
  1. a = $game_map.events[@event_id]
  2. def a.name=(v)
  3. @name = v
  4. end
  5. a.name = "EV"
复制代码





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