例如,射弹飞离屏幕,程序是否仍在计算其位置,速度等?
如果是的话,如何释放它?
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename)
x = 0.
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
screen.blit(background, (0,0))
screen.blit(sprite, (x, 100))
x+= 10.
pygame.display.update()
答案 0 :(得分:1)
是的,但由于你只有一个射弹(使用x增加),你可以使用一些if语句轻松选择做什么。当有多个射弹(你需要存放在一个容器中)时,这个过程会变得更加困难,你应该应用它。
这是一个例子
for projectile in projectile_list:
# Check if the position is inside the screen
if 0 < projectile.x < WIDTH and 0 < projectile.y < HEIGHT:
# Do position operations
这样,您只需处理所需内容。您可以应用类似的方法从列表或您正在使用的任何容器中移除未使用的射弹。
答案 1 :(得分:1)
是的,仍然需要计算位置,速度等,否则屏幕外的任何物体都不能再次进入屏幕区域。 Pygame非常聪明,不会尝试渲染这些对象。
通常建议使用pygame sprites and sprite groups,只需拨打self.kill()
即可删除精灵。您也可以使用列表或集来存储对象,但是您必须自己编写更多代码。
因此,我首先定义一个pygame.Rect
(game_area
),其大小与屏幕相同或稍大一些(在下面的示例中,我使用较小的一个)。 Rects有一个contains
方法,你可以用它来检查你的精灵的矩形是否在game_area
矩形内。如果精灵在外面,只需调用self.kill()
,pygame将从所有相关的精灵组中删除精灵。
import random
import pygame as pg
from pygame.math import Vector2
class Projectile(pg.sprite.Sprite):
def __init__(self, pos, game_area):
super().__init__()
self.image = pg.Surface((5, 5))
self.image.fill(pg.Color('aquamarine2'))
self.rect = self.image.get_rect(center=pos)
self.vel = Vector2(2, 0).rotate(random.randrange(360))
self.pos = Vector2(pos)
self.game_area = game_area
def update(self):
self.pos += self.vel
self.rect.center = self.pos
if not self.game_area.contains(self.rect):
self.kill()
def main():
screen = pg.display.set_mode((640, 480))
game_area = pg.Rect(60, 60, 520, 360)
game_area_color = pg.Color('aquamarine2')
clock = pg.time.Clock()
all_sprites = pg.sprite.Group(Projectile(game_area.center, game_area))
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
all_sprites.add(Projectile(game_area.center, game_area))
all_sprites.update()
screen.fill((30, 30, 30))
all_sprites.draw(screen)
pg.draw.rect(screen, game_area_color, game_area, 2)
pg.display.flip()
clock.tick(60)
if __name__ == '__main__':
pg.init()
main()
pg.quit()