赞 | 0 |
VIP | 258 |
好人卡 | 2 |
积分 | 0 |
经验 | 11030 |
最后登录 | 2016-8-20 |
在线时间 | 36 小时 |
Lv1.梦旅人 ~琉璃の雪~<
- 梦石
- 0
- 星屑
- 49
- 在线时间
- 36 小时
- 注册时间
- 2008-11-6
- 帖子
- 3678
|
http://rpg.blue/viewthread.php?tid=126277&highlight=
最后是 按住键盘的 D 键实现蓄力攻击的实现
基本思路是
判断按键蓄力->蓄力过程在主角身让显示循环动画->蓄力成功->
消失循环动画->主角身上建立一个可穿透的事件(火焰弹?)->
火焰弹朝主角所在的方向快速的移动->火焰弹在移动的过程中接触到敌人->
消失事件(火焰弹)->敌人身上播放挨打动画->如果没有接触到敌人->
飞到地图边缘则自动消失
首先我们要实现的是 蓄力
我们要在Game_Player类里面 设置一个@power的变量
用来记录蓄力的强度
接着我们 打开全键盘脚本
看 self.repeat?(rkey) 这个方法
全键盘里面的repeat?方法 是判断安下某键一定时间 默认为20贞
它会判断是否达到20贞 如果达到了 则返回true
我们这里来改造一下
我们把它改造成 按下就有效 松开就无效
其实我们只要把以下这段删除
if $R_Key_Repeat[rkey] >= 20
$R_Key_Repeat[rkey] = 0
return true
else
return false
end
改成
return $R_Key_Repeat[rkey]
就可以了
这样可以返回按了多少贞
然后再Game_Player 的update 加入判断就可以了
if SmInput.repeat?(SmInput:) > 0
@power += 1
@loop_animation_id = 92
@looping_ani = true
else
if @power >= 30
fire(@direction)
end
@power = 0
@looping_ani = false
end
当按着的时候 @power 一值增加
挡松开的时候 只要 @power >= 30 则蓄力成功
@loop_animation_id = 92 是循环动画
只要往 Game_Character 的 update 里面添加上循环动画判断就可以支持了
@character.effect = self.effect?
# 循环动画
if @character.loop_animation_id != 0
loop_animation($data_animations[@character.loop_animation_id])
@character.loop_animation_id = 0
end
if @_loop_animation != nil and @character.looping_ani == false
stop_loop_animation
end
加入一个停止动画的方法
def stop_loop_animation
loop_animation(nil)
end
Game_Character 里加入几个实变量并设属性
class Game_Character
attr_accessor :effect
attr_accessor :loop_animation_id
attr_accessor :looping_ani
attr_accessor :move_speed
attr_accessor :through
alias ri_initialize :initialize
def initialize
ori_initialize
@effect = false
@loop_animation_id = 0
@looping_ani = false
end
end
如此就能播放循环动画了 如果松开D键盘 @power 大于30 则发动成功
if @power >= 30
fire(@direction)
end
fire 方法具体则是建立一个名为"火"的事件 然后顺着方向移动(发射)
地图建立事件的方法其实就是在
Game_Map的 hash对象 @events 里面添加一个 RPG::Event 对象
然后把一些基本属性建立起来就可以了
地图上删除一个事件 也是一样的 把hash对象@events里面删除掉就可以了
具体请看 add_event 方法 这里就不多说了
当然建立和删除之后需要重载以下地图的 @spriteset对象
只要释放一次 建立一次即可 参考 reload_spriteset 方法
建立完之后需要发射 也就是移动事件
其实很简单 需要移动几格 就执行几次 移动的方法
def fire(d)
# 根据player方位来建立名为[火]的事件 然后顺着player方向移动
# 移动次数根据离map边缘坐标决定
name = "fire"
case d
when 2
id = $game_map.add_event(@x,@y,"火",name)
($game_map.height-@y).times{$game_map.events[id].move_down}
when 4
id = $game_map.add_event(@x,@y,"火",name)
@x.times{$game_map.events[id].move_left}
when 6
id = $game_map.add_event(@x,@y,"火",name)
($game_map.width-@x).times{$game_map.events[id].move_right}
when 8
id = $game_map.add_event(@x,@y,"火",name)
@y.times{$game_map.events[id].move_up}
end
end
这是完整的fire方法
id = $game_map.add_event(@x,@y,"火",name)
在当前主角的坐标 建立名为火的事件 name 则是行走图文件名
返回是这个事件的id
($game_map.height-@y).times{$game_map.events[id].move_down}
根据id 来实现 事件的移动
移动次数为 $game_map.height-@y 次
这样是表示 移动到地图的边界
最后....只要在Game_Map的update中 捕捉到 "火"的事件存在
并且判断是否击中敌人 或者 走到了边界
判断是否击中敌人 其实只要判断坐标是否一致
一般情况下用@x,@y 来判断
@x,@y 1表示1格 但是 这里不能用这个来判断
应该移动中变化的是 real_x 和 real_y 因为 @x,@y是直接指定的
所以只要判断 事件"火"的 real_x 和 real_y 移动中 是否有事件的坐标和其相等
判断到就在其时间上播放挨打动画 并删除"火"的时间
没有判断到 移动到边界就 删除"火"的事件
具体代码如下:
#--------------------------------------------------------------------------
# ● update 别名
#--------------------------------------------------------------------------
alias ri_update :update
def update
ori_update
# 检测地图上是否存在名为[火]的事件
if (id=check_event_name("火")) != 0
# 获取 [火] 的real_x和real_y
real_x,real_y = @events[id].real_x,@events[id].real_y
# 检测地图上是否有事件被[火]碰撞(击中),返回事件id
target_id = check_event_id(real_x,real_y)
# 击中的情况下
if target_id != 0
# 事件上播放挨打动画
show_event_ani(target_id,4)
# 删除[火]的事件
delete_event(id)
return
end
# 碰到边界消失
case @events[id].direction
when 4
if @events[id].real_x == 0
delete_event(id)
end
when 6
if @events[id].real_x >= $game_map.width*128-128
delete_event(id)
end
when 8
if @events[id].real_y == 0
delete_event(id)
end
when 2
if @events[id].real_y >= $game_map.height*128-128
delete_event(id)
end
end
end
end
hide秀 发表于 2009-6-3 08:46 |
|