效果图 :
思路构图 :
直接贴代码 :
注释算是比较详细
▊ main.py
import pygame
import sys
import traceback
from pygame.locals import *
from random import *
import myplane # 飞机类
import enemy # 敌机类
import bullet # 子弹类
import supply # 补给类
pygame.init()
pygame.mixer.init()
BLACK = ( 0 , 0 , 0 )
GREEN =( 0 , 255 , 0 )
RED = ( 255 , 0 , 0 )
WHITE = ( 255 , 255 , 255 )
bg_size = width , height = 480,700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("My小飞机>_<")
background = pygame.image.load("images\\background.png").convert()
pygame.mixer.music.load("sound\\game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound\\bullet.wav")
bullet_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound\\enemy1_down.wav")
enemy1_down_sound.set_volume(0.1)
enemy2_down_sound = pygame.mixer.Sound("sound\\enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound\\enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("sound\\me_down.wav")
me_down_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("sound\\enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound\\use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound\\supply.wav")
supply_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound\\upgrade.wav")
upgrade_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound\\get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound\\get_bullet.wav")
get_bullet_sound.set_volume(0.2)
click1_sound = pygame.mixer.Sound("sound\\单击1.wav ")
click1_sound.set_volume(0.2)
click2_sound = pygame.mixer.Sound("sound\\单击2.wav ")
click2_sound.set_volume(0.2)
def add_small_enemies(group1 , group2 , num) :
for i in range(num) :
e1 = enemy.SmallEnemy(bg_size)
group1.add( e1 )
group2.add( e1 )
def add_mid_enemies(group1 , group2 , num) :
for i in range(num) :
e2 = enemy.MidEnemy(bg_size)
group1.add( e2 )
group2.add( e2 )
def add_big_enemies(group1 , group2 , num) :
for i in range(num) :
e3 = enemy.BigEnemy(bg_size)
group1.add( e3 )
group2.add( e3 )
def inc_speed( target , inc ):
for each in target :
each.speed += inc
#############################################################################################################
def main():
pygame.mixer.music.play(-1)
#生成我的飞机
me = myplane.MyPlane(bg_size)
#敌方飞机组Group
enemies = pygame.sprite.Group()
#生成小型敌机
small_enemies = pygame.sprite.Group()
add_small_enemies(small_enemies , enemies , 15)
#生成中型敌机
mid_enemies = pygame.sprite.Group()
add_mid_enemies(mid_enemies , enemies , 4)
#生成大型敌机
big_enemies = pygame.sprite.Group()
add_big_enemies(big_enemies , enemies , 2)
#生成普通子弹
bullet1 = []
bullet1_index = 0
BULLET1_NUM = 4
for i in range(BULLET1_NUM) :
bullet1.append( bullet.Bullet1( me.rect.midtop ) )
#生成超级子弹
bullet2= []
bullet2_index = 0
BULLET2_NUM = 8
for i in range(BULLET2_NUM // 2) :
bullet2.append( bullet.Bullet2( (me.rect.centerx - 33 , me.rect.centery) ) )
bullet2.append( bullet.Bullet2( (me.rect.centerx +30 , me.rect.centery) ) )
#中弹图片索引
e1_destroy_index = 0
e2_destroy_index = 0
e3_destroy_index = 0
me_destroy_index = 0
#统计得分
score = 0
score_font = pygame.font.Font("font\\font.ttf" , 36)
#是否暂停的flag
paused = False
pause_nor_image = pygame.image.load("images\\pause_nor.png").convert_alpha()
pause_pressed_image = pygame.image.load("images\\pause_pressed.png").convert_alpha()
resume_nor_image = pygame.image.load("images\\resume_nor.png").convert_alpha()
resume_pressed_image = pygame.image.load("images\\resume_pressed.png").convert_alpha()
pause_rect = pause_nor_image.get_rect()
pause_rect.left , pause_rect.top = width - pause_rect.width - 10 , 10
pause_image = pause_nor_image
#设置难度级别
level = 1
#全屏炸弹
bomb_image = pygame.image.load("images\\bomb.png").convert_alpha()
bomb_rect = bomb_image.get_rect()
bomb_font = pygame.font.Font("font\\font.ttf" , 48)
bomb_num = 3
#发放补给包
bullet_supply = supply.Bullet_Supply(bg_size)
bomb_supply = supply.Bomb_Supply(bg_size)
SUPPLY_TIME = USEREVENT
pygame.time.set_timer(SUPPLY_TIME , 30 * 1000)
#超级子弹定时器
DOUBLE_BULLET_TIME = USEREVENT + 1
#接触我方无敌状态计时器
INVINCIBLE_TIME = USEREVENT + 2
#标志是否使用超级子弹flag
is_double_bullet = False
#生命数量
life_image = pygame.image.load("images\\life.png").convert_alpha()
life_rect = life_image.get_rect()
life_num = 3
#用于阻止重复打开记录文件
recorded = False
clock = pygame.time.Clock()
#切换我的飞机image12
switch_image = True
#用于延迟
delay =100
################################################################################################################
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == MOUSEBUTTONDOWN :
if event.button == 1 and pause_rect.collidepoint( event.pos ) :
paused = not paused
if paused :
pygame.time.set_timer(SUPPLY_TIME , 0)
pygame.mixer.music.pause()
pygame.mixer.pause()
click1_sound.play()
else:
click2_sound.play()
pygame.time.set_timer(SUPPLY_TIME , 30 *1000)
pygame.mixer.music.unpause()
pygame.mixer.unpause()
if event.type == MOUSEMOTION :
if pause_rect.collidepoint( event.pos ) :
if paused :
pause_image = resume_pressed_image
else :
pause_image = pause_pressed_image
else :
if paused :
pause_image = resume_nor_image
else :
pause_image = pause_nor_image
if event.type == KEYDOWN :
if event.key == K_SPACE :
if bomb_num :
bomb_num -= 1
bomb_sound.play()
for each in enemies :
if each.rect.bottom > 0:
each.active = False
if event.type == SUPPLY_TIME :
supply_sound.play()
if choice([ True , False ]) :
bomb_supply.reset()
else:
bullet_supply.reset()
if event.type == DOUBLE_BULLET_TIME :
is_double_bullet = False
pygame.time.set_timer( DOUBLE_BULLET_TIME , 0 )
if event.type == INVINCIBLE_TIME : #计时结束后出发 , 解除无敌状态 , 取消计时器
me.invincible = False
pygame.time.set_timer( INVINCIBLE_TIME , 0 )
#=============================================================
#根据用户得分增加难度
if level == 1 and score>50000 :
level = 2
upgrade_sound.play()
#增加3架小型敌机 , 2架中型敌机 , 1架大型敌机
add_small_enemies( small_enemies , enemies , 3 )
add_mid_enemies( mid_enemies , enemies , 2 )
add_big_enemies( big_enemies , enemies , 1 )
#提升小型敌机速度
inc_speed( small_enemies , 1 )
elif level == 2 and score>300000 :
level = 3
upgrade_sound.play()
#增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
add_small_enemies( small_enemies , enemies , 5 )
add_mid_enemies( mid_enemies , enemies , 3 )
add_big_enemies( big_enemies , enemies , 2 )
#提升小型敌机速度
inc_speed( small_enemies , 1 )
#提升中型敌机速度
inc_speed( mid_enemies , 1 )
elif level == 3 and score>600000 :
level = 4
upgrade_sound.play()
#增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
add_small_enemies( small_enemies , enemies , 5 )
add_mid_enemies( mid_enemies , enemies , 3 )
add_big_enemies( big_enemies , enemies , 2 )
#提升小型敌机速度
inc_speed( small_enemies , 1 )
#提升中型敌机速度
inc_speed( mid_enemies , 1 )
elif level == 4 and score>600000 :
level = 5
upgrade_sound.play()
#增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
add_small_enemies( small_enemies , enemies , 5 )
add_mid_enemies( mid_enemies , enemies , 3 )
add_big_enemies( big_enemies , enemies , 2 )
#提升小型敌机速度
inc_speed( small_enemies , 1 )
#提升中型敌机速度
inc_speed( mid_enemies , 1 )
screen.blit(background , (0,0) )
if not paused and life_num :
#检测键盘操作
key_pressed = pygame.key.get_pressed()
if key_pressed[K_w] or key_pressed[K_UP]:
me.moveUp()
if key_pressed[K_s] or key_pressed[K_DOWN]:
me.moveDown()
if key_pressed[K_a] or key_pressed[K_LEFT]:
me.moveLeft()
if key_pressed[K_d] or key_pressed[K_RIGHT]:
me.moveRight()
#绘制补给包
if bomb_supply.active :
bomb_supply.move()
screen.blit(bomb_supply.image , bomb_supply.rect)
if pygame.sprite.collide_mask(bomb_supply , me) :
get_bomb_sound.play()
if bomb_num < 3:
bomb_num += 1
bomb_supply.active = False
if bullet_supply.active :
bullet_supply.move()
screen.blit(bullet_supply.image , bullet_supply.rect)
if pygame.sprite.collide_mask(bullet_supply , me) :
get_bullet_sound.play()
is_double_bullet = True
pygame.time.set_timer( DOUBLE_BULLET_TIME , 18 * 1000 )
bullet_supply.active = False
#发射子弹
if not (delay % 10) : #每10帧绘制一次
bullet_sound.play()
if is_double_bullet :
bullets = bullet2
bullets[bullet2_index].reset((me.rect.centerx - 33 , me.rect.centery))
bullets[bullet2_index + 1].reset((me.rect.centerx + 30 , me.rect.centery))
bullet2_index = (bullet2_index + 2) % BULLET2_NUM
else:
bullets = bullet1
bullets[bullet1_index].reset( me.rect.midtop )
bullet1_index = (bullet1_index + 1) % BULLET1_NUM
#检测子弹是否击中敌机
for b in bullets:
if b.active:
b.move()
screen.blit( b.image , b.rect )
enemy_hit = pygame.sprite.spritecollide( b , enemies , False , pygame.sprite.collide_mask)
if enemy_hit :
b.active = False
for e in enemy_hit :
if e in mid_enemies or e in big_enemies:
e.hit = True
e.energy -= 1
if e.energy == 0:
e.active = False
else:
e.active = False
#绘制敌机(注意绘制顺序层次 : 大 -> 中 -> 小)
#绘制大
for each in big_enemies:
if each.active :
each.move()
if each.hit :
screen.blit(each.image_hit , each.rect)
each.hit = False
else:
if switch_image:
screen.blit(each.image1 , each.rect)
else:
screen.blit(each.image2 , each.rect)
#绘制血槽
pygame.draw.line( screen , BLACK , (each.rect.left , each.rect.top - 5) , (each.rect.right , each.rect.top - 5) , 2 )
#当生命大于20%显示绿色 , 否则红色
energy_remain = each.energy / enemy.BigEnemy.energy
if energy_remain > 0.2 :
energy_color = GREEN
else:
energy_color = RED
pygame.draw.line( screen , energy_color , (each.rect.left , each.rect.top - 5) , (each.rect.left + each.rect.width * energy_remain ,\
each.rect.top -5) , 2 )
#即将出现 , 开音效
if each.rect.bottom == -50 :
enemy3_fly_sound.play(-1)
else:
#毁灭
if not (delay % 3) :
if e3_destroy_index == 0:
enemy3_down_sound.play()
screen.blit( each.destroy_images[e3_destroy_index] , each.rect)
e3_destroy_index = (e3_destroy_index + 1 ) % 6 #tip
if e3_destroy_index == 0:
enemy3_fly_sound.stop()
score += 10000
each.reset()
#绘制中
for each in mid_enemies:
if each.active :
each.move()
if each.hit :
screen.blit(each.image_hit , each.rect)
each.hit = False
else:
screen.blit(each.image , each.rect)
#绘制血槽
pygame.draw.line( screen , BLACK , (each.rect.left , each.rect.top - 5) , (each.rect.right , each.rect.top - 5) , 2 )
#当生命大于20%显示绿色 , 否则红色
energy_remain = each.energy / enemy.MidEnemy.energy
if energy_remain > 0.2 :
energy_color = GREEN
else:
energy_color = RED
pygame.draw.line( screen , energy_color , (each.rect.left , each.rect.top - 5) , (each.rect.left + each.rect.width * energy_remain ,\
each.rect.top -5) , 2 )
else:
#毁灭
if not (delay % 3) :
if e2_destroy_index == 0:
enemy2_down_sound.play()
screen.blit( each.destroy_images[e2_destroy_index] , each.rect)
e2_destroy_index = (e2_destroy_index + 1 ) % 4 #tip
if e2_destroy_index == 0:
score += 6000
each.reset()
#绘制小
for each in small_enemies:
if each.active :
each.move()
screen.blit(each.image , each.rect)
else:
#毁灭
if not (delay % 3) :
if e1_destroy_index == 0:
enemy1_down_sound.play()
screen.blit( each.destroy_images[e1_destroy_index] , each.rect)
e1_destroy_index = (e1_destroy_index + 1 ) % 4 #tip
if e1_destroy_index == 0:
score += 1000
each.reset()
#检测我方飞机是否被撞
enemies_down = pygame.sprite.spritecollide( me , enemies , False , pygame.sprite.collide_mask)
if enemies_down and not me.invincible :
me.active = False
for e in enemies_down:
e.active = False
#绘制我的飞机
if me.active:
if switch_image:
screen.blit(me.image1 , me.rect)
else:
screen.blit(me.image2 , me.rect)
#利用延迟delay和切换flag switch_image
if delay % 5 == 0 :
switch_image = not switch_image
else:
#毁灭
if not (delay % 3) :
if me_destroy_index == 0:
me_down_sound.play()
screen.blit( me.destroy_images[me_destroy_index] , me.rect)
me_destroy_index = (me_destroy_index + 1 ) % 4 #tip
if me_destroy_index == 0:
life_num -= 1
me.reset()
pygame.time.set_timer( INVINCIBLE_TIME , 3 * 1000)
#绘制生命数量
if life_num :
for i in range(life_num) :
screen.blit( life_image ,(width - 10 -(i +1)*life_rect.width , height - 10 - life_rect.height) )
#绘制全屏炸弹数量
bomb_text = bomb_font.render("× %d " % bomb_num , True , WHITE)
text_rect = bomb_text.get_rect()
screen.blit (bomb_image , (10 , height - 10 - bomb_rect.height))
screen.blit (bomb_text , (20 + bomb_rect.width , height -5 -text_rect.height) )
#绘制得分
score_text = score_font.render("Score : %s" % str(score) , True , WHITE)
screen.blit( score_text , (10 , 5) )
#游戏结束
elif life_num == 0 :
#背景音乐停止
pygame.mixer.music.stop()
#停止所有音效
pygame.mixer.stop()
#停止发放补给
pygame.time.set_timer( SUPPLY_TIME , 0 )
if not recorded :
recorded = True
#读取历史最高得分
with open("record.txt" , "r") as f :
record_score = int(f.read())
#如果破纪录则修改存档
if score > record_score :
with open("record.txt" , "w") as f :
f.write( str(score) )
#绘制结束画面
again_image = pygame.image.load("images\\again.png")
gameover_image = pygame.image.load("images\\gameover.png")
record_score_text = score_font.render("Best : %d" % record_score, True, WHITE)
screen.blit(record_score_text, (50, 50))
gameover_font = pygame.font.Font("font\\font.ttf" , 48)
gameover_text1 = gameover_font.render("Your Score", True, WHITE)
gameover_text1_rect = gameover_text1.get_rect()
gameover_text1_rect.left, gameover_text1_rect.top = (width - gameover_text1_rect.width) // 2, height // 3
screen.blit(gameover_text1, gameover_text1_rect)
gameover_text2 = gameover_font.render(str(score), True, WHITE)
gameover_text2_rect = gameover_text2.get_rect()
gameover_text2_rect.left, gameover_text2_rect.top = (width - gameover_text2_rect.width) // 2, gameover_text1_rect.bottom + 10
screen.blit(gameover_text2, gameover_text2_rect)
again_rect = again_image.get_rect()
again_rect.left, again_rect.top = (width - again_rect.width) // 2, gameover_text2_rect.bottom + 50
screen.blit(again_image, again_rect)
gameover_rect = gameover_image.get_rect()
gameover_rect.left, gameover_rect.top = (width - again_rect.width) // 2, again_rect.bottom + 10
screen.blit(gameover_image, gameover_rect)
# 检测用户的鼠标操作
# 如果用户按下鼠标左键
if pygame.mouse.get_pressed()[0]:
pos = pygame.mouse.get_pos() # 获取鼠标坐标
# 如果用户点击 重新开始
if again_rect.left < pos[0] < again_rect.right and again_rect.top < pos[1] < again_rect.bottom:
main() # 调用main函数,重新开始游戏
# 如果用户点击 结束游戏
elif gameover_rect.left < pos[0] < gameover_rect.right and gameover_rect.top < pos[1] < gameover_rect.bottom:
pygame.quit()
sys.exit()
#绘制暂停按钮
screen.blit( pause_image , pause_rect )
if paused :
pause_font =pygame.font.Font("font\\font.ttf " , 48)
pause_text = pause_font.render("In Pause" , True ,WHITE)
pause_text_rect = pause_text.get_rect()
pause_text_rect.left , pause_text_rect.top = ( width - pause_text_rect.width ) // 2 ,height // 3
screen.blit( pause_text , pause_text_rect )
delay -= 1
if not delay :
delay = 100
'''
print(switch_image) #测试test , delay延迟测试成功
'''
pygame.display.flip()
clock.tick(60)
################################################################################################################
if __name__=="__main__":
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
▊ myplane.py
import pygame
class MyPlane(pygame.sprite.Sprite):
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image1 = pygame.image.load("images\\me1.png")
self.image2 = pygame.image.load("images\\me2.png")
self.destroy_images = []
self.destroy_images.extend ([\
pygame.image.load("images\\me_destroy_1.png ").convert_alpha() , \
pygame.image.load("images\\me_destroy_2.png ").convert_alpha() , \
pygame.image.load("images\\me_destroy_3.png ").convert_alpha() , \
pygame.image.load("images\\me_destroy_4.png ").convert_alpha() \
])
self.rect = self.image1.get_rect()
self.width , self.height = bg_size[0] , bg_size[1]
self.rect.left , self.rect.top = ( self.width - self.rect.width ) // 2 , self.height - self.rect.height - 60
self.speed = 10
self.active = True
self.mask = pygame.mask.from_surface(self.image1)
self.invincible = False
def moveUp(self):
if self.rect.top > 0:
self.rect.top -= self.speed
else:
self.rect.top = 0
def moveDown(self):
if self.rect.bottom < self.height - 60:
self.rect.top += self.speed
else:
self.rect.bottom = self.height - 60
def moveLeft(self):
if self.rect.left > 0:
self.rect.left -= self.speed
else:
self.rect.left = 0
def moveRight(self):
if self.rect.right < self.width:
self.rect.left += self.speed
else:
self.rect.right = self.width
def reset(self) :
self.rect.left , self.rect.top = ( self.width - self.rect.width ) // 2 , self.height - self.rect.height - 60
self.active = True
self.invincible = True
▊ bullet.py
import pygame
class Bullet1(pygame.sprite.Sprite):
def __init__(self,position):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images\\bullet1.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.left , self.rect.top = position
self.speed = 12
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
self.rect.top -= self.speed
if self.rect.top < 0 :
self.active = False
def reset(self , position) :
self.rect.left , self.rect.top = position
self.active = True
class Bullet2(pygame.sprite.Sprite):
def __init__(self,position):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images\\bullet1.png").convert_alpha()
self.rect = self.image.get_rect()
self.rect.left , self.rect.top = position
self.speed = 12
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
self.rect.top -= self.speed
if self.rect.top < 0 :
self.active = False
def reset(self , position) :
self.rect.left , self.rect.top = position
self.active = True
▊ enemy.py
import pygame
from random import *
class SmallEnemy(pygame.sprite.Sprite):
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1.png").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([ \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down1.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down2.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down3.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down4.png").convert_alpha() \
])
self.rect = self.image.get_rect()
self.width ,self.height = bg_size[0] , bg_size[1]
self.speed = 2
self.active = True
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-5 * self.height , 0)
self.mask = pygame.mask.from_surface(self.image)
def move(self) :
if self.rect.top < self.height :
self.rect.top += self.speed
else :
self.reset()
def reset(self) :
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-5 * self.height , 0)
self.active = True
class MidEnemy(pygame.sprite.Sprite):
energy =8
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2.png").convert_alpha()
self.image_hit = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_hit.png").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([ \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down1.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down2.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down3.png").convert_alpha() , \
pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down4.png").convert_alpha() \
])
self.rect = self.image.get_rect()
self.width ,self.height = bg_size[0] , bg_size[1]
self.speed = 1
self.active = True
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-10 * self.height , -self.height)
self.mask = pygame.mask.from_surface(self.image)
self.energy = MidEnemy.energy
self.hit = False
def move(self) :
if self.rect.top < self.height :
self.rect.top += self.speed
else :
self.reset()
def reset(self) :
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-10 * self.height , -self.height)
self.active = True
self.energy = MidEnemy.energy
class BigEnemy(pygame.sprite.Sprite):
energy = 20
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image1 = pygame.image.load("images\\enemy3_n1.png").convert_alpha()
self.image2 = pygame.image.load("images\\enemy3_n2.png").convert_alpha()
self.image_hit = pygame.image.load("images\\enemy3_hit.png ").convert_alpha()
self.destroy_images = []
self.destroy_images.extend([ \
pygame.image.load("images\\enemy3_down1.png").convert_alpha() , \
pygame.image.load("images\\enemy3_down2.png").convert_alpha() , \
pygame.image.load("images\\enemy3_down3.png").convert_alpha() , \
pygame.image.load("images\\enemy3_down4.png").convert_alpha() , \
pygame.image.load("images\\enemy3_down5.png").convert_alpha() , \
pygame.image.load("images\\enemy3_down6.png").convert_alpha() \
])
self.rect = self.image1.get_rect()
self.width ,self.height = bg_size[0] , bg_size[1]
self.speed = 1
self.active = True
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-15 * self.height , -5 * self.height)
self.mask = pygame.mask.from_surface(self.image1)
self.energy = BigEnemy.energy
self.hit = False
def move(self) :
if self.rect.top < self.height :
self.rect.top += self.speed
else :
self.reset()
def reset(self) :
self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-15 * self.height , -5 * self.height)
self.active = True
self.energy = BigEnemy.energy
▊ supply.py
import pygame
from random import *
class Bullet_Supply(pygame.sprite.Sprite) :
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images\\bullet_supply.png").convert_alpha()
self.rect = self.image.get_rect()
self.width , self.height = bg_size[0] , bg_size[1]
self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
self.speed = 5
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
if self.rect.top < self.height :
self.rect.top += self.speed
else:
self.active = False
def reset(self):
self.active = True
self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
class Bomb_Supply(pygame.sprite.Sprite) :
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("images\\bomb_supply.png").convert_alpha()
self.rect = self.image.get_rect()
self.width , self.height = bg_size[0] , bg_size[1]
self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
self.speed = 5
self.active = False
self.mask = pygame.mask.from_surface(self.image)
def move(self):
if self.rect.top < self.height :
self.rect.top += self.speed
else:
self.active = False
def reset(self):
self.active = True
self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
☀ 后记
♠ 小甲鱼原创;具体教程点这里
♥ 对小甲鱼的源码添加了部分注释;对视频中的错误进行了改正;对部分逻辑进行了改进
♦ 素材善用Baidu,本文避免侵权
♣ 模块的安装问题戳这里;生成可执行文件戳这里;进阶版的小游戏看这里 >_<