赞 | 0 |
VIP | 4 |
好人卡 | 0 |
积分 | 1 |
经验 | 12374 |
最后登录 | 2016-5-21 |
在线时间 | 92 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 120
- 在线时间
- 92 小时
- 注册时间
- 2009-8-1
- 帖子
- 438
|
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)。如下图所示。
【报错的脚本】- #==============================================================================
- # 作者: FantasyDR
- #
- # 版本: v1.0
- #
- # 2005.10.25
- #==============================================================================
- #==============================================================================
- # ■ Table
- #------------------------------------------------------------------------------
- # 加入fill方法
- #==============================================================================
- class Table
- def fill(c)
- for y in 0..self.ysize
- for x in 0..self.xsize
- self[x,y] = c
- end
- end
- end
- end
- #==============================================================================
- # ■ Spriteset_Map
- #------------------------------------------------------------------------------
- # 重载地图显示
- #==============================================================================
- class Spriteset_Map
- attr_reader:tilemap
- alias :original_ini :initialize
- def initialize
- original_ini
- # 设置地图闪烁列表
- @tilemap.flash_data=Table.new(@tilemap.map_data.xsize,@tilemap.map_data.ysize)
- end
- end
- #==============================================================================
- # ■ Scene_Map
- #------------------------------------------------------------------------------
- # 重载地图场景
- #==============================================================================
- class Scene_Map
- attr_reader:spriteset
- end
- #==============================================================================
- # ■ Game_Event
- #------------------------------------------------------------------------------
- # 重载事件的类
- #==============================================================================
- class Game_Event < Game_Character
- alias :origin_initialize :initialize
- alias :origin_update :update
- attr_reader :switch_no #控制开关号
- attr_reader :deep #视野深度
- attr_reader :test_block #是否检测障碍
- attr_reader :is_always #是否一直跟随
- attr_reader :show_grid #是否显示范围
- attr_accessor:flash_color #闪烁颜色
- #--------------------------------------------------------------------------
- # ●初始化
- #--------------------------------------------------------------------------
- def initialize(map_id, event)
- origin_initialize(map_id, event)
- # 敌人朝向是2/4/6/8中的一个。
- # 下左右上
- # 建立Hash表,表示方向变量:
- @dx_lib ={2=>0,4=>-1,6=>1,8=>0}
- @dy_lib ={2=>1,4=>0,6=>0,8=>-1}
- # 闪烁颜色
- @flash_color=0xf0
- end
- #--------------------------------------------------------------------------
- # ●画面更新
- #--------------------------------------------------------------------------
- def update
- if moving? or @original_direction != @direction
- @original_direction = @direction
- end
- self.test_view
- origin_update
- end
- #--------------------------------------------------------------------------
- # ●判断是否被遮挡
- # 参数:原点、障碍点、目标点、宽度
- #--------------------------------------------------------------------------
- def be_covered(sx,sy, cx,cy, px,py, width, x_fix,y_fix)
- #坐标转换
- sx = sx * width/1.0
- sy = sy * width/1.0
- cx = cx * width/1.0
- cy = cy * width/1.0
- px = px * width/1.0
- py = py * width/1.0
- #转换两个遮挡点
- cx_a = cx - width*x_fix/2.0
- cx_b = cx + width*x_fix/2.0
- cy_a = cy - width*y_fix/2.0
- cy_b = cy + width*y_fix/2.0
- # 求斜率
- kp = (py-sy)/(px-sx)
- if x_fix != 0 #横向遮挡
- if px == sx #在垂直方向
- tx = 0
- else
- tx = cy/kp
- end
- if (cy-sy).abs<(py-sy).abs and tx>=cx_a and tx<=cx_b
- return true #被挡住
- end
- else #纵向遮挡,面向水平方向
- ty = cx*kp
- if (cx-sx).abs<(px-sx).abs and ty>=cy_a and ty<=cy_b
- return true #被挡住
- end
- end
- return false #没有被挡住
- end
- #--------------------------------------------------------------------------
- # ● 保存数据
- # x,y:
- # 数据位置
- #--------------------------------------------------------------------------
- def pack(x,y,test)
- if x == $game_player.x and y == $game_player.y
- $game_switches[@switch_no] = true
- end
- end
- #--------------------------------------------------------------------------
- # ● 移动类型 : 敌人视界判断
- # @deep:
- # 视野深度
- # @test_block:
- # 是否检测障碍
- #--------------------------------------------------------------------------
- def test_view
- return if [url=home.php?mod=space&uid=11710]@deep[/url] == nil
- # 求得方向变量参数
- dx=@dx_lib[@direction]
- dy=@dy_lib[@direction]
- # 求得与主角座标的差值
- sx = @x - $game_player.x
- sy = @y - $game_player.y
- # 判定是否一直跟踪
- if @is_always and $game_switches[@switch_no]
- if (sx**2 + sy**2)>((@deep+1)**2)
- $game_switches[@switch_no]=false
- end
- else
- $game_switches[@switch_no]=false
- end
- @rp = 0
- @vp = 0
- # 设置周围视野
- if dy != 0 #纵向视野
- pack(@x+1,@y,false)
- pack(@x-1,@y,false)
- else
- pack(@x,@y+1,false)
- pack(@x,@y-1,false)
- end
- # 扫描所有视野上的点
- for i in 1..@deep
- for j in -i..i
- if dy != 0
- cy = @y + dy*i
- cx = @x + j
- else
- cx = @x + dx*i
- cy = @y + j
- end
- pack(cx,cy,true)
- end
- end
- #探测玩家有没有被遮挡
- if $game_switches[@switch_no] and @test_block
- for j in 0..@rp-1
- if (@rock[j,0] != $game_player.x or @rock[j,0] != $game_player.y) and
- self.be_covered(0,0, @rock[j,0]-@x,@rock[j,1]-@y,\
- $game_player.x-@x,$game_player.y-@y,32,dy.abs,dx.abs)
- $game_switches[@switch_no]=false
- break
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ●移动类型
- #--------------------------------------------------------------------------
- def em_view(switch_no,deep=12,test_block=true,is_always=true,show_grid=false)
- @switch_no = switch_no
- [url=home.php?mod=space&uid=11710]@deep[/url] = deep
- @test_block = test_block
- @is_always = is_always
- @show_grid = show_grid
- # 根据$game_switches[@switch_no]移动
- if $game_switches[@switch_no]
- # 被发现的情况,跟随主角
- @move_frequency = 6
- @move_frequency = 4 if $game_switches[58]
- #我改速度了
- @move_speed = 4 #王泽钰备注:人物移动速度4
- move_toward_player
- else
- # 没有被发现的情况,随机转向
- @move_frequency = 6
- @move_speed = 3
- case rand(6)
- when 0..3 # 随机
- move_random
- when 4 # 前进一步
- move_forward
- when 5 # 暂时停止
- @stop_count = 0
- end
- end
- end
- end
复制代码 真心拜托大侠了!!!感激不尽! |
最佳答案
查看完整内容
你把176、166行的改成這樣至少不會報錯,但是會不會有其他問題我不知道(因為會出現這個有可能是有腳本的邏輯錯誤...
|