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

Project1

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

[已经解决] 如何设置当角色与地形标记为7的图块儿“接触时”执行某....

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1308
在线时间
354 小时
注册时间
2009-9-14
帖子
328
跳转到指定楼层
1
发表于 2015-2-26 00:18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如何设置当角色与地形标记为7的图块儿“接触时”执行某公共事件,,,
谢谢!

评分

参与人数 1星屑 +35 收起 理由
︶ㄣ牛排ぶ + 35 手动认可奖励

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1308
在线时间
354 小时
注册时间
2009-9-14
帖子
328
2
 楼主| 发表于 2015-2-26 00:23:50 | 只看该作者
这有个当165号开关打开时,主角与不可通行的图块儿接触时执行公共事件的脚本

#==============================================================================
# ■ Game_Character (分割定义 1)
#------------------------------------------------------------------------------
#  处理角色的类。本类作为 Game_Player 类与 Game_Event
# 类的超级类使用。
#==============================================================================

class Game_Character
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :id                       # ID
  attr_reader   :x                        # 地图 X 坐标 (理论坐标)
  attr_reader   :y                        # 地图 Y 坐标 (理论坐标)
  attr_reader   :real_x                   # 地图 X 坐标 (实际坐标 * 128)
  attr_reader   :real_y                   # 地图 Y 坐标 (实际坐标 * 128)
  attr_reader   :tile_id                  # 元件 ID  (0 为无效)
  attr_reader   :character_name           # 角色 文件名
  attr_reader   :character_hue            # 角色 色相
  attr_reader   :opacity                  # 不透明度
  attr_reader   :blend_type               # 合成方式
  attr_reader   :direction                # 朝向
  attr_reader   :pattern                  # 图案
  attr_reader   :move_route_forcing       # 移动路线强制标志
  attr_reader   :through                  # 穿透
  attr_accessor :animation_id             # 动画 ID
  attr_accessor :transparent              # 透明状态
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @id = 0
    @x = 0
    @y = 0
    @real_x = 0
    @real_y = 0
    @tile_id = 0
    @character_name = ""
    @character_hue = 0
    @opacity = 255
    @blend_type = 0
    @direction = 2
    @pattern = 0
    @move_route_forcing = false
    @through = false
    @animation_id = 0
    @transparent = false
    @original_direction = 2
    @original_pattern = 0
    @move_type = 0
    @move_speed = 4
    @move_frequency = 6
    @move_route = nil
    @move_route_index = 0
    @original_move_route = nil
    @original_move_route_index = 0
    @walk_anime = true
    @step_anime = false
    @direction_fix = false
    @always_on_top = false
    @anime_count = 0
    @stop_count = 0
    @jump_count = 0
    @jump_peak = 0
    @wait_count = 0
    @locked = false
    @prelock_direction = 0
  end
  #--------------------------------------------------------------------------
  # ● 移动中判定
  #--------------------------------------------------------------------------
  def moving?
    # 如果在移动中理论坐标与实际坐标不同
    return (@real_x != @x * 128 or @real_y != @y * 128)
  end
  #--------------------------------------------------------------------------
  # ● 跳跃中判定
  #--------------------------------------------------------------------------
  def jumping?
    # 如果跳跃中跳跃点数比 0 大
    return @jump_count > 0
  end
  #--------------------------------------------------------------------------
  # ● 矫正姿势
  #--------------------------------------------------------------------------
  def straighten
    # 移动时动画以及停止动画为 ON 的情况下
    if @walk_anime or @step_anime
      # 设置图形为 0
      @pattern = 0
    end
    # 清除动画计数
    @anime_count = 0
    # 清除被锁定的向前朝向
    @prelock_direction = 0
  end
  #--------------------------------------------------------------------------
  # ● 强制移动路线
  #     move_route : 新的移动路线
  #--------------------------------------------------------------------------
  def force_move_route(move_route)
    # 保存原来的移动路线
    if @original_move_route == nil
      @original_move_route = @move_route
      @original_move_route_index = @move_route_index
    end
    # 更改移动路线
    @move_route = move_route
    @move_route_index = 0
    # 设置强制移动路线标志
    @move_route_forcing = true
    # 清除被锁定的向前朝向
    @prelock_direction = 0
    # 清除等待计数
    @wait_count = 0
    # 自定义移动
    move_type_custom
  end
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x : X 坐标
  #     y : Y 坐标
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    # 求得新的坐标
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    # 坐标在地图以外的情况
    unless $game_map.valid?(new_x, new_y)
      # 不能通行
      return false
    end
    # 穿透是 ON 的情况下
    if @through
      # 可以通行
      return true
    end
    # 移动者的元件无法来到指定方向的情况下
    unless $game_map.passable?(x, y, d, self)
          if $game_switches[165]==true
                  if self.is_a?(Game_Player)
                    $game_temp.common_event_id = 52
                  end
          end
      # 通行不可
      return false
    end
    # 从指定方向不能进入到移动处的元件的情况下
    unless $game_map.passable?(new_x, new_y, 10 - d)
                if $game_switches[165]==true
                  if self.is_a?(Game_Player)
                    $game_temp.common_event_id = 52
                  end
                  end
      # 不能通行
      return false
    end
    # 循环全部事件
    for event in $game_map.events.values
      # 事件坐标于移动目标坐标一致的情况下
      if event.x == new_x and event.y == new_y
        # 穿透为 ON
        unless event.through
          # 自己就是事件的情况下
          if self != $game_player
            # 不能通行
            return false
          end
          # 自己是主角、对方的图形是角色的情况下
          if event.character_name != ""
                            if $game_switches[165]==true
                  if self.is_a?(Game_Player)
                    $game_temp.common_event_id = 52
                  end
                  end
            # 不能通行
            return false
          end
        end
      end
    end
    # 主角的坐标与移动目标坐标一致的情况下
    if $game_player.x == new_x and $game_player.y == new_y
      # 穿透为 ON
      unless $game_player.through
        # 自己的图形是角色的情况下
        if @character_name != ""
          return false
        end
      end
    end
    # 可以通行
    return true
  end
  #--------------------------------------------------------------------------
  # ● 锁定
  #--------------------------------------------------------------------------
  def lock
    # 如果已经被锁定的情况下
    if @locked
      # 过程结束
      return
    end
    # 保存锁定前的朝向
    @prelock_direction = @direction
    # 保存主角的朝向
    turn_toward_player
    # 设置锁定中标志
    @locked = true
  end
  #--------------------------------------------------------------------------
  # ● 锁定中判定
  #--------------------------------------------------------------------------
  def lock?
    return @locked
  end
  #--------------------------------------------------------------------------
  # ● 解除锁定
  #--------------------------------------------------------------------------
  def unlock
    # 没有锁定的情况下
    unless @locked
      # 过程结束
      return
    end
    # 清除锁定中标志
    @locked = false
    # 没有固定朝向的情况下
    unless @direction_fix
      # 如果保存了锁定前的方向
      if @prelock_direction != 0
        # 还原为锁定前的方向
        @direction = @prelock_direction
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动到指定位置
  #     x : X 坐标
  #     y : Y 坐标
  #--------------------------------------------------------------------------
  def moveto(x, y)
    @x = x % $game_map.width
    @y = y % $game_map.height
    @real_x = @x * 128
    @real_y = @y * 128
    @prelock_direction = 0
  end
  #--------------------------------------------------------------------------
  # ● 获取画面 X 坐标
  #--------------------------------------------------------------------------
  def screen_x
    # 通过实际坐标和地图的显示位置来求得画面坐标
    return (@real_x - $game_map.display_x + 3) / 4 + 16
  end
  #--------------------------------------------------------------------------
  # ● 获取画面 Y 坐标
  #--------------------------------------------------------------------------
  def screen_y
    # 通过实际坐标和地图的显示位置来求得画面坐标
    y = (@real_y - $game_map.display_y + 3) / 4 + 32
    # 取跳跃计数小的 Y 坐标
    if @jump_count >= @jump_peak
      n = @jump_count - @jump_peak
    else
      n = @jump_peak - @jump_count
    end
    return y - (@jump_peak * @jump_peak - n * n) / 2
  end
  #--------------------------------------------------------------------------
  # ● 获取画面 Z 坐标
  #     height : 角色的高度
  #--------------------------------------------------------------------------
  def screen_z(height = 0)
    # 在最前显示的标志为 ON 的情况下
    if @always_on_top
      # 无条件设置为 999
      return 999
    end
    # 通过实际坐标和地图的显示位置来求得画面坐标
    z = (@real_y - $game_map.display_y + 3) / 4 + 32
    # 元件的情况下
    if @tile_id > 0
      # 元件的优先不足 * 32
      return z + $game_map.priorities[@tile_id] * 32
    # 角色的场合
    else
      # 如果高度超过 32 就判定为满足 31
      return z + ((height > 32) ? 31 : 0)
    end
  end
  #--------------------------------------------------------------------------
  # ● 取得繁茂
  #--------------------------------------------------------------------------
  def bush_depth
    # 是元件、并且在最前显示为 ON 的情况下
    if @tile_id > 0 or @always_on_top
      return 0
    end
    # 在跳跃以外的状态时繁茂处元件的属性为 12,除此之外为 0
    if @jump_count == 0 and $game_map.bush?(@x, @y)
      return 12
    else
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 取得地形标记
  #--------------------------------------------------------------------------
  def terrain_tag
    return $game_map.terrain_tag(@x, @y)
  end
