Project1
标题:
怎么改默认行走为斜着??
[打印本页]
作者:
v2sam
时间:
2007-12-29 16:56
标题:
怎么改默认行走为斜着??
我改成1 3 7 9 ,但是人物不会动{/ll}
作者:
v2sam
时间:
2007-12-29 16:56
标题:
怎么改默认行走为斜着??
我改成1 3 7 9 ,但是人物不会动{/ll}
作者:
六芒幽狐
时间:
2007-12-29 17:05
LZ是要实现八方向行走么?
引用[SailCat]的方法
事件法:
打开一个开关,并行处理公共事件
如果方向键上按下
如果方向键左按下
左上移动
等待移动结束
除此以外的情况
如果方向键右按下
右上移动
等待移动结束
除此以外的情况
向上移动
等待移动结束
分歧结束
分歧结束
除此以外的情况
如果方向键下按下
如果方向键左按下
左下移动
等待移动结束
除此以外的情况
如果方向键右按下
右下移动
等待移动结束
除此以外的情况
向下移动
等待移动结束
分歧结束
分歧结束
除此以外的情况
如果方向键左按下
向左移动
等待移动结束
除此以外的情况
如果方向键右按下
向右移动
等待移动结束
分歧结束
分歧结束
分歧结束
分歧结束
复制代码
脚本法
定位RGSS Game_Player,第208行:
# 如果方向键被按下、主角就朝那个方向移动
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
修改为:
# 如果方向键被按下、主角就朝那个方向移动
case Input.dir8
when 1
move_lower_left
when 2
move_down
when 3
move_lower_right
when 4
move_left
when 6
move_right
when 7
move_upper_left
when 8
move_up
when 9
move_upper_right
end
存盘后就可以实现八方向走了.
如果你只是想实现八方向走的功能(像黑暗圣剑那样),就到此为止,如果还有兴趣则继续往下看:
虽然从功能上说是如此简单,但是这样子尝试以后就会发现,八方向行走的手感并不是很好,主要体现在两个方面:
1. 八方向走在遇到障碍物时,会自动停止,如果走到靠墙导致一个分方向不能通行时沿另一个分方向继续走下去,手感就会好很多
2. 八方向在地图上是一个斜着的移动过程,在八方向走原格和目标格构成的矩形中,如果除原格和目标格之外的两格中,有一格不能通行,八方向走仍然可以通行,但是斜着的移动看上去会比较丑,如果能够在这个情况下自动转为向能通行的一格前进一步再进入目标格,视觉上效果会好很多.
要实现这个也不是非常复杂,修改一下系统的斜方向行走方法.
以下以"左下移动"为例,说明一下系统的斜方向行走判定,修改强化手感和视觉效果的办法.
Game_Character 3 第101行
#--------------------------------------------------------------------------
# ● 向左下移动
#--------------------------------------------------------------------------
def move_lower_left
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
end
# 下→左、左→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 更新坐标
@x -= 1
@y += 1
# 增加步数
increase_steps
end
end
首先解决问题2:
八方向的通行判定是双路径并行,之间是或的关系,如果改成与的关系,就能实现只要两条路径中有一条走不通,斜方向就走不起来.
# 下→左、左→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
这样虽说是可以了,但是,也不能说一条走不通就不让动啊,所以还需要分别判定两个方向的路径:
# 下→左、左→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 更新坐标
@x -= 1
@y += 1
# 增加步数
increase_steps
# 下→左能够通行的情况下
elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
# 向下移动后向左移动
move_down
move_left
# 左→下能够通行的情况下
elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 向左移动后向下移动
move_left
move_down
end
然后来解决比较复杂的问题1:
首先,对于这个智能判定前进方向的功能,原来的方法里是没有的,为了不影响事件里设置好的移动路线在执行时出现问题,必须加上判定,令其只对角色的按键移动有效.
一种方法是条件分歧 if self.is_a?(Game_Player)来判断类型,这样条件里的功能就只对角色有效,对NPC无效了,不过,还是不能判断角色的移动是事件设定移动还是按键移动,所以再加一个条件and not @move_route_forcing,这样事件设定里的角色移动便不会执行这个分歧的功能.
分歧里面的操作是: 首先判定角色朝向,如果向左,则以向左方前进为优先,不能移动时启动左方接触事件,没有事件时向下方移动;否则以向下方前进为优先,不能移动时启动下方接触事件,没有事件时向左方移动.
# 如果移动的对象是角色且非强制移动
if self.is_a?(Game_Player) and not @move_route_forcing
# 面向左时
if @direction = 4
# 左方可以通行时
if passable?(@x, @y, 4)
# 向左移动
move_left
# 不能通行时
else
# 左面接触事件启动
result = check_event_trigger_touch(@x-1, @y)
# 没有事件的情况下
unless result
# 向下移动
move_down
end
end
# 不面向左时
else
# 下方可以通行时
if passable?(@x, @y, 2)
# 向下移动
move_down
# 不能通行时
else
# 下面接触事件启动
result = check_event_trigger_touch(@x, @y+1)
# 没有事件的情况下
unless result
# 向左移动
move_left
end
end
end
end
然后把这个分歧结构作为一个elsif条件整合到前面的部分中,完整的"向左下移动"方法(紫色字是新加的脚本):
#--------------------------------------------------------------------------
# ● 向左下移动
#--------------------------------------------------------------------------
def move_lower_left
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
end
# 下→左、左→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) and
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 更新坐标
@x -= 1
@y += 1
# 增加步数
increase_steps
# 下→左能够通行的情况下
elsif (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4))
# 向下移动后向左移动
move_down
move_left
# 左→下能够通行的情况下
elsif (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 向左移动后向下移动
move_left
move_down
# 如果移动的对象是角色且非强制移动
elsif self.is_a?(Game_Player) and not @move_route_forcing
# 面向左时
if @direction = 4
# 左方可以通行时
if passable(@x, @y, 4)
# 向左移动
move_left
# 不能通行时
else
# 左面接触事件启动
result = check_event_trigger_touch(@x-1, @y)
# 没有事件的情况下
unless result
# 向下移动
move_down
end
end
# 不面向左时
else
# 下方可以通行时
if passable(@x, @y, 2)
# 向下移动
move_down
# 不能通行时
else
# 下面接触事件启动
result = check_event_trigger_touch(@x, @y+1)
# 没有事件的情况下
unless result
# 向左移动
move_left
end
end
end
end
end
这样就完成了一个有手感加强的"向左下移动"的方法,对于"向右下移动","向左上移动","向右上移动",只要调整几个方向的参数,照着上例修改一下就行了.
复制代码
引用[66大人]的方法
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
###########################################################################################################################
###########################################################################################################################
# 脚本功能:八方向走与多帧移动之图片修正__ver1.1。
# 更新日期:2005年8月6日
# 更新内容:增加斜方向触发,增加斜方向面向角色(1步之内)
# 使用方法:将本脚本插入到main之前。如果你使用了雅土版的八方向走脚本,请确保这个脚本的顺序位置,在雅土八方向走脚本的后面。
# 预先处理:请输入每一步的帧数和总共可用的方向数
$c3_每一步的帧数 = 5
$c3_总共可用的方向数 = 8 #——建议不要修改这个。如果要伪8方向的,就用伪的好了。
# 图片处理与功能说明:
# 1、每一步的帧数:
# 众所周知,RMXP的移动行走图是一个方向共有4帧,很多人都觉得这个帧数有点少。
# 使用这个脚本之后,只要将 $c3_每一步的帧数 这个变量设置一个需要的帧数即可修改
# 单方向移动帧数为相应输入值。修改后,需要用photoshop将所有用到的素材的横排
# 调整为相应帧数,比如输入了8则要将每一行设置8个图像(即每一个行走图有8列)。
# 2、可用方向调整(可用数量:4、8):
# 当为4方向时没有任何变化,还是一个图4行,上左右下4个方向。
# 如果想使用8方向走,将需要八方向行走的行走图在延伸扩大的画布中按照左下、右下、左上、右上继续排布图像。
# 即,行走图图片从上到下的面向排列顺序为:下,左,右,上,左下,右下,左上,右上。
# 至于不需要8方向走的普通的NPC(character),使用photoshop将画布向下扩大一倍即可使用。
# 需要注意的是,如果需要斜方向飞鸟,请不要忘记自制素材。
# 特别提示:
# 使用本脚本前请先考虑清楚是否要做这种效果。因为使用本脚本后需要用photoshop处理character行走图素材
# 虽然这种处理用photoshop定义动作只需要5分钟即可全部完成,但在制作阶段会感觉不是很爽(具体的用了才知道)
# 作者的建议是,如果你没有足够的制作经验,使用这个脚本得不偿失。请确保自己的能力属于“高手”级别!
# 附赠功能:
# 可以让NPC角色随机8方向走,方法是:NPC角色移动路线为“自定义”,然后自定义里面使用脚本,输入c8即可
# 可以让NPC角色随机4斜角方向走,方法是:NPC角色移动路线为“自定义”,然后自定义里面使用脚本,输入c4即可
# 可以使用真·斜4方向行走,参考脚本53行开始
# 作者:carol3
###########################################################################################################################
###########################################################################################################################
class Game_Player < Game_Character
if $c3_总共可用的方向数 == 8
def update
last_moving = moving?
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# 用井号后面的东西替代前面的,就可以实现斜4方向走
case Input.dir8
when 2
move_down #move_lower_left
when 4
move_left #move_upper_left
when 6
move_right #move_lower_right
when 8
move_up #move_upper_right
when 1
move_lower_left
when 3
move_lower_right
when 7
move_upper_left
when 9
move_upper_right
end
end
# 本地变量记忆坐标
last_real_x = @real_x
last_real_y = @real_y
super
# 角色向下移动、画面上的位置在中央下方的情况下
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
# 画面向下卷动
$game_map.scroll_down(@real_y - last_real_y)
end
# 角色向左移动、画面上的位置在中央左方的情况下
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
# 画面向左卷动
$game_map.scroll_left(last_real_x - @real_x)
end
# 角色向右移动、画面上的位置在中央右方的情况下
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
# 画面向右卷动
$game_map.scroll_right(@real_x - last_real_x)
end
# 角色向上移动、画面上的位置在中央上方的情况下
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
# 画面向上卷动
$game_map.scroll_up(last_real_y - @real_y)
end
# 不在移动中的情况下
unless moving?
# 上次主角移动中的情况
if last_moving
# 与同位置的事件接触就判定为事件启动
result = check_event_trigger_here([1,2])
# 没有可以启动的事件的情况下
if result == false
# 调试模式为 ON 并且按下 CTRL 键的情况下除外
unless $DEBUG and Input.press?(Input::CTRL)
# 遇敌计数下降
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 判定为同位置以及正面的事件启动
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
#--------------------------------------------------------------------------
# ● 正面事件的启动判定
#--------------------------------------------------------------------------
def check_event_trigger_there(triggers)
result = false
# 事件执行中的情况下
if $game_system.map_interpreter.running?
return result
end
# 计算正面坐标
new_x = @x
new_y = @y
case @direction
when 1
new_x -= 1
new_y += 1
when 2
new_y += 1
when 3
new_x += 1
new_y += 1
when 4
new_x -= 1
when 6
new_x += 1
when 7
new_x -= 1
new_y -= 1
when 8
new_y -= 1
when 9
new_x += 1
new_y -= 1
end
# 全部事件的循环
for event in $game_map.events.values
# 事件坐标与目标一致的情况下
if event.x == new_x and event.y == new_y and
triggers.include?(event.trigger)
# 跳跃中以外的情况下、启动判定是正面的事件
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
# 找不到符合条件的事件的情况下
if result == false
# 正面的元件是计数器的情况下
if $game_map.counter?(new_x, new_y)
# 计算 1 元件里侧的坐标
new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# 全事件的循环
for event in $game_map.events.values
# 事件坐标与目标一致的情况下
if event.x == new_x and event.y == new_y and
triggers.include?(event.trigger)
# 跳跃中以外的情况下、启动判定是正面的事件
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
end
end
return result
end
#--------------------------------------------------------------------------
# ● 向左下移动
#--------------------------------------------------------------------------
def move_lower_left
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = 1#(@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
end
# 下→左、左→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
# 更新坐标
@x -= 1
@y += 1
# 增加步数
increase_steps
else
check_event_trigger_touch(@x-1, @y+1)
end
end
#--------------------------------------------------------------------------
# ● 向右下移动
#--------------------------------------------------------------------------
def move_lower_right
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = 3#(@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
end
# 下→右、右→下 的通道可以通行的情况下
if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
(passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
# 更新坐标
@x += 1
@y += 1
# 增加步数
increase_steps
else
check_event_trigger_touch(@x+1, @y+1)
end
end
#--------------------------------------------------------------------------
# ● 向左上移动
#--------------------------------------------------------------------------
def move_upper_left
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = 7#(@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
end
# 上→左、左→上 的通道可以通行的情况下
if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
(passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
# 更新坐标
@x -= 1
@y -= 1
# 增加步数
increase_steps
else
check_event_trigger_touch(@x-1, @y-1)
end
end
#--------------------------------------------------------------------------
# ● 向右上移动
#--------------------------------------------------------------------------
def move_upper_right
# 没有固定面向的场合
unless @direction_fix
# 朝向是右的情况下适合的面是左面、朝向是上的情况下适合的面是下面
@direction = 9#(@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
end
# 上→右、右→上 的通道可以通行的情况下
if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
(passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
# 更新坐标
@x += 1
@y -= 1
# 增加步数
increase_steps
else
check_event_trigger_touch(@x+1, @y-1)
end
end
#--------------------------------------------------------------------------
# ● 雅土左下移動
#--------------------------------------------------------------------------
def move_lower_left_p
unless @direction_fix
@direction = 1
end
distance = (2 ** @move_speed) / Math.sqrt(2)
turn_left unless down1(@x, @y, distance)
turn_down if @event
turn_down unless left1(@x, @y, distance) unless @event
turn_left if @event
end
#--------------------------------------------------------------------------
# ● 雅土右下移動
#--------------------------------------------------------------------------
def move_lower_right_p
unless @direction_fix
@direction = 3
end
distance = (2 ** @move_speed) / Math.sqrt(2)
turn_right unless down1(@x, @y, distance)
turn_down if @event
turn_down unless right1(@x, @y, distance) unless @event
turn_right if @event
end
#--------------------------------------------------------------------------
# ● 雅土左上移動
#--------------------------------------------------------------------------
def move_upper_left_p
unless @direction_fix
@direction = 7
end
distance = (2 ** @move_speed) / Math.sqrt(2)
turn_left unless up1(@x, @y, distance)
turn_up if @event
turn_up unless left1(@x, @y, distance) unless @event
turn_left if @event
end
#--------------------------------------------------------------------------
# ● 雅土右上移動
#--------------------------------------------------------------------------
def move_upper_right_p
unless @direction_fix
@direction = 9
end
distance = (2 ** @move_speed) / Math.sqrt(2)
turn_right unless up1(@x, @y, distance)
turn_up if @event
turn_up unless right1(@x, @y, distance) unless @event
turn_right if @event
end
end
end
class Sprite_Character < RPG::Sprite
def update
super
# 元件 ID、文件名、色相与现在的情况存在差异的情况下
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
# 记忆元件 ID 与文件名、色相
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
# 元件 ID 为有效值的情况下
if @tile_id >= 384
self.bitmap = RPG::Cache.tile($game_map.tileset_name,
@tile_id, @character.character_hue)
self.src_rect.set(0, 0, 32, 32)
self.ox = 16
self.oy = 32
# 元件 ID 为无效值的情况下
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / $c3_每一步的帧数
if $c3_总共可用的方向数==4
@ch = bitmap.height / 4
else
@ch = bitmap.height / 8
end
self.ox = @cw / 2
self.oy = @ch
end
end
# 设置可视状态
self.visible = (not @character.transparent)
# 图形是角色的情况下
if @tile_id == 0
# 设置传送目标的矩形
sx = @character.pattern * @cw
if $c3_总共可用的方向数==8
case @character.direction
when 2
sy = 0 * @ch
when 4
sy = 1 * @ch
when 6
sy = 2 * @ch
when 8
sy = 3 * @ch
when 1
sy = 4 * @ch
when 3
sy = 5 * @ch
when 7
sy = 6 * @ch
when 9
sy = 7 * @ch
end
else
sy = (@character.direction - 2) / 2 * @ch
end
self.src_rect.set(sx, sy, @cw, @ch)
end
# 设置脚本的坐标
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z(@ch)
# 设置不透明度、合成方式、茂密
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
# 动画
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
end
end
class Game_Character
def c8
# 随机 0~5 的分支
case rand(10)
when 0..3 # 随机
move_random
when 4 # 前进一步
move_forward
when 5 # 暂时停止
@stop_count = 0
when 6..9 #另外4方向随机
c4
end
end
def c4
case rand(5)
when 0
move_upper_left
when 1
move_upper_right
when 2
move_lower_left
when 3
move_lower_right
when 4
@stop_count = 0
end
end
def update
# 跳跃中、移动中、停止中的分支
if jumping?
update_jump
elsif moving?
update_move
else
update_stop
end
# 动画计数超过最大值的情况下
# ※最大值等于基本值减去移动速度 * 1 的值
if @anime_count > 16*4/$c3_每一步的帧数 - @move_speed * 2
# 停止动画为 OFF 并且在停止中的情况下
if not @step_anime and @stop_count > 0
# 还原为原来的图形
@pattern = @original_pattern
# 停止动画为 ON 并且在移动中的情况下
else
# 更新图形
@pattern = (@pattern + 1) % $c3_每一步的帧数
end
# 清除动画计数
@anime_count = 0
end
# 等待中的情况下
if @wait_count > 0
# 减少等待计数
@wait_count -= 1
return
end
# 强制移动路线的场合
if @move_route_forcing
# 自定义移动
move_type_custom
return
end
# 事件执行待机中并且为锁定状态的情况下
if @starting or lock?
# 不做规则移动
return
end
# 如果停止计数超过了一定的值(由移动频度算出)
if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
# 移动类型分支
case @move_type
when 1 # 随机
move_type_random
when 2 # 接近
move_type_toward_player
when 3 # 自定义
move_type_custom
end
end
end
end
class Window_Base < Window
def draw_actor_graphic(actor, x, y)
bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
cw = bitmap.width / $c3_每一步的帧数
ch = bitmap.height / $c3_总共可用的方向数
src_rect = Rect.new(0, 0, cw, ch)
self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
end
end
class Game_Character
#--------------------------------------------------------------------------
# ● 面向主角的方向
#--------------------------------------------------------------------------
def turn_toward_player
# 求得与主角的坐标差
sx = @x - $game_player.x
sy = @y - $game_player.y
# 坐标相等的场合下
if sx == 0 and sy == 0
return
end
# 横侧距离长的情况下
if sx.abs > sy.abs
# 将左右方向变更为朝向主角的方向
sx > 0 ? turn_left : turn_right
# 竖侧距离长的情况下
else
# 将上下方向变更为朝向主角的方向
sy > 0 ? turn_up : turn_down
end
if sx == -1 and sy == -1
@direction = 3
@stop_count = 0
elsif sx == -1 and sy == 1
@direction = 9
@stop_count = 0
elsif sx == 1 and sy == -1
@direction = 1
@stop_count = 0
elsif sx == 1 and sy == 1
@direction = 7
@stop_count = 0
end
end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
复制代码
[LINE]1,#dddddd[/LINE]
系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1