块无法移动

时间:2017-08-22 16:55:15

标签: python pygame

我正在尝试移动这个矩形来制作Pong。我以前工作过,但是搞砸了代码。 任何人都可以帮助我让它移动并可能使我的代码看起来更干净吗?

同样,我让它移动了,但问题似乎出现在Update方法中。

可能是ScreenSide参数??? ...

import pygame, sys, random
from pygame.locals import *
pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((800, 600))
rectImg1 = 'Rect.jpg'
rectImg2 = 'Rect2.jpg'

RIGHT = "RIGHT"
LEFT = "LEFT"

WHITE = (255,255,255)
FPS = 30
PADDLE_SPEED = 5
BALL_SPEED = 10
fpsClock = pygame.time.Clock()
xPos = 0
yPos = 0
leftY = 20
rightY = 20
class Paddle(pygame.sprite.Sprite):
    def __init__(self, screenSide):
        pygame.sprite.Sprite.__init__(self)
        self.screenSide = screenSide
        if self.screenSide == LEFT:
            self.image = pygame.image.load(rectImg1).convert_alpha()
            self.rect = self.image.get_rect()
            self.rect.x = 20
            self.rect.y = 20
    def update(self):
        if self.screenSide == LEFT:
            self.y = leftY
allSpritesGroup = pygame.sprite.Group()

paddle = Paddle(LEFT)

allSpritesGroup.add(paddle)

#code to make it move
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    if paddle.screenSide == LEFT:
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s:
                paddle.y += PADDLE_SPEED
            elif event.key == pygame.K_w:
                paddle.y -= PADDLE_SPEED
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_s or event.key == pygame.K_w:
                 paddle.y == 0
    screen.fill((255,255,255))

    allSpritesGroup.draw(screen)
    allSpritesGroup.update()
    pygame.display.flip()
    fpsClock.tick(FPS)
pygame.quit()

2 个答案:

答案 0 :(得分:0)

只是一个猜测但你的问题可能在:

elif event.type == pygame.KEYUP:
    if event.key == pygame.K_s or event.key == pygame.K_w:
        paddle.y == 0

这看起来更像是一个比较,如果不是,那么只要你放开一个键就可以将y设置为0.

此外,你对更新功能是正确的:

def update(self):
    if self.screenSide == LEFT:
        self.y = leftY

您经常将y设置为20,因此每次将其更新为20时都不会移动。

答案 1 :(得分:0)

您的事件处理已被破坏。由于此行KEYDOWNKEYUPif paddle.screenSide == LEFT:事件位于事件循环之外。您还需要更新paddle.rect.y而不是paddle.y,您应该在不使用全局变量的类中进行更新。我为您提供了一个self.y_speed属性,您在事件循环中设置该属性,然后使用它来更新self.rect.y方法中每一帧的update位置。并删除screenSide检查,并在实例化过程中将图像和位置传递给精灵。

import sys
import pygame


pygame.init()
screen = pygame.display.set_mode((800, 600))
screen_rect = screen.get_rect()

rectImg1 = pygame.Surface((30, 50))
rectImg1.fill((20, 20, 120))
rectImg2 = pygame.Surface((30, 50))
rectImg2.fill((120, 10, 20))

WHITE = (255,255,255)
FPS = 30
PADDLE_SPEED = 5
fpsClock = pygame.time.Clock()


class Paddle(pygame.sprite.Sprite):

    def __init__(self, image, pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(topleft=pos)
        self.y_speed = 0

    def update(self):
        self.rect.y += self.y_speed


allSpritesGroup = pygame.sprite.Group()

paddle = Paddle(rectImg1, (20, 20))
paddle2 = Paddle(rectImg2, (750, 20))
allSpritesGroup.add(paddle, paddle2)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s:
                paddle.y_speed = PADDLE_SPEED
            elif event.key == pygame.K_w:
                paddle.y_speed = -PADDLE_SPEED
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_s or event.key == pygame.K_w:
                 paddle.y_speed = 0

    allSpritesGroup.update()

    screen.fill(WHITE)
    allSpritesGroup.draw(screen)
    pygame.display.flip()
    fpsClock.tick(FPS)