Я не могу понять, что пошло не так в моем коде движения для римейка классической игры змейки nokia. Помогите, пожалуйста

Помогите, пожалуйста. Как мы знаем из игры со змейкой, если мы сейчас движемся вправо: мы не можем двигаться влево, мы должны двигаться вверх или вниз или продолжать движение вправо. И так далее соответственно по остальным направлениям. Итак, я придумал следующий код:

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)

person nikhil bhamidipati    schedule 19.04.2021    source источник


Ответы (1)


После 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 и 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

Этого блока должно хватить.

person Theraot    schedule 19.04.2021
comment
Ух ты, потрясающе. так просто, аккуратно и в то же время так эффективно. Я только что опробовал решение, и оно отлично работает. Сегодня я выучил урок благодаря Theraot! - person nikhil bhamidipati; 20.04.2021