本帖最后由 贰逼 于 2017-1-23 13:34 编辑 
第三人称游戏都有一个由引擎控制的第三人称控制器,那么这在Minecraft中能否实现?
只能说达到一半。
第三人称控制器(Third Person Controller)是角色控制器的一种,较比第一人称控制器可以反映更多信息包括角色的建模/动画/行为,以及更加多样的操作模式。第三人称控制器最近的一个例子就是Minecraft中的F5视角,即第三人称视角。
当然比起像Minecraft这种可以直接依赖实时演算的第三人称控制器,这篇帖子里所讲的是对于目前Minecraft原版来说依靠命令方块力所能及的控制器。具体来讲,就是没有进行三维旋转的功能。原因很简单,一是无法使用相关函数,二是穷举即使精度为5°的三维旋转也特别消耗资源。
总体来说,Minecraft原版最大限度可以还原一款2.5D游戏。
所以这篇帖子讨论的第三人称控制器是基于玩家视角不动,但是能通过自身操作操作非关联自身的实体角色(什么叫关联自身其实很明白,就是利用execute指令对玩家的原始坐标相对操作。例如你可以使用/execute @p ~ ~ ~ tp @e[tag=Character] ~ ~-5 ~制作一个最简单的关联自身的控制器)
一个gif展示:(15.7M,耐心加载)
只能说达到一半。
第三人称控制器(Third Person Controller)是角色控制器的一种,较比第一人称控制器可以反映更多信息包括角色的建模/动画/行为,以及更加多样的操作模式。第三人称控制器最近的一个例子就是Minecraft中的F5视角,即第三人称视角。
当然比起像Minecraft这种可以直接依赖实时演算的第三人称控制器,这篇帖子里所讲的是对于目前Minecraft原版来说依靠命令方块力所能及的控制器。具体来讲,就是没有进行三维旋转的功能。原因很简单,一是无法使用相关函数,二是穷举即使精度为5°的三维旋转也特别消耗资源。
总体来说,Minecraft原版最大限度可以还原一款2.5D游戏。
所以这篇帖子讨论的第三人称控制器是基于玩家视角不动,但是能通过自身操作操作非关联自身的实体角色(什么叫关联自身其实很明白,就是利用execute指令对玩家的原始坐标相对操作。例如你可以使用/execute @p ~ ~ ~ tp @e[tag=Character] ~ ~-5 ~制作一个最简单的关联自身的控制器)
一个gif展示:(15.7M,耐心加载)

Demo截图:
基本实现了角色移动,角色切换。

点击按钮进入游戏

F1关闭游戏GUI以获得最佳体验

WASD移动

绿柱用于切换角色


物品栏中单击下图的Exit退出游戏

按键操作事件的监听
在正式开始讲之前,我们先要来了解一下原理。
而在了解原理之前,我们需要了解一个概念:事件监听
拿一个按钮作为例子,比如你的登录器,你点击"Play"按钮,这个按钮就会发生这个叫做OnClick的事件。事件监听就是内部检测这个事件。进行事件监听并监听到该事件的发生即可关联或调用相关操作。
你的鼠标按左键也有三种事件(OnMouseDown()鼠标刚按下、OnMouse()鼠标按下的状态、OnMouseUp()鼠标刚松开),这些事件都可以被内部监听。

而要在Minecraft中做到各种事件监听,要结合各种各样的方法:

假设玩家在其立足点坐标中心,也就是(x.500,y.000,z.500),面向z+方向

检测按下'W'(向前/x+方向),就是检测玩家对于前方的蓝色方块距离是否缩小,也就是要相对玩家向前检测前方距离<0.5是否为蓝色方块:
同理,按下'A''S''D'就是相对玩家向各方向检测距离<0.5是否为相应方块
至于为什么用0.49999999999995,这是因为float的限制,就相当于0.49999999999995无限接近0.5,只要玩家向前移动了0.00000000000005格就能被检测到。
除了上述逐个检测的方法外,我们可以更加简化地,检测玩家向各方向的顶部是否为空气:

