查看: 2898|回复: 7

[已经解决] 【制作真的门】门遮挡 门正确遮挡 门通行

[复制链接]
梦石
0
星屑
12824
在线时间
1010 小时
注册时间
2019-11-5
回帖
2329

极短27参与极短25参与极短24参与

发表于 2021-12-26 21:06:44 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 哇哇哇啊叭叭 于 2021-12-27 07:15 编辑

  这里贴一下我的解决办法。
  经测试发现,我实际要实现的功能,跟【如果玩家位置上事件名含“door”  则仅禁止向下通行】这个表述并不相符 。准确表述应是:【当门关闭时:人无法通过,且人在门后则被挡住、人在门前则挡住门】
1. 黏贴下列代码
[pre lang="ruby"]

#==============================================================================
# ■ Game Event
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor   :door                  # 标记
  #--------------------------------------------------------------------------
  # ● 获取画面 Z 坐标
  #--------------------------------------------------------------------------
  def screen_z
    door&&(y>=$game_player.y) ? 200 : @priority_type * 100
  end
  alias what_setup_page_settings setup_page_settings
  def setup_page_settings
    what_setup_page_settings
    return if @list == nil
    for command in @list
      if command.code == 108
        if command.parameters[0] =~ /<door = (.*)>/
          @door = $1.to_s
        end
      end
    end
  end
  
end
#encoding:utf-8
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  地图人物的精灵。根据 Game_Character 类的实例自动变化。
#==============================================================================

class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 更新源位图(Source Bitmap)
  #--------------------------------------------------------------------------
  def update_bitmap
    if graphic_changed?
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_index = @character.character_index
      @tile_id > 0 ? set_tile_bitmap : set_character_bitmap
      
      if character.is_a?(Game_Event) && character.list && character.door
        self.bitmap = Cache.character(character.door)
        sign = @character_name[/^[\!\$]./]
        if sign && sign.include?('$')
          @cw = bitmap.width / 3
          @ch = bitmap.height / 4
        else
          @cw = bitmap.width / 12
          @ch = bitmap.height / 8
        end
        self.ox = @cw / 2
        self.oy = @ch
        index = @character.character_index
        pattern = @character.pattern < 3 ? @character.pattern : 1
        sx = (index % 4 * 3 + pattern) * @cw
        sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
        self.src_rect.set(sx, sy, @cw, @ch)
      end
      
    end
  end
end


[/pre]

2. 在事件页中写上备注<door = !Door2>
目前没发现在一个字段中,分别截取字符串和数字的方法,否则的话,还可以自定义行走图索引
  

3. 将关好的门设置为一个在人物下方、仅禁止向下移动的图块
在游戏读取位图时,图块的通行信息将被保留,但显示效果却使用门板的造型
  

4. 像往常一样设置门扉
  让门可以被玩家打开、关闭,具体方法就不说了
  

  这样就完成了一个真实的门扉!!为什么 不使用“修改行走图”那句代码呢?因为,一旦使用了它,图块的通行信息也将被修改,这样就与“直接使用门扉造型”并无二至了。写完之后,觉得代码很长,操作也比较麻烦。今后如果能读到更好的知识,再给它减肥吧...

  感谢2楼、3楼的大佬回答!!
  分别解决了功能问题、解释了代码原理。



  [check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)]是什么意思?
  如题。获取这个问题,主要是为了实现【如果玩家位置上事件名含“door”  则仅禁止向下通行】的功能,如果有大神能直接通过代码实现这个功能,咱也可以不问这个问题啦


目前知道:
【1 << (d / 2 - 1)】代表二进制1向左移动0或1或2或3位,对应得出得出十进制1、2、4、8,二进制0001、0010、0100、1000
【0x0f】是15
【 (1 << (d / 2 - 1)) & 0x0f】计算后分别得1、2、4、8

那么将上面的值 &0x0f 运算是什么意思呢?

风继续吹,不忍远离。年少轻狂,眼神明亮,最好的年纪,最好的时光。希望岁月是一场春梦
梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2021-12-27 00:24:39 | 显示全部楼层
实现【如果玩家位置上事件名含“door”  则仅禁止向下通行】的功能

[pre lang="ruby"]
class Game_Event
  attr_reader :event
end

class Game_Player
  alias cld99_aliased_passable? passable?
  def passable?(x, y, d)
    has_door = $game_map.events_xy(x, y).find { |e| e.event.name.include?('door') }
    return false if d == 2 && has_door
    cld99_aliased_passable?(x, y, d)
  end
end
[/pre]

点评

谢谢大佬!回头下班测试测试~  发表于 2021-12-27 10:59

评分

参与人数 1星屑 +100 收起 理由
alexncf125 + 100 版主认可的优秀回答

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

梦石
0
星屑
2419
在线时间
411 小时
注册时间
2021-11-7
回帖
171
发表于 2021-12-27 00:24:59 | 显示全部楼层
本帖最后由 夏虫沉默 于 2021-12-27 00:40 编辑

&这个符号应该是与运算,f的二进制是1111,0001:0010:0100:1000和1111的与运算是其本身,只有两边都是1与运算才是1,例如1010和0111的与运算就是0010,也就是十进制的2。这个d不知道是不是direction,2,4,6,8,运算结果分别为1,2,4,8。

点评

3Q!~  发表于 2021-12-27 11:44

评分

参与人数 1星屑 +30 收起 理由
alexncf125 + 30 塞糖

查看全部评分

欲速春风山劝阻,不得恰恰不得呼。
回复 1 0

使用道具 举报

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
回帖
1175
发表于 2021-12-27 12:54:47 | 显示全部楼层
话说npc也无法通过吗

点评

npc是无效的,它们只会挡住门  发表于 2021-12-27 13:50
汗  发表于 2021-12-27 13:49
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部