Я создаю базовую игру в стиле Понг, используя Pygame, и я дошел до перемещения весла. У меня есть код, который должен препятствовать перемещению весла за края экрана, но если игрок удерживает клавишу перемещения, весло перемещается чуть чуть за край экрана. Как только игрок отпускает ключ, веслочка возвращается назад туда, где он должен остановиться.Спрайты не соответствуют границам правильно
Я немного новичок в 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: ', а затем' break'ing из основного цикла on quit. _Это не проблема с вашим кодом, но некоторые советы по стилю, которые вы можете рассмотреть! _ – Augusta
Кроме того, использование 'from import *' немного рискованно, так как оно может выгружать много материала в ваше основное пространство имен. Для небольших программ это не так уж плохо, но позже, если вы имеете дело с большим количеством модулей и функций с большим количеством имен, это может запутать, поскольку «импортные» модули используют имена друг с другом или с вашим собственным. Рассмотрим 'from pygame.locals import pgl' и' if press_keys [pgl.K_UP] '(и т. Д.), Чтобы упорядочить ваши пространства имен. (Обратите внимание, что все, что вы используете из 'pygame.locals', будет нуждаться в префиксе' pgl.', если вы это сделаете! Вам не нужно называть его 'pgl'.) –
Augusta