agattis
agattis

Reputation: 55

I need help getting my object to move around

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

Answers (1)

Kingsley
Kingsley

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

Related Questions