end
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1308
在线时间
354 小时
注册时间
2009-9-14
帖子
328
3
 楼主| 发表于 2015-2-26 12:07:05 | 只看该作者
呼叫大神,,,
@你最珍贵
回复 支持 反对

使用道具 举报

Lv2.观梦者

故九江太守

梦石
0
星屑
612
在线时间
2167 小时
注册时间
2012-12-5
帖子
4464
4
发表于 2015-2-27 01:27:32 | 只看该作者
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Character (分割定义 2)
  3. #------------------------------------------------------------------------------
  4. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  5. # 类的超级类使用。
  6. #==============================================================================
  7.  
  8. class Game_Character
  9.   #--------------------------------------------------------------------------
  10.   # ● 刷新画面
  11.   #--------------------------------------------------------------------------
  12.   def update
  13.     ex = $game_player.x
  14.     ey = $game_player.y
  15.     if $game_player.direction == 2
  16.       ey -= 1
  17.     elsif $game_player.direction == 4
  18.       ex -= 1
  19.     elsif $game_player.direction == 6
  20.       ex += 1
  21.     elsif $game_player.direction == 8
  22.       ey += 1
  23.     end
  24.     if $game_map.terrain_tag(ex, ey) == 7
  25.       $game_temp.common_event_id = 15
  26.     end

