pygame飞机大战用精灵组层编写敌机系列(一)敌机的运动轨迹,贝塞尔曲线方程及杨辉三角计算

飞机大战中,敌机的角色是必不可少的,其运动轨迹有很多种,简单点的,用初中、高中的几何知识,也能创建不少。

例如:圆圈

radius = 200
for angle in range(0,361,10):
    a = angle*math.pi/180
    pos_x = radius *math.sin(a)
    pos_y = radius *math.cos(a)

稍微复杂点 sin函数,控制下中心点y坐标(300)和振幅(200),也能实现很多

for x in range(0,SCENEWIDTH):
    pos_x = x
    angle = x *math.pi/180
    pos_y = 200*math.sin(angle)+300

再例如抛物线函数,螺旋曲线函数,都能实现飞机的各种花样轨迹。

调试下各个参数的数值,顺便温故下初中高中的知识,也是很有乐趣的。

但简单、易行且路径花样繁多的公式,还是得用到贝塞尔曲线方式。可以自行百度,太神奇了。

参考下阿呆的入门介绍。

http://www.cnblogs.com/wjtaigwh/p/6647114.html

看下n 阶贝塞尔曲线计算公式实现

https://www.jianshu.com/p/7c56103dcf63

编写了一个容易理解点的 python的实现方式。

用到了下面的知识点

----------------------------------------------------------------

  • N = 3: P = (1-t)^2P0 + 2(1-t)tP1 + t^2*P2
  • N = 4: P = (1-t)^3P0 + 3(1-t)^2tP1 + 3(1-t)t^2P2 + t^3*
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你提供一些基本的代码框架和思路来实现一个简单的精灵飞机大战游戏。 首先,你需要安装Pygame模块,然后导入它和其他必要的模块: ```python import pygame import random import os ``` 接下来,你需要初始化Pygame并设置游戏窗口的大小和标题: ```python pygame.init() WIDTH = 480 HEIGHT = 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("飞机大战") ``` 然后你需要定义几个常量,如颜色、速度和图片等: ```python # 颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) # 速度 FPS = 60 PLAYER_SPEED = 5 ENEMY_SPEED = 3 BULLET_SPEED = 7 # 图片 background_img = pygame.image.load(os.path.join("img", "background.png")) player_img = pygame.image.load(os.path.join("img", "player.png")) enemy_img = pygame.image.load(os.path.join("img", "enemy.png")) bullet_img = pygame.image.load(os.path.join("img", "bullet.png")) ``` 接下来,你需要创建玩家和敌人的类: ```python class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = player_img self.rect = self.image.get_rect() self.rect.centerx = WIDTH // 2 self.rect.bottom = HEIGHT - 10 self.speedx = 0 def update(self): self.speedx = 0 keystate = pygame.key.get_pressed() if keystate[pygame.K_LEFT]: self.speedx = -PLAYER_SPEED if keystate[pygame.K_RIGHT]: self.speedx = PLAYER_SPEED self.rect.x += self.speedx if self.rect.right > WIDTH: self.rect.right = WIDTH if self.rect.left < 0: self.rect.left = 0 def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = enemy_img self.rect = self.image.get_rect() self.rect.x = random.randrange(0, WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = ENEMY_SPEED def update(self): self.rect.y += self.speedy if self.rect.top > HEIGHT + 10: self.rect.x = random.randrange(0, WIDTH - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speedy = ENEMY_SPEED + random.randrange(0, 3) ``` 然后你需要创建子弹的类: ```python class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = bullet_img self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speedy = -BULLET_SPEED def update(self): self.rect.y += self.speedy if self.rect.bottom < 0: self.kill() ``` 接下来,你需要创建一些精灵组: ```python all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() bullets = pygame.sprite.Group() ``` 然后你需要创建一些敌人并添加到精灵组中: ```python for i in range(8): enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) ``` 接下来,你需要创建一个游戏循环并处理事件: ```python running = True clock = pygame.time.Clock() while running: clock.tick(FPS) # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() # 更新 all_sprites.update() # 碰撞检测 hits = pygame.sprite.groupcollide(enemies, bullets, True, True) for hit in hits: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) hits = pygame.sprite.spritecollide(player, enemies, False) if hits: running = False # 绘制 screen.blit(background_img, (0, 0)) all_sprites.draw(screen) # 更新屏幕 pygame.display.flip() pygame.quit() ``` 最后,你需要记得在程序结束时调用`pygame.quit()`来退出Pygame。 这只是一个简单的游戏框架,你可以根据自己的需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值