Мне нужна помощь в перемещении моего объекта - PullRequest
4 голосов
/ 12 апреля 2019

Я слежу за серией онлайн-видео, чтобы помочь в разработке моего проекта Pygame. я не могу заставить свой класс playerobject двигаться в моей игре. Все компилируется правильно, но ничего не происходит, когда я нажимаю влево, вправо, вверх, вниз и т. Д. Единственное, что работает, - это рисование моего объекта и событие выхода из Pygame.

Я пытался переместить некоторый код, но безрезультатно.

import os
import random
import time

#declarations
displaywidth = 600
displayheight = 850
gamedisplay = pygame.display.set_mode((displaywidth, displayheight))
fps = 60
white = (255, 255, 255)
black = (0, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
red = (255, 0, 0)

#initializations
pygame.init()
pygame.mixer.init()
pygame.display.set_caption("Into The Battlefield")
clock = pygame.time.Clock()


#classes
class playerobject(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(green)
        self.rect = self.image.get_rect()
        self.rect.centerx = displaywidth / 2
        self.rect.bottom = displayheight - 10
        self.speedx = 0
        self.speedy = 0

def update(self):
    self.speedx = 0
    self.speedy = 0
    keypress = pygame.key.get_pressed()
    if keypress[pygame.K_LEFT]:
        self.speedx = -5
    if keypress[pygame.K_RIGHT]:
        self.speedx = 5
    if keypress[pygame.K_UP]:
        self.speedy = 5
    if keypress[pygame.K_DOWN]:
        self.speedy = -5
    self.rect.x += self.speedx
    self.rect.y += self.speedy

#sprite group
sprites = pygame.sprite.Group()
playerobject = playerobject()
sprites.add(playerobject)

#gameloop
def gameloop():
    gameon = True
    while gameon:
        clock.tick(fps)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameon = False


        gamedisplay.fill(black)
        sprites.update()
        sprites.draw(gamedisplay)
        pygame.display.update()
        pygame.display.flip()


gameloop()
pygame.quit()

Я просто пытаюсь заставить мой зеленый квадрат двигаться вверх вниз влево и вправо.

1 Ответ

1 голос
/ 12 апреля 2019

Если это не просто проблема вставки кода, похоже, что класс playerobject не имеет правильно определенной функции update() (потому что ему не хватает отступа, чтобы сделать его частью playerobject).

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

import os
import random
import time
import pygame

#declarations
displaywidth = 600
displayheight = 850
gamedisplay = pygame.display.set_mode((displaywidth, displayheight))
fps = 60
white = (255, 255, 255)
black = (0, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
red = (255, 0, 0)

#initializations
pygame.init()
pygame.mixer.init()
pygame.display.set_caption("Into The Battlefield")
clock = pygame.time.Clock()


#classes
class playerobject(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(green)
        self.rect = self.image.get_rect()
        self.rect.centerx = displaywidth / 2
        self.rect.bottom = displayheight - 10
        self.speedx = 0
        self.speedy = 0

    def setSpeedXY( self, x, y ):
        self.speedx = x
        self.speedy = y

    def adjustSpeedX( self, x ):
        self.speedx += x
    def adjustSpeedY( self, y ):
        self.speedy += y

    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy

#sprite group
sprites = pygame.sprite.Group()
playerobject = playerobject()
sprites.add(playerobject)

#gameloop
def gameloop():
    gameon = True
    while gameon:
        clock.tick(fps)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameon = False

        keypress = pygame.key.get_pressed()
        if keypress[pygame.K_LEFT]:
            playerobject.adjustSpeedX( -5 )
        if keypress[pygame.K_RIGHT]:
            playerobject.adjustSpeedX( 5 )
        if keypress[pygame.K_UP]:
            playerobject.adjustSpeedY( -5 )
        if keypress[pygame.K_DOWN]:
            playerobject.adjustSpeedY( 5 )
        if keypress[pygame.K_SPACE]:
            playerobject.setSpeedXY( 0, 0 )

        gamedisplay.fill(black)
        sprites.update()
        sprites.draw(gamedisplay)
        pygame.display.update()
        pygame.display.flip()


gameloop()
pygame.quit()

Теперь он движется действительно быстро.

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