(四个彩块都代表空气)拿前进为例,由于头顶上是一个存在的方块,玩家没有前进时检测前方空气距离<0.5为空气不成立,只有玩家向前移动后与前方空气的距离才会<0.5。以此类推,各方向都可以直接靠检测空气实现监听。
对应的指令为:
有关detect之后的操作将会在后面"移动操作"中进一步讲解
也就是当玩家刚刚起跳检测黑块的位置是空气来实现监听

为什么分开来讲?因为在第三人称控制中,Space不止作为移动的跳跃键,也可以是一个功能键,具体detect后的操作在后面"其他操作"中进一步讲解
点击这篇帖子查看原理讲解
同样检测后的操作在后面"其他操作"中进一步讲解
移动操作
具体内容就是将角色移动后再改变角色所面朝的方向(tag=character表示操作的角色)
首先建立一个moved计分板/dummy,并将其用stats关联到实体:这样只要对实体进行操作,moved计分板就会有分数。
接下来就是重置的工作了首先是固定玩家的视角到(dx,dy)(可自定义,即玩家视角望向的方向)。当检测到moved有分数,就传送玩家到(x,~,z)(可自定义,即玩家固定的坐标,也就是前面使用玩家头颅代表的玩家立足点中心坐标),然后重置moved。
并且移动操作监听其实并非并列进行,这是由于链式模块都有单向顺序,刷新周期0.05s,而Minecraft中实际的玩家移动是Update同步进行,模块执行和实际玩家移动存在时间差。总的来说如果使用了不恰当的玩家移动监听顺序,某些方向的移动监听也许会失去效果。
最后的恰当顺序请看"最终指令"。
其他操作
检测(x,y,z)是否没有红石块再放置红石块来激活模块(这样做是为了防止一个需要延迟操作时间的模块在短时间内被反复调用。例如跳跃需要时间下落,如果在下落过程中继续跳跃,这不就等于无限续跳了吗)
作为一个Minecraft的移动键,同样也受执行顺序影响。最后的恰当顺序请看"最终指令"。
在(x,y,z)用红石块激活指定模块
例如右键可以靠胡萝卜钓竿的使用监听,左键可以靠对实体的伤害监听;
数字键123456789可以靠NBT-SelectedItemSlot;
还有等等等等都可以靠各种方法监听。
优化
其实这个视角卡顿就是因为模块执行和实际玩家移动检测存在时间差,因此在你移动后因为又被tp会原始点,你的视角将疯狂摇晃。
解决方法就是降低玩家移动速度,这就是我们需要强行让玩家穿上一个靴子:降低玩家速度到-0.099999,这样玩家可以存在轻微的移动,但是你看不出来你的位置在变化。
隐藏玩家的手
你也可以选择让玩家F1隐藏GUI,提升游戏体验性。
最终指令

Start 游戏开始部分:
Control 事件监听和操作:
End 游戏结束部分:
如果你使用上述指令,那么模块的摆放也有相应要求,具体看"Demo&源码资源"
Demo&源码资源
Demo地址:百度网盘
.pcb文件打包地址:百度网盘
关于.pcb转为OOC后的摆放顺序:

