sprite碰撞检测并从pygame中的组中删除一个sprite
问题描述:
所以我需要每次按下 - (减号)键时从组中删除一个sprite。但是,我很困惑如何去做。我遇到的另一个问题是当我按+键时,它一次添加多个精灵。我猜我还需要检查KEYUP?我也有一个bug,其中一些精灵将会在每个精灵的顶部创建,并且会一直停留在彼此之间。我如何检查现有的精灵将在哪里生成?这里是我的代码sprite碰撞检测并从pygame中的组中删除一个sprite
dragon.py
import pygame
from pygame.locals import *
class Dragon(pygame.sprite.Sprite):
def __init__(self, x,y, vx, vy):
super().__init__();
self.image = pygame.image.load("images/dragon.png").convert()
self.image.set_colorkey(pygame.Color(255,0,255))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.vx = vx
self.vy = vy
def draw(self, SCREEN):
SCREEN.blit(self.image, (self.rect.x, self.rect.y))
def move(self, SCREEN):
r_collide = self.rect.x + self.image.get_width() + self.vx >= SCREEN.get_width()
l_collide = self.rect.x + self.vx <= 0
t_collide = self.rect.y + self.vy <= 0
b_collide = self.rect.y + self.image.get_height() + self.vy >= SCREEN.get_height()
# Check collision on right and left sides of screen
if l_collide or r_collide:
self.vx *= -1
# Check collision on top and bottom sides of screen
if t_collide or b_collide:
self.vy *= -1
self.rect.x += self.vx
self.rect.y += self.vy
def bounce(self, SCREEN):
self.vy *= -1
self.vx *= -1
dragon_animation.py
import pygame
import sys
from random import *
from pygame.locals import *
from flying_dragon.dragon import Dragon
def main():
pygame.init()
FPS = 30
FPS_CLOCK = pygame.time.Clock()
''' COLOR LIST '''
WHITE = pygame.Color(255,255,255)
''' create initial window '''
window_size = (500, 500)
SCREEN = pygame.display.set_mode(window_size)
''' set the title '''
pygame.display.set_caption("Flying Dragons")
''' fill background color in white '''
SCREEN.fill(WHITE)
''' group to store dragons '''
dragons = pygame.sprite.Group()
d1 = Dragon(0,0,3,2)
d1.draw(SCREEN)
dragons.add(d1)
''' main game loop '''
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
SCREEN.fill(WHITE)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_PLUS or pygame.K_KP_PLUS:
d = Dragon(randint(1, SCREEN.get_width() - dragon.rect.x), randint(1, SCREEN.get_height()- dragon.rect.y), randint(1, 5), randint(1, 5))
dragons.add(d)
for dragon in dragons:
dragons.remove(dragon)
collisions = pygame.sprite.spritecollide(dragon, dragons, False)
dragons.add(dragon)
for dragon in collisions:
dragon.bounce(SCREEN)
for dragon in dragons:
dragon.move(SCREEN)
dragons.update(SCREEN)
dragons.draw(SCREEN)
pygame.display.update()
FPS_CLOCK.tick(FPS)
if __name__ == "__main__":
main()
答
if event.key == pygame.K_MINUS or pygame.K_KP_MINUS:
dragons.remove(dragons[0])
应该去除精灵工作。精灵不在组中排序,因此只会删除一个随机的精灵。
作为另一个指针,你应该看看重新定义你的Dragon.move()
函数为dragon.update(),然后Group.update()
调用将移动所有的龙。
答
您不需要在while循环之前立即绘制龙。 while循环内的绘制就足够了。
当您按下某个键时,事件列表将保存您按下的哪个键,只要这个键被关闭,就会创建一条龙。由于循环运行速度相当快,因此在您将手指从键盘上移开之前会创建几个龙。
也很好做
pygame.event.pump()
的
for event in pygame.event.get():
,让你清除事件列表beofre下一次运行前
。
阅读about the pygame event pump here.
使用key = pygame.key.get_pressed()
而不是event.get,因为它会读取一次按键。
由于此错误,无法运行您的代码。
ImportError: No module named flying_dragon.dragon
你想删除哪条龙?第一?最后一个?随机? – xthestreams
最好是最后一个添加的,但对于这个特殊问题并不重要 –