6

im trying to get my image (bird) to move up and down on the screen but i cant figure out how to do it here is what i tried im sure its way off but im trying to figure it out if anyone can help that would be great!

import pygame
import os

screen = pygame.display.set_mode((640, 400))

running = 1

while running:
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        running = 0
    screen.fill([255, 255, 255])
    clock = pygame.time.Clock()
    clock.tick(0.5)
    pygame.display.flip()

    bird = pygame.image.load(os.path.join('C:\Python27', 'player.png'))
    screen.blit( bird, ( 0, 0 ) )

    pygame.display.update()

class game(object):
    def move(self, x, y):
        self.player.center[0] += x
        self.player.center[1] += y


    if event.key == K_UP:
        player.move(0,5)
    if event.key == K_DOWN:
        player.move(0,-5)

game()

im trying to get it to move down on the down button press and up on the UP key press

Serial
  • 7,925
  • 13
  • 52
  • 71
  • 6
    Whoa, the bird is the least of your worries at this point. You have a loop that is loading the bird every time. You're calling the game class like it's a function. You haven't even initialized pygame. Don't even think about movement and user input until you understand the game loop. – ecline6 Apr 24 '13 at 04:28
  • yeah im really confused about all of this m very very new to it – Serial Apr 24 '13 at 04:29
  • 2
    I would suggest going through some of the tutorials on the pygame site. http://www.pygame.org/wiki/tutorials Also, some refreshers on Python, Classes, and the idea of control flow would be a good idea too. Incidentally, your K_UP and K_DOWN events never get read because your game is stuck in the loop above it. If you comment out the while loop, the script won't run. But don't focus on that yet. Go and get thee a tutorial! : ) – ecline6 Apr 24 '13 at 04:33

2 Answers2

20

As stated by ecline6, bird is the least of your worries at this point.

Consider reading this book..

For now, First let's clean up your code...

import pygame
import os

# let's address the class a little later..

pygame.init()
screen = pygame.display.set_mode((640, 400))
# you only need to call the following once,so pull them out of the  while loop.
bird = pygame.image.load(os.path.join('C:\Python27', 'player.png'))
clock = pygame.time.Clock()

running = True
while running:
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        running = False

    screen.fill((255, 255, 255)) # fill the screen
    screen.blit(bird, (0, 0))    # then blit the bird

    pygame.display.update() # Just do one thing, update/flip.

    clock.tick(40) # This call will regulate your FPS (to be 40 or less)

Now the reason that your "bird" is not moving is:
When you blit the image, ie: screen.blit(bird, (0, 0)),
The (0,0) is constant, so it won't move.

Here's the final code, with the output you want (try it) and read the comments:

import pygame
import os

# it is better to have an extra variable, than an extremely long line.
img_path = os.path.join('C:\Python27', 'player.png')

class Bird(object):  # represents the bird, not the game
    def __init__(self):
        """ The constructor of the class """
        self.image = pygame.image.load(img_path)
        # the bird's position
        self.x = 0
        self.y = 0

    def handle_keys(self):
        """ Handles Keys """
        key = pygame.key.get_pressed()
        dist = 1 # distance moved in 1 frame, try changing it to 5
        if key[pygame.K_DOWN]: # down key
            self.y += dist # move down
        elif key[pygame.K_UP]: # up key
            self.y -= dist # move up
        if key[pygame.K_RIGHT]: # right key
            self.x += dist # move right
        elif key[pygame.K_LEFT]: # left key
            self.x -= dist # move left

    def draw(self, surface):
        """ Draw on surface """
        # blit yourself at your current position
        surface.blit(self.image, (self.x, self.y))


pygame.init()
screen = pygame.display.set_mode((640, 400))

bird = Bird() # create an instance
clock = pygame.time.Clock()

running = True
while running:
    # handle every event since the last frame.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit() # quit the screen
            running = False

    bird.handle_keys() # handle the keys

    screen.fill((255,255,255)) # fill the screen with white
    bird.draw(screen) # draw the bird to the screen
    pygame.display.update() # update the screen

    clock.tick(40)
pradyunsg
  • 18,287
  • 11
  • 43
  • 96
  • 2
    In case you didn't understand parts of this, read the book. It will help you ( a lot ) – pradyunsg Apr 24 '13 at 07:57
  • +1 for including Invent with Python. If I had known about that book when I started, it would have answered many questions. – ecline6 Apr 24 '13 at 14:21
0

The keyboard events (see pygame.event module) occur only once when the state of a key changes. The KEYDOWN event occurs once every time a key is pressed. KEYUP occurs once every time a key is released. Use the keyboard events for a single action or a step-by-step movement.

If you want to achieve a continuously movement, you have to use pygame.key.get_pressed(). pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement.

See also Key and Keyboard event and How can I make a sprite move when key is held down.


Minimal example:

import pygame
import os

class Bird(object):
    def __init__(self):
        self.image = pygame.image.load(os.path.join('C:\Python27', 'player.png'))
        self.center = [100, 200]

    def move(self, x, y):
        self.center[0] += x
        self.center[1] += y

    def draw(self, surf):
        surf.blit(self.image, self.center)

class game(object):
    
    def __init__(self):
        self.screen = pygame.display.set_mode((640, 400))
        self.clock = pygame.time.Clock()
        self.player = Bird()

    def run(self):
        running = 1
        while running:
            self.clock.tick(60)
            event = pygame.event.poll()
            if event.type == pygame.QUIT:
                running = 0
            
            keys = pygame.key.get_pressed()
            move_x = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
            move_y = keys[pygame.K_DOWN] - keys[pygame.K_UP]
            self.player.move(move_x * 5, move_y * 5)

            self.screen.fill([255, 255, 255])
            self.player.draw(self.screen)
            pygame.display.update()

g = game()
g.run()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174