为了方便伸手党copy,你需要在z+方向依次摆上:Control()、Start()、End()
每一行之间隔一格。
此贴实际研究时间数个月前,而且感谢地图《A Day to Remember》给予的2.5D第三人称操作灵感。
第三人称游戏都有一个由引擎控制的第三人称控制器,那么这在Minecraft中能否实现?
只能说达到一半。
第三人称控制器(Third Person Controller)是角色控制器的一种,较比第一人称控制器可以反映更多信息包括角色的建模/动画/行为,以及更加多样的操作模式。第三人称控制器最近的一个例子就是Minecraft中的F5视角,即第三人称视角。
当然比起像Minecraft这种可以直接依赖实时演算的第三人称控制器,这篇帖子里所讲的是对于目前Minecraft原版来说依靠命令方块力所能及的控制器。具体来讲,就是没有进行三维旋转的功能。原因很简单,一是无法使用相关函数,二是穷举即使精度为5°的三维旋转也特别消耗资源。
总体来说,Minecraft原版最大限度可以还原一款2.5D游戏。
所以这篇帖子讨论的第三人称控制器是基于玩家视角不动,但是能通过自身操作操作非关联自身的实体角色(什么叫关联自身其实很明白,就是利用execute指令对玩家的原始坐标相对操作。例如你可以使用/execute @p ~ ~ ~ tp @e[tag=Character] ~ ~-5 ~制作一个最简单的关联自身的控制器)
一个gif展示:(15.7M,耐心加载)
2021.12 数据,可能有更多内容
第三人称游戏都有一个由引擎控制的第三人称控制器,那么这在Minecraft中能否实现?只能说达到一半。
第三人称控制器(Third Person Controller)是角色控制器的一种,较比第一人称控制器可以反映更多信息包括角色的建模/动画/行为,以及更加多样的操作模式。第三人称控制器最近的一个例子就是Minecraft中的F5视角,即第三人称视角。
当然比起像Minecraft这种可以直接依赖实时演算的第三人称控制器,这篇帖子里所讲的是对于目前Minecraft原版来说依靠命令方块力所能及的控制器。具体来讲,就是没有进行三维旋转的功能。原因很简单,一是无法使用相关函数,二是穷举即使精度为5°的三维旋转也特别消耗资源。
总体来说,Minecraft原版最大限度可以还原一款2.5D游戏。
所以这篇帖子讨论的第三人称控制器是基于玩家视角不动,但是能通过自身操作操作非关联自身的实体角色(什么叫关联自身其实很明白,就是利用execute指令对玩家的原始坐标相对操作。例如你可以使用/execute @p ~ ~ ~ tp @e[tag=Character] ~ ~-5 ~制作一个最简单的关联自身的控制器)
一个gif展示:(15.7M,耐心加载)

Demo截图:
基本实现了角色移动,角色切换。

点击按钮进入游戏

F1关闭游戏GUI以获得最佳体验

WASD移动

绿柱用于切换角色


物品栏中单击下图的Exit退出游戏

按键操作事件的监听
- 大前提
 
在正式开始讲之前,我们先要来了解一下原理。
而在了解原理之前,我们需要了解一个概念:事件监听
拿一个按钮作为例子,比如你的登录器,你点击"Play"按钮,这个按钮就会发生这个叫做OnClick的事件。事件监听就是内部检测这个事件。进行事件监听并监听到该事件的发生即可关联或调用相关操作。
你的鼠标按左键也有三种事件(OnMouseDown()鼠标刚按下、OnMouse()鼠标按下的状态、OnMouseUp()鼠标刚松开),这些事件都可以被内部监听。

而要在Minecraft中做到各种事件监听,要结合各种各样的方法:
- WASD移动事件
 

假设玩家在其立足点坐标中心,也就是(x.500,y.000,z.500),面向z+方向

检测按下'W'(向前/x+方向),就是检测玩家对于前方的蓝色方块距离是否缩小,也就是要相对玩家向前检测前方距离<0.5是否为蓝色方块:
代码:
- /execute @a[tag=Controlling] ~ ~ ~ detect ~ ~ ~0.49999999999995 wool 11
代码:
- /execute @a[tag=Controlling] ~ ~ ~ detect ~ ~ ~-0.49999999999995 wool 4
代码:
- /execute @a[tag=Controlling] ~ ~ ~ detect ~0.49999999999995 ~ ~ wool 5
代码:
- /execute @a[tag=Controlling] ~ ~ ~ detect ~-0.49999999999995 ~ ~ wool 1
除了上述逐个检测的方法外,我们可以更加简化地,检测玩家向各方向的顶部是否为空气:

(四个彩块都代表空气)拿前进为例,由于头顶上是一个存在的方块,玩家没有前进时检测前方空气距离<0.5为空气不成立,只有玩家向前移动后与前方空气的距离才会<0.5。以此类推,各方向都可以直接靠检测空气实现监听。
对应的指令为:
代码:
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~0.49999999999995 air 0
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~-0.49999999999995 air 0
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~0.49999999999995 ~2 ~ air 0
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~-0.49999999999995 ~2 ~ air 0
有关detect之后的操作将会在后面"移动操作"中进一步讲解
- Space空格事件
 
