【发布时间】:2014-12-25 21:43:02
【问题描述】:
我正在使用 Pygame 创建一个基本的 Pong 风格游戏,并且我已经完成了移动球拍的工作。我有代码可以防止球拍移动到屏幕边缘之外,但是如果玩家按住移动键,球拍会稍微移动到屏幕边缘之外。一旦玩家松开按键,桨叶就会弹回它应该停止的位置。
我对 Python 和一般编码有点陌生,所以我的代码可能不是最整洁或最高效的。虽然这个问题可能根本不会影响游戏玩法,但我想知道它为什么会这样以及如何将其更改为我想要的样子。
我的代码是:
import random
import pygame
from pygame.locals import *
from sys import exit
screen_size = 600, 600
w,h = screen_size
screen = pygame.display.set_mode(screen_size)
clock = pygame.time.Clock()
pic = pygame.image.load
class paddle(pygame.sprite.Sprite):
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self)
self.pos = pos
self.posx, self.posy = self.pos
self.width = 10
self.height = 100
self.image = pygame.Surface((self.width, self.height))
self.image.fill((255,255,255))
self.rect = pygame.Rect((0,0), self.image.get_size())
self.speed = 150
def update(self, mov, tp):
self.posy += mov * self.speed * tp
self.rect.center = self.posx, self.posy
class box(pygame.sprite.Sprite):
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self)
self.pos = pos
self.posx, self.posy = self.pos
self.width = 10
self.height = 10
self.image = pygame.Surface((self.width, self.height))
self.image.fill((255,255,255))
self.rect = pygame.Rect((0,0), self.image.get_size())
self.speed = 300
self.directionx = 0
self.directiony = 0
def update(self, mov, tp):
self.posx += mov[0] * self.speed * tp
self.posy += mov[1] * self.speed * tp
self.rect.center = self.posx, self.posy
reset = True
done = False
while done == False:
if reset == True:
p1 = paddle((0,0))
p1 = paddle((20,(h-p1.height)/2))
p2 = paddle((0,0))
p2 = paddle((w-20,(h-p2.height)/2))
paddle_group = pygame.sprite.Group()
paddle_group.add(p1)
paddle_group.add(p2)
ball = box(((w/2)-10,h/2))
ball_group = pygame.sprite.Group(ball)
reset = False
else:
pass
time_passed = clock.tick(60)
time_passed_seconds = time_passed/1000.0
for event in pygame.event.get():
if event.type == QUIT:
done = True
p1_movey = 0
p2_movey = 0
pressed_keys = pygame.key.get_pressed()
pressed_mb = pygame.mouse.get_pressed()
if pressed_keys[K_ESCAPE]:
done = True
if pressed_keys[K_w]:
p1_movey = -2
elif pressed_keys[K_s]:
p1_movey = +2
if pressed_keys[K_UP]:
p2_movey = -2
elif pressed_keys[K_DOWN]:
p2_movey = +2
p1.update(p1_movey, time_passed_seconds)
p2.update(p2_movey, time_passed_seconds)
# This is where the border check is
for PADDLE in paddle_group.sprites():
if PADDLE.posy > h - (PADDLE.height/2):
PADDLE.posy = h - (PADDLE.height/2)
elif PADDLE.posy < (PADDLE.height/2):
PADDLE.posy = (PADDLE.height/2)
screen.fill((0,0,0))
paddle_group.draw(screen)
pygame.display.update()
pygame.quit()
边界部分标有注释。
【问题讨论】:
-
顺便说一句,您可以将
if reset == True:简化为if reset:,因为if语句会自行将非空、非Falsey 值解析为True。这更多的是风格问题,但也可以考虑将done = False; if done == False:更改为running = True; if running:之类的东西,或者甚至使用if True:,然后在退出时从主循环中使用breaking。 这些不是您的代码的问题,而是您可以考虑的一些样式提示! -
除此之外,使用
from <module> import *有点冒险,因为它可以将很多东西转储到您的主命名空间中。对于小程序来说,这还不错,但是稍后,如果您要处理具有很多名称的大量模块和函数,则可能会变得混乱,因为imported 模块彼此或与您自己的模块共享名称。考虑from pygame.locals import pgl和if pressed_keys[pgl.K_UP](等等)来保持你的命名空间井井有条。 (请注意,如果您这样做,您从pygame.locals使用的所有内容都需要前缀pgl.!您不需要将其命名为“pgl”。)
标签: python-2.7 pygame collision-detection sprite rect