#python #pygame #collision
#python #pygame #столкновение
Вопрос:
Я создал программу, которая заставляет квадраты подпрыгивать по всему экрану. Каждый раз, когда они вступают в контакт с игроком, они исчезают (я меняю их местоположение так, чтобы они были за пределами дисплея) и, следовательно, не могут быть видны пользователю. Возможно ли не только изменить их местоположение, но и полностью избавиться от них, чтобы процессору не приходилось их обрабатывать.
import pygame
import random
import sys
import time
Height = 800
Width = 800
Steps = 0
running = True
Number = 2000
x = 0
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
pygame.init()
display = pygame.display.set_mode((Height, Width))
clock = pygame.time.Clock()
pygame.display.set_caption("Game")
class Ball(object):
def __init__(self, ball_pos_x, ball_pos_y, ball_height, ball_width, delta_x, delta_y):
self.ball_pos_x = ball_pos_x
self.ball_pos_y = ball_pos_y
self.ball_height = ball_height
self.ball_width = ball_width
self.delta_x = delta_x
self.delta_y = delta_y
def draw(self):
pygame.draw.rect(display, WHITE, (self.ball_pos_x, self.ball_pos_y,
self.ball_height, self.ball_height))
def update(self):
self.ball_pos_x = self.delta_x
self.ball_pos_y = self.delta_y
if self.ball_pos_x < 0:
self.delta_x = self.delta_x * -1
if self.ball_pos_x > Width - self.ball_width:
self.delta_x = self.delta_x * -1
if self.ball_pos_y < 0:
self.delta_y = self.delta_y * -1
if self.ball_pos_y > Height - self.ball_height:
self.delta_y = self.delta_y * -1
class Player:
def __init__(self, player_height, player_width, pos_x, pos_y, player_vel):
self.player_height = player_height
self.player_width = player_width
self.player_vel = player_vel
self.pos_x = pos_x
self.pos_y = pos_y
self.rect = self.pos_x
def draw(self):
pygame.draw.rect(display, BLUE, (self.pos_x, self.pos_y,
self.player_height, self.player_width))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.pos_x > 0:
self.pos_x -= self.player_vel
if keys[pygame.K_RIGHT] and self.pos_x < Width - player.player_width:
self.pos_x = self.player_vel
if keys[pygame.K_UP] and self.pos_y > 0:
self.pos_y -= self.player_vel
if keys[pygame.K_DOWN] and self.pos_y < Height - player.player_height:
self.pos_y = self.player_vel
def collision(self):
pass
player = Player(10, 10, Width/2, Height/2, 5)
"""
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and x > 0:
x -= vel
if keys[pygame.K_RIGHT] and x < 800 - 30:
x = vel
"""
list = []
for i in range(Number):
ball = Ball(random.randrange(0, Width - 10), random.randrange(0, Height - 10),
10, 10, random.randint(-10, 10), random.randint(-10, 10))
list.append(ball)
while running:
display.fill(BLACK)
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# Update
# Draw
for ball in list:
ball.draw()
ball.update()
if (ball.ball_pos_x >= player.pos_x - ball.ball_width and ball.ball_pos_x <= player.pos_x player.player_width and
ball.ball_pos_y >= player.pos_y - ball.ball_height and ball.ball_pos_y <= player.pos_y player.player_height):
ball.ball_pos_x = -20
ball.delta_x = -1
x = 1
print(x)
player.draw()
player.update()
pygame.display.flip()
pygame.quit()
Комментарии:
1. возможно, удалите его из своего списка (или какого-либо сбора данных)?
2. Должен ли я использовать функцию list.pop (…)? Если да, то как?
3. предположим, у вас есть список (ball), у шара есть свойство с именем ‘isgone’. в ваших циклах проверьте, пропал ли объект, тогда нет хода. или просто удалите шар.
Ответ №1:
Вы можете использовать self.kill()
в классе sprite. Это должно удалить их из группы спрайтов. Хотя, насколько я знаю, вам нужно наследовать pygame.sprite.Sprite
вместе с добавлением спрайта в группу.
Итак, допустим:
examplegroup = pygame.sprite.Group()
class Ball(pygame.sprite.Sprite):
def __init__(self):
super().__init__(examplegroup):
И в update()
функции…
if collided:
self.kill()
Кроме того, одно из преимуществ использования группы спрайтов по сравнению со списком заключается в том, что это, как правило, быстрее и может позволить вам легче выполнять столкновение с pygame.sprite.spritecollide()
.