代码:
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2.99999 ~ air 0

为什么分开来讲?因为在第三人称控制中,Space不止作为移动的跳跃键,也可以是一个功能键,具体detect后的操作在后面"其他操作"中进一步讲解
- Shift事件
 
点击这篇帖子查看原理讲解
同样检测后的操作在后面"其他操作"中进一步讲解
移动操作
- 基本操作
 
代码:
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ detect ~ ~1 ~0.9 air 0 tp @e[tag=character] ~ ~ ~0.6
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 0 ~
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~-0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ detect ~ ~1 ~-0.9 air 0 tp @e[tag=character] ~ ~ ~-0.6
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2 ~-0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 180 ~
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ detect ~0.9 ~1 ~ air 0 tp @e[tag=character] ~0.6 ~ ~
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ -90 ~
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~-0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ detect ~-0.9 ~1 ~ air 0 tp @e[tag=character] ~-0.6 ~ ~
 
- execute @a[tag=Controlling] ~ ~ ~ detect ~-0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 90 ~
- 重置玩家视角和坐标
 
首先建立一个moved计分板/dummy,并将其用stats关联到实体:
代码:
- /scoreboard players set @e[tag=character] moved 0
 
- stats entity @e[tag=character] set AffectedEntities @e[tag=character] moved
接下来就是重置的工作了
代码:
- tp @a[tag=Controlling] ~ ~ ~ [dx] [dy]
 
- execute @e[tag=character,score_moved_min=1] ~ ~ ~ tp @a[tag=Controlling] [x] ~ [z]
 
- cond:scoreboard players set @e[tag=character] moved 0
- 执行顺序
 
并且移动操作监听其实并非并列进行,这是由于链式模块都有单向顺序,刷新周期0.05s,而Minecraft中实际的玩家移动是Update同步进行,模块执行和实际玩家移动存在时间差。总的来说如果使用了不恰当的玩家移动监听顺序,某些方向的移动监听也许会失去效果。
最后的恰当顺序请看"最终指令"。
其他操作
- Space操作
 
代码:
- execute @a[tag=Controlling] ~ ~ ~ detect ~ ~2.99999 ~ air 0 execute @p ~ ~ ~ detect [x] [y] [z] air 0 setblock [x] [y] [z] redstone_block 0 replace
作为一个Minecraft的移动键,同样也受执行顺序影响。最后的恰当顺序请看"最终指令"。
- Shift操作
 
代码:
- /tp @e[name=sneak] ~ ~-300 ~
 
- /kill @e[name=sneak]
 
- /summon minecraft:rabbit ~ ~ ~ {NoAI:true,Silent:true,Invulnerable:true,ActiveEffects:[{Id:14,Duration:111110,ShowParticles:false}],Age:-1000000,CustomName:sneak}
 
- /execute @p ~ ~ ~ /tp @e[name=sneak] @a[score_control_min=1]
 
- /tp @e[name=sneak] ~0.01 ~ ~
 
- /execute @a[score_control_min=1,score_sneak_min=1] ~ ~ ~ setblock [x] [y] [z] minecrat:redstone_block 0 replace
 
- /scoreboard players reset @a sneak
 
- /scoreboard objectives add sneak stat.sneakTime
- 另外各种操作
 
例如右键可以靠胡萝卜钓竿的使用监听,左键可以靠对实体的伤害监听;
数字键123456789可以靠NBT-SelectedItemSlot;
还有等等等等都可以靠各种方法监听。
优化
- 视角卡顿
 
其实这个视角卡顿就是因为模块执行和实际玩家移动检测存在时间差,因此在你移动后因为又被tp会原始点,你的视角将疯狂摇晃。
解决方法就是降低玩家移动速度,这就是我们需要强行让玩家穿上一个靴子:
代码:
- /replaceitem entity @p slot.armor.feet diamond_boots 1 0 {Unbreakable:1,display:{Name:"Exit"},HideFlags:63,AttributeModifiers:[{AttributeName:"generic.movementSpeed",Name:"generic.movementSpeed",Amount:-0.099999,Operation:0,UUIDMost:84265,UUIDLeast:167246,Slot:"feet"}]}
- 视角变小
 
