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

Project1

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

[已经解决] 游戏内测时候出现的脚本BUG,跪求高手

[复制链接]

Lv1.梦旅人

梦石
0
星屑
120
在线时间
92 小时
注册时间
2009-8-1
帖子
438
跳转到指定楼层
发表于 2013-11-12 22:08:20 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
5星屑
本帖最后由 tree52 于 2013-11-13 20:53 编辑

我做的游戏正在内测: 这个游戏(81M,链接是6r),测试中发现一处很罕见的问题,因离发布日22日(对我来说很重要的日子)很近了。
跪求高手赐教!

【工程地址】http://dl.vmall.com/c0zvn0oaoj  (华为网盘)

【报错信息】
脚本“Viewrage修改版"的177行 发生了NoMerhodError
undefined method \*' for nil:NilClass

【报错的情形回顾】
人物行走,遇到怪物时候会跳出该错误;或是怪物打完了跳出该错误。
5人测试游戏中有2人遇到该错误,一个测试员是打第四怪物,还有是我在打第一个怪物之前就跳出bug。

【猜测报错原因】
猜测1:我游戏中人物行走是8方位的,这个脚本是不是遇到8方位的行走判定会出错?
猜测2:怪物行走设定的脚本错误,移动路线设置的是“自定义”,然后脚本为em_view(94,6,true,true,false)。如下图所示。



【报错的脚本】
  1. #==============================================================================
  2. # 作者: FantasyDR
  3. #
  4. # 版本: v1.0
  5. #
  6. # 2005.10.25
  7. #==============================================================================

  8. #==============================================================================
  9. # ■ Table
  10. #------------------------------------------------------------------------------
  11. #  加入fill方法
  12. #==============================================================================
  13. class Table
  14. def fill(c)
  15. for y in 0..self.ysize
  16. for x in 0..self.xsize
  17. self[x,y] = c
  18. end
  19. end
  20. end
  21. end

  22. #==============================================================================
  23. # ■ Spriteset_Map
  24. #------------------------------------------------------------------------------
  25. # 重载地图显示
  26. #==============================================================================
  27. class Spriteset_Map
  28. attr_reader:tilemap
  29. alias :original_ini :initialize
  30. def initialize
  31. original_ini
  32. # 设置地图闪烁列表
  33. @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
  34. end
  35. end
  36. #==============================================================================
  37. # ■ Scene_Map
  38. #------------------------------------------------------------------------------
  39. # 重载地图场景
  40. #==============================================================================
  41. class Scene_Map
  42. attr_reader:spriteset
  43. end
  44. #==============================================================================
  45. # ■ Game_Event
  46. #------------------------------------------------------------------------------
  47. #  重载事件的类
  48. #==============================================================================
  49. class Game_Event < Game_Character
  50. alias :origin_initialize :initialize
  51. alias :origin_update :update

  52. attr_reader :switch_no #控制开关号
  53. attr_reader :deep #视野深度
  54. attr_reader :test_block #是否检测障碍
  55. attr_reader :is_always #是否一直跟随
  56. attr_reader :show_grid #是否显示范围
  57. attr_accessor:flash_color #闪烁颜色
  58. #--------------------------------------------------------------------------
  59. # ●初始化
  60. #--------------------------------------------------------------------------
  61. def initialize(map_id, event)
  62. origin_initialize(map_id, event)
  63. # 敌人朝向是2/4/6/8中的一个。
  64. # 下左右上
  65. # 建立Hash表,表示方向变量:
  66. @dx_lib ={2=>0,4=>-1,6=>1,8=>0}
  67. @dy_lib ={2=>1,4=>0,6=>0,8=>-1}
  68. # 闪烁颜色
  69. @flash_color=0xf0
  70. end
  71. #--------------------------------------------------------------------------
  72. # ●画面更新
  73. #--------------------------------------------------------------------------
  74. def update
  75. if moving? or @original_direction != @direction

  76. @original_direction = @direction
  77. end
  78. self.test_view
  79. origin_update
  80. end
  81. #--------------------------------------------------------------------------
  82. # ●判断是否被遮挡
  83. # 参数:原点、障碍点、目标点、宽度
  84. #--------------------------------------------------------------------------
  85. def be_covered(sx,sy, cx,cy, px,py, width, x_fix,y_fix)
  86. #坐标转换
  87. sx = sx * width/1.0
  88. sy = sy * width/1.0
  89. cx = cx * width/1.0
  90. cy = cy * width/1.0
  91. px = px * width/1.0
  92. py = py * width/1.0
  93. #转换两个遮挡点
  94. cx_a = cx - width*x_fix/2.0
  95. cx_b = cx + width*x_fix/2.0
  96. cy_a = cy - width*y_fix/2.0
  97. cy_b = cy + width*y_fix/2.0


  98. # 求斜率
  99. kp = (py-sy)/(px-sx)
  100. if x_fix != 0 #横向遮挡
  101. if px == sx #在垂直方向
  102. tx = 0
  103. else
  104. tx = cy/kp
  105. end
  106. if (cy-sy).abs<(py-sy).abs and tx>=cx_a and tx<=cx_b
  107. return true #被挡住
  108. end
  109. else #纵向遮挡,面向水平方向
  110. ty = cx*kp
  111. if (cx-sx).abs<(px-sx).abs and ty>=cy_a and ty<=cy_b
  112. return true #被挡住
  113. end
  114. end
  115. return false #没有被挡住
  116. end

  117. #--------------------------------------------------------------------------
  118. # ● 保存数据
  119. # x,y:
  120. # 数据位置
  121. #--------------------------------------------------------------------------
  122. def pack(x,y,test)
  123. if x == $game_player.x and y == $game_player.y
  124. $game_switches[@switch_no] = true
  125. end

  126. end
  127. #--------------------------------------------------------------------------
  128. # ● 移动类型 : 敌人视界判断
  129. # @deep:
  130. # 视野深度
  131. # @test_block:
  132. # 是否检测障碍
  133. #--------------------------------------------------------------------------
  134. def test_view
  135. return if [url=home.php?mod=space&uid=11710]@deep[/url] == nil

  136. # 求得方向变量参数
  137. dx=@dx_lib[@direction]
  138. dy=@dy_lib[@direction]

  139. # 求得与主角座标的差值
  140. sx = @x - $game_player.x
  141. sy = @y - $game_player.y

  142. # 判定是否一直跟踪
  143. if @is_always and $game_switches[@switch_no]
  144. if (sx**2 + sy**2)>((@deep+1)**2)
  145. $game_switches[@switch_no]=false
  146. end
  147. else
  148. $game_switches[@switch_no]=false
  149. end


  150. @rp = 0
  151. @vp = 0
  152. # 设置周围视野
  153. if dy != 0 #纵向视野
  154. pack(@x+1,@y,false)
  155. pack(@x-1,@y,false)
  156. else
  157. pack(@x,@y+1,false)
  158. pack(@x,@y-1,false)
  159. end
  160. # 扫描所有视野上的点
  161. for i in 1..@deep
  162. for j in -i..i
  163. if dy != 0
  164. cy = @y + dy*i
  165. cx = @x + j
  166. else
  167. cx = @x + dx*i
  168. cy = @y + j
  169. end
  170. pack(cx,cy,true)
  171. end
  172. end


  173. #探测玩家有没有被遮挡
  174. if $game_switches[@switch_no] and @test_block
  175. for j in 0..@rp-1
  176. if (@rock[j,0] != $game_player.x or @rock[j,0] != $game_player.y) and
  177. self.be_covered(0,0, @rock[j,0]-@x,@rock[j,1]-@y,\
  178. $game_player.x-@x,$game_player.y-@y,32,dy.abs,dx.abs)
  179. $game_switches[@switch_no]=false
  180. break
  181. end
  182. end
  183. end
  184. end
  185. #--------------------------------------------------------------------------
  186. # ●移动类型
  187. #--------------------------------------------------------------------------
  188. def em_view(switch_no,deep=12,test_block=true,is_always=true,show_grid=false)
  189. @switch_no = switch_no
  190. [url=home.php?mod=space&uid=11710]@deep[/url] = deep
  191. @test_block = test_block
  192. @is_always = is_always
  193. @show_grid = show_grid

  194. # 根据$game_switches[@switch_no]移动
  195. if $game_switches[@switch_no]
  196. # 被发现的情况,跟随主角
  197. @move_frequency = 6
  198. @move_frequency = 4 if $game_switches[58]
  199. #我改速度了
  200. @move_speed = 4 #王泽钰备注:人物移动速度4
  201. move_toward_player
  202. else
  203. # 没有被发现的情况,随机转向
  204. @move_frequency = 6
  205. @move_speed = 3
  206. case rand(6)
  207. when 0..3 # 随机
  208. move_random
  209. when 4 # 前进一步
  210. move_forward
  211. when 5 # 暂时停止
  212. @stop_count = 0
  213. end
  214. end
  215. end

  216. end
