如何在Pygame中移动Sprite

时间:2013-04-24 04:15:27

标签: python pygame sprite

我试图让我的图像(鸟)在屏幕上上下移动,但我无法弄清楚如何做到这里是我试图确定它的方式,但我试图找出它,如果有人可以帮助那会很棒!

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()

我试图让它向下按下向下按钮然后按向上键按

2 个答案:

答案 0 :(得分:10)

如ecline6所述,此时鸟类是您最不担心的。

考虑阅读this book ..

现在,首先让我们清理你的代码......

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)

现在你的“鸟”不动的原因是:
当您对图像进行blit时,即:screen.blit(bird, (0, 0))
(0,0)是常量,因此不会移动。

这是最终代码,包含您想要的输出(试一试)并阅读注释:

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)

答案 1 :(得分:0)

键盘事件(参见 pygame.event 模块)仅在键的状态改变时发生一次。 KEYDOWN 事件在每次按下键时发生一次。 KEYUP 每次释放键时出现一次。将键盘事件用于单个操作或逐步移动。

如果要实现连续运动,则必须使用pygame.key.get_pressed()pygame.key.get_pressed() 返回一个包含每个键状态的列表。如果某个键被按下,则该键的状态为 True,否则为 False。使用 pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动。

另见Key and Keyboard eventHow can I make a sprite move when key is held down


最小示例:

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()