- 实体消失范围
 
- 关于GUI
 
代码:
- /effect @p[tag=controller] invisibility 1 1 true
你也可以选择让玩家F1隐藏GUI,提升游戏体验性。
- 退出游戏
 
最终指令

Start 游戏开始部分:
代码:
- icb:/scoreboard players tag @p add controller
 
- *给玩家添加一个控制者标签
 
- /replaceitem entity @p slot.armor.feet diamond_boots 1 0 {Unbreakable:1,display:{Name:"Exit"},HideFlags:63,AttributeModifiers:[{AttributeName:"generic.movementSpeed",Name:"generic.movementSpeed",Amount:-0.099999,Operation:0,UUIDMost:84265,UUIDLeast:167246,Slot:"feet"}]}
 
- *让玩家穿上前面防卡顿的靴子
 
- /scoreboard objectives add moved dummy
 
- *增加moved计分板
 
- //重置结束
 
- /setblock ~-3 ~1 ~2 minecraft:air 0
 
- /scoreboard objectives add control dummy
 
- /summon minecraft:实体名 [x] [y] [z] {Tags:["character"],NoAI:1,CustomName:"Character",CustomNameVisible:false,Invulnerable:1,Silent:1,Rotation:[180.0f,0.0f]}
 
- *生成角色
 
- /tp @p [x] [y] [z] [dx] [dy]
 
- *将玩家传送到控制器的中心点(也就是"移动监听"中用玩家头颅代表的玩家立足点中心)
 
- /scoreboard players set @e[tag=character] moved 0
 
- *初始化stats
 
- stats entity @e[tag=character] set AffectedEntities @e[tag=character] moved
 
- *stats关联到实体
 
- /gamemode a @p
 
- *设置游戏模式
Control 事件监听和操作:
代码:
- rcb:scoreboard players set @a control 0
 
- scoreboard players set @a control 1 {Inventory:[{id:"minecraft:diamond_boots",Slot:100b,Damage:0s,Count:1b,tag:{display:{Name:"Exit"}}}]}
 
- *检测玩家没有选择离开游戏,给玩家control计分板设为1,表示玩家正在操作
 
- testfor @a[tag=controller,score_control=0,c=1]
 
- cond:testforblock ~-3 ~1 ~4 air 0
 
- cond:setblock ~-4 ~1 ~4 redstone_block 0
 
- *检测玩家退出后,激活End()模块
 
- tp @a[score_control_min=1] ~ ~ ~ [dx] [dy]
 
- execute @e[tag=character,score_moved_min=1] ~ ~ ~ tp @a[score_control_min=1] [x] ~ [z]
 
- cond:scoreboard players set @e[tag=character] moved 0
 
- *固定和重置玩家视角和坐标
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2 ~-0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ detect ~ ~1 ~-0.9 air 0 tp @e[tag=character] ~ ~ ~-0.6
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ -90 ~
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ detect ~0.9 ~1 ~ air 0 tp @e[tag=character] ~0.6 ~ ~
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2 ~0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ detect ~ ~1 ~0.9 air 0 tp @e[tag=character] ~ ~ ~0.6
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2 ~-0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 180 ~
 
- *在Space操作之前移动操作可使用的顺序
 
- //Space事件
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2.99999 ~ air 0 execute @p ~ ~ ~ detect [x] [y] [z] air 0 setblock [x] [y] [z] redstone_block 0 replace
 
- //Space事件结束
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~ ~2 ~0.49999999999995 air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 0 ~
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~-0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ detect ~-0.9 ~1 ~ air 0 tp @e[tag=character] ~-0.6 ~ ~
 
- execute @a[score_control_min=1] ~ ~ ~ detect ~-0.49999999999995 ~2 ~ air 0 execute @e[tag=character] ~ ~ ~ tp @e[tag=character] ~ ~ ~ 90 ~
 
- *在Space操作之后移动操作可使用的顺序
 
- //Shift事件
 
- /tp @e[name=sneak] ~ ~-300 ~
 
