带有事件的pygame示例代码

时间:2015-02-08 03:08:25

标签: python events pygame

我似乎无法在程序中找到错误。程序将运行没有错误,但我的桨图像不会移动。我花了几个小时研究并尝试了多种不同的变化。我使用的是python 3.4.1。我的目标是创建各种桨式游戏。谢谢。

# Python game
import pygame
import sys

pygame.init()

ball_image = pygame.image.load("ball.png")
ballrect = ball_image.get_rect()
paddle_image = pygame.image.load("paddle.png")
paddlerect = paddle_image.get_rect()

screen_w = 825
screen_h = 727
size = [screen_w, screen_h]

speed = [1, 1]
black = (0, 0, 0)
blue = (0,0,255)

screen = pygame.display.set_mode(size)

class paddle(object):

    paddle_speed = [0, 0]
    paddle_speed_d = [0, -1]
    paddle_speed_u = [0, 1]

    image = paddle_image
    rect = image.get_rect()
    x = 20
    y = screen_h / 2
    w = rect.width
    h = rect.height

    def __init__(self, side):
        self.side = side

        if side == "l":
            x == width - 20 - w

    def move_d(self):
        self.rect.move(self.paddle_speed_d)

    def move_u(self):
        self.rect.move(self.paddle_speed_u)

pad1 = paddle("r")
#pad2 = paddle("l")

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                pad1.move_d()
            if event.key == pygame.K_UP:
                pad1.move_u()

    ballrect = ballrect.move(speed)

    if ballrect.left < 0 or ballrect.right > screen_w:
        speed[0] = -speed[0]

    if ballrect.top < 0 or ballrect.bottom > screen_h:
        speed[1] = -speed[1]

    #if ballrect.bottom == 0:
        #ballrect.y = screen_h

    #if ballrect.top == screen_h:
        #ballrect.bottom = 0

    screen.fill(black)
    screen.blit(ball_image, ballrect)
    screen.blit(pad1.image, pad1.rect)
    pygame.display.flip()
    pygame.time.wait(1)

2 个答案:

答案 0 :(得分:2)

来自文档:

  

move()

     

返回由给定偏移量移动的新矩形。 xy参数可以是任何整数值,正数或负数。

     

move_ip()

     

Rect.move()方法相同,但在适当的位置运行。

如果您在self.rect.move(self.paddle_speed_d)中将self.rect.move_ip(self.paddle_speed_d)更改为move_d(),则可以执行此操作(同样适用于move_u()

(这仍然存在move_d()仅在按下键时调用的问题。这意味着您必须反复按下向下键才能移动您的球拍。这可能是您想要的,但如果不是,请考虑有一个更新功能在每个循环上移动球拍,并让move_d()move_u()设置球拍的速度。)

答案 1 :(得分:-1)

感谢您尝试提供帮助,但我发现了我的问题。我保存图像的格式没有显示移动。我改变了我的形象,现在它起作用了。