game-development - 我无法理解诺基亚经典蛇游戏重制版的动作代码出了什么问题。请帮我
问题描述
请帮我。正如我们在蛇游戏中所知道的,如果我们当前正在向右移动:我们不能向左移动,我们必须向上或向下移动或坚持向右移动。其他方向以此类推。所以我想出了以下代码:
extends Area2D
export var SPEED=100
var input_vector= Vector2.ZERO
var canMove = {'left':false, 'right':false, 'up':false, 'down':false}
var moving = {'left':false, 'right':false, 'up':false, 'down':false}
func _physics_process(delta):
position += input_vector*SPEED*delta
if Input.is_action_just_pressed("ui_right"):
input_vector.x=1
input_vector.y=0
if Input.is_action_just_pressed("ui_left"):
input_vector.x=-1
input_vector.y=0
if Input.is_action_just_pressed("ui_up"):
input_vector.x=0
input_vector.y=-1
if Input.is_action_just_pressed("ui_down"):
input_vector.x=0
input_vector.y=1
if input_vector.x<0:
moving['left']=true
if input_vector.x>0:
moving['right']=true
if input_vector.y<0:
moving['up']=true
if input_vector.y>0:
moving['down']=true
if moving['left']==true:
canMove['right']=false
canMove['up']=true
canMove['down']=true
if moving['right']==true:
canMove['left']=false
canMove['up']=true
canMove['down']=true
if moving['up']==true:
canMove['right']=true
canMove['left']=true
canMove['down']=false
if moving['down']==true:
canMove['right']=true
canMove['left']=true
canMove['up']=false
if canMove['left']==false:
input_vector.x= abs(input_vector.x)
if canMove['right']==false:
input_vector.x= -abs(input_vector.x)
if canMove['up']==false:
input_vector.y= abs(input_vector.y)
if canMove['down']==false:
input_vector.y= -abs(input_vector.y)
解决方案
之后position += input_vector*SPEED*delta
。第一个块input_vector
基于Input
.
第二个块moving
基于input_vector
. 由于我们是基于写input_vector
的Input
,这些块结合写moving
基于input_vector
。
第三块canMove
基于moving
. 通过与上述相同的逻辑,您正在编写canMove
基于Input
. 你什么时候检查canMove
?最后的。这不是你想要的。你想先检查canMove
,然后再写input_vector
and moving
。
实际上,您可以组合检查,例如:
if Input.is_action_just_pressed("ui_right") and canMove['right']:
我不认为这是一个很好的代表方式moving
。相反,我建议使用Enum。那是:
enum Direction {UP, DOWN, LEFT, RIGHT, NONE}
var moving = Direction.NONE
你也可以摆脱canMove
. 规则是你不能移动到与你移动的方向相反的方向。因此,您可以moving
直接检查:
if Input.is_action_just_pressed("ui_right") and moving != Direction.LEFT:
input_vector.x=1
input_vector.y=0
moving = Direction.RIGHT
if Input.is_action_just_pressed("ui_left") and moving != Direction.RIGHT:
input_vector.x=-1
input_vector.y=0
moving = Direction.LEFT
if Input.is_action_just_pressed("ui_up") and moving != Direction.DOWN:
input_vector.x=0
input_vector.y=-1
moving = Direction.UP
if Input.is_action_just_pressed("ui_down") and moving != Direction.UP:
input_vector.x=0
input_vector.y=1
moving = Direction.DOWN
那块应该足够了。
推荐阅读
- java - 如何在 REACT 的表单字段中获取正确的 DateTime?
- javascript - 如何在径向量规上创建刻度标记和等距?
- android - Google Place api 未提供搜索结果
- jquery - jquery在数据分页后无法在表上工作
- amazon-web-services - SSH 执行远程命令 infacmd.sh 失败
- python - 查找字符串中的单词并将其移动到句子的末尾。Python3.x
- javascript - 在页面加载时模拟长脚本
- appium-desktop - AppiumStudio(Windows):未找到可用的团队
- javascript - 如何在 Vue 中呈现动态 CSS 样式表?
- c#-4.0 - 使用canvasrenderer时如何管理itext 7中的溢出数据