- /kill @e[name=sneak]
 
- /summon minecraft:rabbit ~ ~ ~ {NoAI:true,Silent:true,Invulnerable:true,ActiveEffects:[{Id:14,Duration:111110,ShowParticles:false}],Age:-1000000,CustomName:sneak}
 
- /execute @p ~ ~ ~ /tp @e[name=sneak] @a[score_control_min=1]
 
- /tp @e[name=sneak] ~0.01 ~ ~
 
- /execute @a[score_control_min=1,score_sneak_min=1] ~ ~ ~ setblock [x] [y] [z] minecrat:redstone_block 0 replace
 
- /scoreboard players reset @a sneak
 
- /scoreboard objectives add sneak stat.sneakTime
 
- //Shift事件结束
 
- //可选配置项目
 
- /effect @p[tag=controller] invisibility 1 1 true
End 游戏结束部分:
代码:
- icb:/clear @a diamond_boots 0 10 {display:{Name:"Exit"}}
 
- /scoreboard objectives remove moved
 
- /scoreboard objectives remove control
 
- *各种重置
 
- /setblock ~-3 ~1 ~-2 minecraft:air
 
- *清除Start()模块开头的红石块
 
- /stats entity @e[tag=character] clear AffectedEntities
 
- /gamemode c @a
 
- *继续各种重置
 
- /tp @a [x] [y] [z] [dx] [dy]
 
- *返回大厅
 
- /tp @e[tag=character] ~ -100 ~
 
- /kill @e[tag=character]
 
- /scoreboard players tag @a remove controller
 
- *再各种重置
如果你使用上述指令,那么模块的摆放也有相应要求,具体看"Demo&源码资源"
Demo&源码资源
Demo地址:百度网盘
.pcb文件打包地址:百度网盘
关于.pcb转为OOC后的摆放顺序:

为了方便伸手党copy,你需要在z+方向依次摆上:Control()、Start()、End()
每一行之间隔一格。
此贴实际研究时间数个月前,而且感谢地图《A Day to Remember》给予的2.5D第三人称操作灵感。
 本帖最后由 langyo 于 2017-2-8 17:00 编辑 
