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

Project1

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

[已经解决] 有什么脚本可以判断键按一下放开和长按不放的

 关闭 [复制链接]

Lv4.逐梦者

梦石
3
星屑
6420
在线时间
1131 小时
注册时间
2007-12-26
帖子
2402
跳转到指定楼层
1
发表于 2009-10-28 13:40:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
用了全键盘脚本
比如写成这样: if Kboard.keyb($R_Key_D) == 1 无法区分D键是按了一下放开还是长按不放,我想区分一下
囡囚囨囚囨図囨囧

Lv1.梦旅人

梦石
0
星屑
64
在线时间
4352 小时
注册时间
2007-8-31
帖子
1982
2
发表于 2009-10-28 13:47:10 | 只看该作者
我真是王小二过年,一年不如一年。目前正在寻找状态中,努力找回当初的动力!
“底蕴制作者”—asperta最新博客开通!以后将在这里更新制作进度报告!
我的作品官网:http://www.asperta.org/
ASPERTA世界论坛:http://bbs.asperta.org/


回复 支持 反对

使用道具 举报

Lv1.梦旅人

~琉璃の雪~<

梦石
0
星屑
49
在线时间
36 小时
注册时间
2008-11-6
帖子
3678
3
发表于 2009-10-28 13:50:31 | 只看该作者
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
~现在开始自绘头像~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
3
星屑
6420
在线时间
1131 小时
注册时间
2007-12-26
帖子
2402
4
 楼主| 发表于 2009-10-28 14:11:15 | 只看该作者
http://rpg.blue/viewthread.php?tid=33028&highlight=%E5%85%A8%E9%94%AE%E7%9B%98
asperta 发表于 2009-10-28 13:47



知道了。。。press是长按?trigger是短按?repeat什么意思?连按??
囡囚囨囚囨図囨囧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
61 小时
注册时间
2006-9-15
帖子
946
5
发表于 2009-10-28 17:53:11 | 只看该作者
repeat是再按一次。。把英文翻译下就知道了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-28 19:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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