Как ограничить движение персонажа Pygame? - PullRequest
0 голосов
/ 20 мая 2019

Я строю игру в Pygame, которая включает перемещение красного прямоугольника (игрока) с помощью клавиш со стрелками.Я заставил игрока двигаться с помощью клавиш со стрелками (клавиши со стрелками управляют скоростью, клавиша ввода подтверждает ход), но я должен быть в состоянии ограничить количество, которое игрок может перемещать за ход.Мне нужно сделать так, чтобы новая скорость / позиция могла быть максимум 20 пикселей вверх / вниз и 20 пикселей влево / вправо (20 пикселей означает двойное нажатие клавиши со стрелкой).

В настоящее время игрок перемещаетсяв соответствии со скоростью, установленной клавишей со стрелкой, но скорость увеличивается / уменьшается бесконечно вместе со стрелками.Мне нужно, чтобы он прекратил изменяться после того, как клавиши со стрелками были нажаты максимум 2 раза в любом направлении (вверх / вниз, влево / вправо).

Вот код, управляющий скоростью:

if event.type == pygame.KEYDOWN:
    if p1_turn:
        if event.key == pygame.K_RIGHT:
            p1_velocity_x += 10
        if event.key == pygame.K_LEFT:
                p1_velocity_x -= 10    

А вот код, который подтверждает изменение (на самом деле перемещает игрока):

if event.key == pygame.K_RETURN:
    if p1_turn:
        p1.y += p1_velocity_y
        p1.x += p1_velocity_x
        p1_turn = False
        p2_turn = True

Как упоминалось ранее, должен быть какой-то механизм, который не дает скорости проходить выше 20px увеличения / уменьшения отисходная скорость х и от исходной скорости у.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Просто используйте if statements:

original_vel_x = 0

if p1_turn:
    if event.key == pygame.K_RIGHT:
        if p1_velocity_x <= original_vel_x + 20:  # I used <= in case it's being increased with floats
            p1_velocity_x += 10
        else: 
            print('Cannot Move')
0 голосов
/ 20 мая 2019
import pygame

...


#Change those to whatever you want.
maximux_x = 20
minimum_x = 10

#This holds the players velocity on x.
p1_velocity_x = 0

def ChangeVelocity(change):
    global p1_velocity_x

    #cacl new x.
    new_x = p1_velocity_x + change


    if new_x < minimum_x:
        return

    if new_x > maximux_x:
        return

    #Change is inside the restrictions, so apply the change.
    p1_velocity_x += change

...



if event.type == pygame.KEYDOWN:

    if p1_turn:

        if event.key == pygame.K_RIGHT:
            ChangeVelocity(10)

        if event.key == pygame.K_LEFT:
            ChangeVelocity(-10)

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

import pygame


class Vector:

    def __init__(self, x, y):
        self.x = x
        self.y = y


class Player:

    def __init__(self):
        self.pos      = Vector(0,0)
        self.maxX     = 20
        self.maxY     = 10


    def MoveOnX(self, change):
        global p1_velocity_x

        #cacl new x.
        new_x = self.pos.x + change


        if new_x < self.maxX:
            return


        if new_x > self.maxY:
            return

        #Change is inside the restrictions, so apply the change.
        self.pos.x += change


#Create a new player and spawn him at (5,5)
player = Player()
player.pos.x = 5
player.pos.y = 5


if event.type == pygame.KEYDOWN:

    if p1_turn:

        if event.key == pygame.K_RIGHT:
            player.MoveOnX(10)

        if event.key == pygame.K_LEFT:
            player.MoveOnX(-10)
...