首页 > 解决方案 > 我无法理解诺基亚经典蛇游戏重制版的动作代码出了什么问题。请帮我

问题描述

请帮我。正如我们在蛇游戏中所知道的,如果我们当前正在向右移动:我们不能向左移动,我们必须向上或向下移动或坚持向右移动。其他方向以此类推。所以我想出了以下代码:

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)

标签: game-developmentgodotgdscript

解决方案


之后position += input_vector*SPEED*delta。第一个块input_vector基于Input.

第二个块moving基于input_vector. 由于我们是基于写input_vectorInput,这些块结合写moving基于input_vector

第三块canMove基于moving. 通过与上述相同的逻辑,您正在编写canMove基于Input. 你什么时候检查canMove?最后的。这不是你想要的。你想先检查canMove,然后再写input_vectorand 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

那块应该足够了。


推荐阅读