pygame导入图片制作炮弹类让炮弹从窗口左侧以抛物线飞向敌人
时间: 2023-06-19 15:04:03 浏览: 171
好的,下面是制作炮弹类并实现抛物线运动的示例代码:
```python
import pygame
import math
pygame.init()
width, height = 640, 480
screen = pygame.display.set_mode((width, height))
class Bullet(pygame.sprite.Sprite):
def __init__(self, pos, target):
super().__init__()
self.image = pygame.image.load('bullet.png').convert_alpha()
self.rect = self.image.get_rect(center=pos)
self.start_pos = pos
self.target_pos = target
self.speed = 10
self.gravity = 0.5
self.angle = math.atan2(target[1]-pos[1], target[0]-pos[0])
self.vx = self.speed * math.cos(self.angle)
self.vy = self.speed * math.sin(self.angle)
self.time = 0
def update(self):
self.time += 1
self.rect.x = self.start_pos[0] + self.vx * self.time
self.rect.y = self.start_pos[1] + (self.vy * self.time + 0.5 * self.gravity * self.time ** 2)
if self.rect.left > width or self.rect.top > height:
self.kill()
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 50))
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect(center=(width-50, height-50))
all_sprites = pygame.sprite.Group()
enemy = Enemy()
all_sprites.add(enemy)
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
screen.fill((255, 255, 255))
all_sprites.update()
all_sprites.draw(screen)
if pygame.mouse.get_pressed()[0]:
bullet = Bullet((0, height//2), pygame.mouse.get_pos())
all_sprites.add(bullet)
pygame.display.update()
clock.tick(60)
```
在这个示例中,我们先定义了一个 `Bullet` 类和一个 `Enemy` 类。`Bullet` 类继承自 `pygame.sprite.Sprite` 类,并在其构造函数中加载了炮弹图片,并计算了炮弹的初速度和运动角度,以及添加了重力加速度,用于实现抛物线运动。在 `update` 方法中根据时间更新炮弹位置,如果炮弹超出屏幕边界,则从精灵组中删除。`Enemy` 类则仅继承自 `pygame.sprite.Sprite` 类,并在其构造函数中创建了一个红色的矩形作为敌人。
在主循环中,我们创建了一个 `all_sprites` 精灵组,并将敌人添加到其中。每帧都更新精灵组中的所有精灵,并将它们绘制到屏幕上。当玩家按下鼠标左键时,创建一个新的炮弹,并将其添加到精灵组中。
注意,这个示例中的炮弹运动轨迹是一条简单的抛物线,如果需要更精确的抛物线运动,可以考虑使用更高级的物理引擎,如 Box2D 等。
阅读全文