# from pickle import TRUE
import pygame
import random
from os import path
import pygame.freetype
import sys
meteor_images = []
meteor_list=[
'meteorBrown_big1.png','meteorBrown_med1.png',
'meteorBrown_med1.png','meteorBrown_med3.png',
'meteorBrown_small1.png','meteorBrown_small2.png',
'meteorBrown_tiny1.png'
]
current_dir = path.dirname(__file__)
img_dir = path.join(current_dir,'img')
font_dir = path.join(current_dir,'fonts')
snd_dir = path.join(current_dir,'snd')
SCREEN_SIZE = WIDTH, HEIGHT = 480, 600
FPS = 60
# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW =(255,255,0)
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("太空射击")
# background_file = os.path.join(img_dir,'playerShip1_orange.png')
background = pygame.image.load(path.join(img_dir,'starfield.png'))
background_rect = background.get_rect()
player_img = pygame.image.load(path.join(img_dir,'playerShip1_orange.png'))
player_mini_img = pygame.image.load(path.join(img_dir,'playerShip1_orange.png')).convert()
player_mini_img = pygame.transform.scale(player_mini_img,(25,19))
for m in meteor_list:
meteor_images.append(pygame.image.load(path.join(img_dir,m)))
bullet_img = pygame.image.load(path.join(img_dir,'laserRed16.png'))
explosion_anim = {'lg': [],'sm':[], 'player':[]}
for i in range(9):
file_name = 'regularExplosion0{}.png'.format(i)
img=pygame.image.load(path.join(img_dir,file_name)).convert()
img.set_colorkey(BLACK)
img_lg = pygame.transform.scale(img,(75,75))
explosion_anim['lg'].append(img_lg)
img_sm = pygame.transform.scale(img,(32,32))
explosion_anim['sm'].append(img_sm)
file_name = 'sonicExplosion0{}.png'.format(i)
img = pygame.image.load(path.join(img_dir,file_name)).convert()
img.set_colorkey(BLACK)
explosion_anim['player'].append(img)
powerup_images = {}
powerup_images['shield'] = pygame.image.load(path.join(img_dir,'shield_gold.png')).convert()
powerup_images['gun'] = pygame.image.load(path.join(img_dir,'bolt_gold.png')).convert()
shoot_sound = pygame.mixer.Sound(path.join(snd_dir,'pew.wav'))
expl_sounds = []
for snd in ['expl3.wav','expl6.wav']:
expl_sounds.append(pygame.mixer.Sound(path.join(snd_dir,snd)))
pygame.mixer.music.load(path.join(snd_dir,'tgfcoder-FrozenJam-SeamlessLoop.mp3'))
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(loops = -1)
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = player_img
self.image = pygame.transform.scale(player_img, (50, 38))
# self.image.set_colorkey(BLACK)
# self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.radius = 20
# pygame.draw.circle(self.image,RED,self.rect.center,self.radius)
self.rect.centerx = WIDTH / 2 # center=(centerx, centery)
self.rect.bottom = HEIGHT - 10
self.speedx = 0
self.shield = 100
self.delay = 100
self.last_shoot = pygame.time.get_ticks()
self.lives = 3
self.hidden = False
self.hide_timer = pygame.time.get_ticks()
self.power = 1
self.power_time =pygame.time.get_ticks()
def update(self):
self.speedx = 0
key_state = pygame.key.get_pressed()
if key_state[pygame.K_LEFT]:
self.speedx = -8
if key_state[pygame.K_RIGHT]:
self.speedx = 8
if key_state[pygame.K_SPACE]:
self.shoot()
self.rect.x += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
if self.hidden and pygame.time.get_ticks() - self.hide_timer >1000:
self.hidden = False
self.rect.centerx = WIDTH / 2 # center=(centerx, centery)
self.rect.bottom = HEIGHT - 10
# self.rect.midbottom = (WIDTH / 2, HEIGHT - 10)
if self.power >= 2 and pygame.time.get_ticks()-self.power_time > 5000:
self.power -= 1
self.power_time = pygame.time.get_ticks()
def shoot(self):
now = pygame.time.get_ticks()
if now - self.last_shoot > 200:
if self.power == 1:
x , y = self.rect.midtop
b = Bullet(x,y)
all_sprites.add(b)
bullets.add(b)
if self.power >= 2:
bullet1 = Bullet(self.rect.left,self.rect.centery)
bullet2 = Bullet(self.rect.right,self.rect.centery)
all_sprites.add(bullet1)
bullets.add(bullet1)
all_sprites.add(bullet2)
bullets.add(bullet2)
shoot_sound.play()
self.last_shoot = now
def hide(self):
self.hidden = True
self.hide_timer = pygame.time.get_ticks()
self.rect.center = (WIDTH / 2,HEIGHT + 100)
def powerup(self):
self.power += 1
self.power_time = pygame.time.get_ticks()
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image_orig = random.choice(meteor_images)
self.image = self.image_orig.copy()
# self.image.fill(RED)
self.rect = self.image.get_rect()
self.radius = int(self.rect.width * .85 / 2)
# pygame.draw.circle(self.image,RED,self.rect.center, self.radius)
self.rect.y = random.randrange(-100, -40)
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.speedy = random.randrange(1,8)
self.speedx = random.randrange(-3,3)
self.rot = 0
self.rot_speed = random.randrange(-8,8)
self.last_update = pygame.time.get_ticks()
def update(self):
self.rect.y = self.rect.y + self.speedy
self.rect.x += self.speedx
if self.rect.top > HEIGHT + 10 or self.rect.right < -1 or self.rect.left > WIDTH + 1:
self.rect.y = random.randrange(-100, -40)
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.speedy = random.randrange(1,8)
self.rotate()
def rotate(self):
now = pygame.time.get_ticks()
if now - self.last_update > 100:
self.last_update = now
self.rot = (self.rot + self.rot_speed) % 360
old_center = self.rect.center
self.image = pygame.transform.rotate(self.image_orig, self.rot)
self.rect = self.image.get_rect()
self.rect.center = old_center
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_img
# self.image.fill(YELLOW)
self.rect = self.image.get_rect()
# self.rect.botom = y
# self.rect.centerx = x
self.rect.midbottom = x, y
self.speedy = -10
def update(self):
self.rect.y = self.rect.y + self.speedy
if self.rect.bottom < 0:
self.kill()
class Explosion(pygame.sprite.Sprite):
def __init__(self, center,size):
pygame.sprite.Sprite.__init__(self)
self.size = size
self.image = explosion_anim[self.size][0]
self.rect = self.image.get_rect()
self.rect.center = center
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.frame += 1
if self.frame == len(explosion_anim[self.size]):
self.kill()
else:
self.im
太空射击游戏中所需的素材及完整程序
需积分: 0 129 浏览量
更新于2022-08-02
1
收藏 34.52MB ZIP 举报
太空射击游戏是一款深受玩家喜爱的游戏类型,它通常包含高速的空战、丰富的武器系统和多彩的视觉效果。在这个项目中,我们将深入探讨制作一款太空射击游戏所需的素材和完整程序的关键要素。
让我们关注`main.py`这个文件。这是游戏的主程序文件,通常包含了游戏的初始化、游戏循环、事件处理、渲染以及游戏逻辑。`main.py`可能包括以下部分:
1. **初始化**:设置窗口大小、背景色、游戏对象(如玩家飞船、敌人、子弹)的初始状态。
2. **游戏循环**:游戏的核心部分,不断更新屏幕并处理用户输入。循环通常包括更新游戏状态、碰撞检测、绘制图形等步骤。
3. **事件处理**:监听键盘、鼠标事件,根据玩家的操作控制飞船移动、发射子弹。
4. **渲染**:在屏幕上绘制游戏元素,包括背景、飞船、敌人、子弹、爆炸效果等。
5. **游戏逻辑**:实现游戏规则,如生命值管理、得分计算、敌人生成和行为控制。
接下来,我们来看`img`文件夹。这个文件夹存放了游戏的图像素材,包括:
1. **背景图片**:用于创建游戏环境,可以是宇宙星空、星云或者空间站等。
2. **飞船模型**:玩家和敌人的飞船图像,通常有不同角度和状态,如静止、移动、开火等。
3. **子弹图像**:表示玩家和敌人发射的子弹,可能有不同形状和颜色。
4. **敌人和 Boss**:设计不同的敌人类型,增强游戏挑战性,Boss战通常是游戏高潮。
5. **爆炸和特效**:增加视觉冲击力,如飞船被击毁时的爆炸效果、能量盾激活等。
`fonts`文件夹包含游戏中的字体资源,可能用于:
1. **游戏标题**:吸引玩家的大型字体,通常在主菜单上使用。
2. **得分和计时**:在游戏界面中显示玩家得分、剩余时间等信息。
3. **提示和消息**:展示游戏提示、警告、胜利或失败的消息。
`snd`文件夹包含音频素材:
1. **背景音乐**:营造游戏氛围,可以在游戏的不同阶段切换。
2. **音效**:如飞船引擎声、开火声、爆炸声、碰撞声等,提升游戏沉浸感。
3. **声音通知**:例如,生命值低警告、得分增加的提示音。
综合以上,创建一个太空射击游戏需要结合编程技术(如Python的pygame库)与艺术创作(图像和音频设计)。通过合理组织和优化代码,结合生动的视觉和听觉素材,可以构建出一款引人入胜的太空冒险。对于初学者来说,这样的项目不仅提供了学习编程和游戏开发的机会,也能够锻炼美术和音乐审美,是一次全面的技能锻炼。

蔚蓝慕
- 粉丝: 3015
最新资源
- 中小企业网络推广方案策划范文复习课程------.pdf
- 实训4-1防火墙与网络隔离技术.doc
- hplc测定蛋白质含量方法验证.pptx
- 基于图像的敏感信息识别
- 消防通信指挥车方案.doc
- 网络沟通技巧.docx
- 2023年全国大学生物联网设计竞赛模板.docx
- 奕福茶叶网络营销策划书.doc
- 基于AT89C51单片机的智能水表设计2.doc
- 项目管理(第1部分).ppt
- 酒店无线网络设计方案.doc
- 十分钟了解区块链.pptx
- 以太网接口设计方案样本.doc
- 2023年8月福师离线作业计算机应用基础期末试卷.doc
- 物流网络的构造和库存管理.pptx
- 网络整合教学模式市公开课一等奖百校联赛优质课金奖名师赛课获奖课件.ppt