复制代码
真心拜托大侠了!!!感激不尽!   

QQ截图20131112220108.jpg (120.76 KB, 下载次数: 28)

QQ截图20131112220108.jpg

最佳答案

查看完整内容

你把176、166行的改成這樣至少不會報錯,但是會不會有其他問題我不知道(因為會出現這個有可能是有腳本的邏輯錯誤...
哎呦,好像快要能发布一款游戏了,这次一定要低调!

Lv1.梦旅人

梦石
0
星屑
120
在线时间
92 小时
注册时间
2009-8-1
帖子
438
2
 楼主| 发表于 2013-11-13 20:55:36 | 只看该作者
joe5491 发表于 2013-11-12 22:08
你把176、166行的改成這樣至少不會報錯,但是會不會有其他問題我不知道(因為會出現這個有可能是有腳本的邏 ...

按照你的改咯,一语道破!

同时,我还请教了另一位6r群里的高人【莫言墨语】,他给我分析并讲解了脚本,在此也要感谢下他!


十分感谢二位!还能在6r继续得到大家的帮助,十分开心!

评分

参与人数 1星屑 +7 收起 理由
774741359 + 7 塞糖 被表扬了

查看全部评分

哎呦,好像快要能发布一款游戏了,这次一定要低调!
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
193 小时
注册时间
2013-3-24
帖子
448
1
发表于 2013-11-12 22:08:21 | 只看该作者
你把176、166行的
  1. if dy != 0
复制代码
改成
  1. if dy != 0 && dy != nil
复制代码
這樣至少不會報錯,但是會不會有其他問題我不知道(因為會出現這個有可能是有腳本的邏輯錯誤...

点评

嘿,在上班,我晚上回去看看,先在此谢过~~ 能达到不报错的效果就可以啦...  发表于 2013-11-13 10:31

评分

参与人数 2星屑 +100 收起 理由
myownroc + 90 认可答案
tree52 + 10 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 10:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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