Reputation: 55
I'm following a series of videos online to assist with the development of my pygame project. i cant get my playerobject class to move in my game. Everything compiles correctly but nothing happens when I press left, right, up, down, etc. The only thing that works is the drawing of my object and the pygame quit event.
I've tried moving some code around, but to no avail.
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()
I'm just trying to get my green square to move up down left and right.
Upvotes: 4
Views: 77
Reputation: 14924
Unless it's just a code-paste issue, it looks like the playerobject
class does not have the update()
function defined correctly (because it lacks enough indentation to make it part of playerobject
).
There's a style-issue with the code, in that it's handling user input in both the playerobject
and the main loop. It's best to handle all your user-input in the main loop (or at least a single place). I re-arranged the code to behave like this. Oh, and your up/down numbers were reversed (may this was on-purpose).
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()
Now it moves really fast.
Upvotes: 1