Как заставить игрока постоянно двигаться в одном направлении - PullRequest
2 голосов
/ 16 марта 2020

Я делаю игру, и мне нужно, чтобы игрок постоянно двигался в одном направлении, пока игрок не решит постоянно двигаться в другом направлении. В коде, который я предоставил, игрок должен удерживать клавишу, чтобы двигаться в этом направлении.

Вот мой код для игрока и функция для перемещения:

class player:
    def __init__(self, x, y, width, height, colour):
        self.width = width  # dimensions of player
        self.height = height  # dimensions of player
        self.x = x  # position on the screen
        self.y = y  # position on the screen
        self.colour = colour  # players colour
        self.rect = (x, y, width, height)  # all the players properties in one
        self.vel = 2  # how far/fast you move with each key press
        self.path = []

    def draw(self, win):
        pygame.draw.rect(win, self.colour, self.rect)

    def move(self):
        keys = pygame.key.get_pressed()  # dictionary of keys - values of 0/1

        if keys[pygame.K_LEFT]:  # move left: minus from x position value
            if self.x <= 5:
                pass
            else:
                self.x -= self.vel
                self.y = self.y

        elif keys[pygame.K_RIGHT]:  # move right: add to x position value
            if self.x == 785:
                pass
            else:
                self.x += self.vel

        elif keys[pygame.K_UP]:  # move up: minus from y position value
            if self.y <= 105:
                pass
            else:
                self.y -= self.vel

        elif keys[pygame.K_DOWN]:  # move down from
            if self.y >= 785:
                pass
            else:
                self.y += self.vel

        self.update()

    def update(self):
        self.rect = (self.x, self.y, self.width, self.height)  # redefine where the player is

Вот мой код для основной функции:

def main():  # asking server for updates, checking for events
    run = True
    n = Network()
    startPos = read_pos(n.getPos())
    pygame.mixer.music.load("Heroic_Intrusion.ogg")
    pygame.mixer.music.set_volume(0.5)
    pygame.mixer.music.play(-1)

    p = player(startPos[0], startPos[1], 10, 10, (255, 0, 0))  # connect, get starting position
    p2 = player(0, 0, 10, 10, (0, 0, 255))

    clock = pygame.time.Clock()

    while run:
        clock.tick(60)

        p2Pos = read_pos(n.send(make_pos((p.x, p.y))))
        p2.x = p2Pos[0]
        p2.y = p2Pos[1]
        p2.update()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:  # quitting condition
                run = False
                pygame.quit()
        p.move()  # move character based off what keys are being pressed
        redrawWindow(win, p, p2)

1 Ответ

1 голос
/ 17 марта 2020

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

class Player():
    def __init__( self ):
        ...
        self.x_vel = 0
        self.y_vel = 0

    def move(self):
        keys = pygame.key.get_pressed()  # dictionary of keys - values of 0/1
        if keys[pygame.K_LEFT]:  # move left: minus from x position value
            self.x_vel = -1
        if keys[pygame.K_RIGHT]:
            self.x_vel = 1     # move right: plus from x position value
        # etc. for up/down

    def update( self ):
        self.x += self.x_vel
        self.y += self.y_vel

В основном l oop просто вызовите функцию player.update().

Недостатком этого подхода является то, что на экране Скорость относительно частоты кадров. В этом случае код может использовать миллисекундные часы Pygame, чтобы использовать фактическую скорость в реальном времени в пикселях в секунду. Или рассчитайте скорость на основе фактического FPS и установите player.x_vel (et c.) Соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...