我之前自己在草稿纸上写出的其中一个构想差不多就是这样子的,能够实现在玩家的第一视角下实现第三视角观看模型,并提供实时反馈。以下全部是自己理解+伪修改建议。
1.事件监听
这里你讲的onMouse等等,特别像Java中的监听器,或者是Windows中的API回调窗口消息事件,用途就是将动作部分的代码和玩家按键部分代码架桥,当玩家有动作,就能够触发动作部分代码。
具体的实现,比如WASD和Space,都是基于玩家位置判断的,检测到玩家到了哪个方向,就执行动作部分,然后把玩家位置复位。
如果还需要更多的按键检测,比如鼠标左键/右键,Shift/Ctrl,F键。其实stats指令也给了我们很多的途径,虽然基本没什么卵用。
2.摄像机位移
其实就是根据移动事件,先决定被观看实体的位置,然后再计算摄像机(也就是玩家)的位置和方向,穷举大法万岁。
3.防止抖屏
用减速靴子的方法的确很好,不仅能够正常移动,而且还不会由于移动太快导致CBM反应不过来,出现不断抖着屏幕被TP来TP去的现象。类似的方法,减速状态效果,甚至是在地上放水/岩浆/灵魂沙/冰/蓝冰作为缓速带都是好办法。
4.优化玩家体验
这里我还可以补充一点点东西。CB对角度有穷举的限制,由于角度分辨率导致的性能影响也是与玩家主机配置成反比的。所以,我们可以加入设置角度分辨率,以适应不同的等级配置。低配机就用10°会比较流畅,像乙烯那种配置的用3°吧…这种东西还可以加入进地图GUI的,比如用地图+鼠标事件,可以自如调整各种设置,只要你把GUI的各个玩家视角角度都算好就一切正常。(怎么算?极坐标转换。)
5.环境音效
这个可能已经超出本贴范围了,但既然是要在地图里实现五毛效果,我们就能做绝点,把它做成两元效果。好的小游戏地图,它除了图像上的精美,音乐做到身临其境也是必须得,所以就扯到了音效。
首先是怎么加入额外音乐。
然后,注意了,有时候角色的音效是不仅仅光播放就可以的。你不仅要学会开车,你还要学会刹车,否则遇到玩家突然按暂停停不下来就尴尬了。
最后是对于环境音效的配置。我们可以依照角度穷举大法,如法炮制一堆的盔甲架围在玩家附近,角度密度不用太严格,因为就算隔个30°没多少人能听出来明显的声音位置变化。然后,我们必须把控制角色的位置计算并映射到这些盔甲架上,当移动到哪里时就可以粗略变换一下,把玩家为中心求得控制角色的极坐标的角度弄来,取个范围值并让负责对应范围的盔甲架执行playsound即可。
stopplaysound可以沿用事件触发的方法,在玩家点开GUI时就触发控制事件,把粒子效果停了、把声音关了、把状态效果重置了、刷新区块等等……
其实,当你的主机性能足够好时,你可以带的起3D而不是2.5D,只不过这种地图得看情况应用了。我觉得,服务器体验小游戏是最好的选择,一群玩家都以这种方式游戏,互相再控制着自己的小人,甚至LOL开黑,感觉很酷啊。
大概就是这样,没想到我居然写了有半小时这样。
我之前自己在草稿纸上写出的其中一个构想差不多就是这样子的,能够实现在玩家的第一视角下实现第三视角观看模型,并提供实时反馈。以下全部是自己理解+伪修改建议。
1.事件监听
这里你讲的onMouse等等,特别像Java中的监听器,或者是Windows中的API回调窗口消息事件,用途就是将动作部分的代码和玩家按键部分代码架桥,当玩家有动作,就能够触发动作部分代码。
具体的实现,比如WASD和Space,都是基于玩家位置判断的,检测到玩家到了哪个方向,就执行动作部分,然后把玩家位置复位。
如果还需要更多的按键检测,比如鼠标左键/右键,Shift/Ctrl,F键。其实stats指令也给了我们很多的途径,虽然基本没什么卵用。
2.摄像机位移
其实就是根据移动事件,先决定被观看实体的位置,然后再计算摄像机(也就是玩家)的位置和方向,穷举大法万岁。
3.防止抖屏
用减速靴子的方法的确很好,不仅能够正常移动,而且还不会由于移动太快导致CBM反应不过来,出现不断抖着屏幕被TP来TP去的现象。类似的方法,减速状态效果,甚至是在地上放水/岩浆/灵魂沙/冰/蓝冰作为缓速带都是好办法。
4.优化玩家体验
这里我还可以补充一点点东西。CB对角度有穷举的限制,由于角度分辨率导致的性能影响也是与玩家主机配置成反比的。所以,我们可以加入设置角度分辨率,以适应不同的等级配置。低配机就用10°会比较流畅,像乙烯那种配置的用3°吧…这种东西还可以加入进地图GUI的,比如用地图+鼠标事件,可以自如调整各种设置,只要你把GUI的各个玩家视角角度都算好就一切正常。(怎么算?极坐标转换。)
5.环境音效
这个可能已经超出本贴范围了,但既然是要在地图里实现五毛效果,我们就能做绝点,把它做成两元效果。好的小游戏地图,它除了图像上的精美,音乐做到身临其境也是必须得,所以就扯到了音效。
首先是怎么加入额外音乐。
然后,注意了,有时候角色的音效是不仅仅光播放就可以的。你不仅要学会开车,你还要学会刹车,否则遇到玩家突然按暂停停不下来就尴尬了。
最后是对于环境音效的配置。我们可以依照角度穷举大法,如法炮制一堆的盔甲架围在玩家附近,角度密度不用太严格,因为就算隔个30°没多少人能听出来明显的声音位置变化。然后,我们必须把控制角色的位置计算并映射到这些盔甲架上,当移动到哪里时就可以粗略变换一下,把玩家为中心求得控制角色的极坐标的角度弄来,取个范围值并让负责对应范围的盔甲架执行playsound即可。
stopplaysound可以沿用事件触发的方法,在玩家点开GUI时就触发控制事件,把粒子效果停了、把声音关了、把状态效果重置了、刷新区块等等……
其实,当你的主机性能足够好时,你可以带的起3D而不是2.5D,只不过这种地图得看情况应用了。我觉得,服务器体验小游戏是最好的选择,一群玩家都以这种方式游戏,互相再控制着自己的小人,甚至LOL开黑,感觉很酷啊。
大概就是这样,没想到我居然写了有半小时这样。
灵感来自A day to remember吧,其实我也去看过,然后模仿了一套控制系统来。
牛牛牛,虽然我不用
langyo 发表于 2017-1-22 21:47
我之前自己在草稿纸上写出的其中一个构想差不多就是这样子的,能够实现在玩家的第一视角下实现第三视角观看 ...
打谁脸
我这是故意说给某人听的,他认为你这个能精
以及,你删了我也能看见,论坛不提倡口吐脏字
以及,你删了我也能看见,论坛不提倡口吐脏字
langyo 发表于 2017-1-23 15:53
我这是故意说给某人听的,他认为你这个能精
以及,你删了我也能看见,论坛不提倡口吐脏字
...
诚信撕逼
 本帖最后由 林扬骐 于 2017-1-23 17:49 编辑 