有点蠢的方法,供参考

评分

参与人数 1梦石 +1 收起 理由
︶ㄣ牛排ぶ + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1308
在线时间
354 小时
注册时间
2009-9-14
帖子
328
5
 楼主| 发表于 2015-2-27 12:57:27 | 只看该作者
角色接触之后公共事件会一直执行个没完,,,
如何能让他像地图上的与事件接触那样?角色松开方向键就不执行了?谢谢。

点评

CR~
算了,这样就可以了,十分感谢!  发表于 2015-2-27 13:15
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1308
在线时间
354 小时
注册时间
2009-9-14
帖子
328
6
 楼主| 发表于 2015-2-27 13:22:36 | 只看该作者
你最珍贵 发表于 2015-2-27 01:27
#==============================================================================
# ■ Game_Character  ...

感觉这么弄有点儿太怪异了,,,有时候主角还没走到图块那就执行公共事件了,,,
还是弄成像二楼那样的撞击吧,,,
如何弄成
当主角撞到地形标记为7的障碍物时执行公共事件。。。?
谢谢!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
53 小时
注册时间
2011-3-19
帖子
77
7
发表于 2015-2-27 14:56:48 | 只看该作者
游戏一开始打开一个开关,然后公共事件里面设定并行处理,条件就是这个开关。变量=地形标记,条件分歧……
回复 支持 反对

使用道具 举报

Lv2.观梦者

故九江太守

梦石
0
星屑
612
在线时间
2167 小时
注册时间
2012-12-5
帖子
4464
8
发表于 2015-2-27 22:54:22 | 只看该作者
要撞击才执行?刚刚想到一个比较好的,看我改的地方,自己改一下
  1.   #--------------------------------------------------------------------------
  2.   # ● 向上移动
  3.   #     turn_enabled : 本场地位置更改许可标志
  4.   #--------------------------------------------------------------------------
  5.   def move_up(turn_enabled = true)
  6.     # 面向上
  7.     if turn_enabled
  8.       turn_up
  9.     end
  10.     # 可以通行的情况下
  11.     if passable?(@x, @y, 8)
  12.       # 面向上
  13.       turn_up
  14.       # 更新坐标
  15.       @y -= 1
  16.       # 歩数増加
  17.       increase_steps
  18.     # 不能通行的情况下
  19.     else
  20.       #--------------Ethanwon
  21.       ex = $game_player.x
  22.       ey = $game_player.y
  23.       ey -= 1
  24.       if $game_map.terrain_tag(ex, ey) == 7
  25.         $game_temp.common_event_id = 15
  26.       end
  27.       #--------------Ethanwon
  28.       # 接触事件的启动判定
  29.       check_event_trigger_touch(@x, @y-1)
  30.     end
  31.   end
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 04:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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