(看到第二节的回复):其实潜行键1.9就有个判据是检测潜行总时间的了嗯(看到第三节的回复):位置和视角两段tp可以合为一段
(看到第二节的回复):其实潜行键1.9就有个判据是检测潜行总时间的了嗯(看到第三节的回复):位置和视角两段tp可以合为一段
优化到倒是挺有意思的
其他还是可以想到的
其他还是可以想到的
然而 现在有潜行时间这个判据了
不用在使用那个黑科技了
按e打开物品栏可以被打开物品栏次数这个成就检测 然后放一个地狱门迅速关掉gui
不用在使用那个黑科技了
按e打开物品栏可以被打开物品栏次数这个成就检测 然后放一个地狱门迅速关掉gui
chyx 发表于 2017-1-23 18:13
然而 现在有潜行时间这个判据了
不用在使用那个黑科技了
有个小问题,放地狱门之后,玩家是否会立即被传送进地狱?如果不是,需要在多长时间内把地狱门消除,才能保证不传送?
以前看过一个吃豆人的也是用的这种方法,不过视角还是一抖一抖的,减速优化这个挺不错的。
再来我之前也有个第三人称的脑洞,不过方法用的是直接teleport,控制的人物跟随玩家移动,然后玩家是在船上控制方向的,这样可以解决视角固定不动的问题但相应的很多按键监听不到,以及三维旋转依旧不能实现,不知道这个脑洞对改进有没有帮助w
顺便再唠叨一句,渲染距离不够那个问题大概可以通过检测人物离玩家距离,过远了直接把玩家丢过去解决√
再来我之前也有个第三人称的脑洞,不过方法用的是直接teleport,控制的人物跟随玩家移动,然后玩家是在船上控制方向的,这样可以解决视角固定不动的问题但相应的很多按键监听不到,以及三维旋转依旧不能实现,不知道这个脑洞对改进有没有帮助w
顺便再唠叨一句,渲染距离不够那个问题大概可以通过检测人物离玩家距离,过远了直接把玩家丢过去解决√
用积分榜检测跳会不会更快
那个在动图里的图标亮了。
 本帖最后由 langyo 于 2017-1-29 19:01 编辑 
啊,我的脸好疼啊
我以反讽的方式成功让乙烯给了你精华
啊,我的脸好疼啊
可以关联其他玩家吗……
00000000000000000000000000000000000
赞赞赞赞赞 好东西 谢谢分享
感觉好复杂的样子
腻害了  这么说不用玩第一人称的LOL地图了
不错不错 作者加油啊
可以,加油         
此插件强大······(然而我并不会用)
17777268265@163 发表于 2017-2-6 23:14
此插件强大······(然而我并不会用)
原版单人命令非插件
一看到.pcb想起的不是懒癌卫士,而是印制电路板