|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 KeyError 于 2023-1-31 13:00 编辑
敌只因
敌机有小型,中型,大型,分别写一个类
- #enemy.py
- import pygame
- from random import randint
- class SmallEnemy(pygame.sprite.Sprite):
- def __init__(self,bg_size):
- pygame.sprite.Sprite.__init__(self)
- self.image=pygame.image.load("images/enemy1.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.active=True
- self.rect.left,self.rect.top=\
- randint(0,self.width-self.rect.width),\
- randint(-5*self.height,0)
- class MidEnemy(pygame.sprite.Sprite):
- energy=8
-
- def __init__(self,bg_size):
- pygame.sprite.Sprite.__init__(self)
- self.image=pygame.image.load("images/enemy2.png").convert_alpha()
- self.image_hit=pygame.image.load("images/enemy2_hit.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=8
- self.hit=False
- def move(self):
- if self.rect.top<self.height:
- self.rect.top+=self.speed
- else:
- self.reset()
- def reset(self):
- self.active=True
- self.energy=8
- self.rect.left,self.rect.top=\
- randint(0,self.width-self.rect.width),\
- randint(-10*self.height,-self.height)
- 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.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
- self.bullet=[]
- def move(self):
- if self.rect.top<self.height:
- self.rect.top+=self.speed
- else:
- self.reset()
- def reset(self):
- self.active=True
- self.energy=BigEnemy.energy
- self.rect.left,self.rect.top=\
- randint(0,self.width-self.rect.width),\
- randint(-15*self.height,-5*self.height)
复制代码
- #main.py
- import pygame
- import sys
- import traceback
- import myplne
- import enemy
- from pygame.locals import *
- pygame.init()
- pygamr.mixer.init()
- bg_size = width,height = 480,700 #尺寸
- screen = pygame.display.set_mode(bg_size) #画布
- pygame.display.set_caption("飞机大战") #标题
- #颜色常量
- BLACK=(0,0,0)
- GREEN=(0,255,0)
- WHITE=(255,255,255)
- RED=(255,0,0)
- YELLOW=(255,255,0)
- background=pygame.image.load("images/background.png").convert()
- def main():
- clock = pygame.time.Clock()
- me = myplne.MyPlane(bg_size)
- def add_small(a,b,num):
- for i in range(num):
- e1=myenemy.SmallEnemy(bg_size)
- a.add(e1)
- b.add(e1)
- def add_mid(a,b,num):
- for i in range(num):
- e2=myenemy.MidEnemy(bg_size)
- a.add(e2)
- b.add(e2)
- def add_big(a,b,num):
- for i in range(num):
- e3=myenemy.BigEnemy(bg_size)
- bu_i=0
- BU_N=4
- for i in range(BU_N):
- e3.bullet.append(mybullet.Bullet1(e3.rect.midtop))
- a.add(e3)
- b.add(e3)
- def add_speed(feji,add):
- for i in feji:
- i.speed+=add
- small=pygame.sprite.Group()
- add_small(small,enemi,15)
- mid=pygame.sprite.Group()
- add_mid(mid,enemi,4)
- big=pygame.sprite.Group()
- add_big(big,enemi,2)
- qie = True
- while True:
- for event in pygame.event.get():
- if event.type == QUIT: #如果用户点击关闭按钮
- pygame.quit()
- sys.exit()
-
- #控制飞机
- key_p=pygame.key.get_pressed()
- if key_p[K_w] or key_p[K_UP]:
- me.moveUp()
- if key_p[K_s] or key_p[K_DOWN]:
- me.moveDown()
- if key_p[K_a] or key_p[K_LEFT]:
- me.moveLeft()
- if key_p[K_d] or key_p[K_RIGHT]:
- me.moveRight()
- if qie:
- screen.blit(me.image1,me.rect)
- else:
- screen.blit(me.image2,me.rect)
- for each in big:
- if each.active:
- each.move()
- if each.hit:
- screen.blit(each.image_hit,each.rect)
- each.hit=False
- else:
- if qie:
- 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)
- energy_r=each.energy/myenemy.BigEnemy.energy
- if energy_r>0.2:
- energy_c=GREEN
- else:
- energy_c=RED
- pygame.draw.line(screen,energy_c,\
- (each.rect.left,each.rect.top-5),\
- (each.rect.left+each.rect.width*energy_r,each.rect.top-5),\
- 2)
- for b in each.bullet:
- screen.blit(b.image,b.rect)
- b.move2()
-
- if each.rect.bottom==-50:
- enemy3_fly_sound.play()
-
- else:
- if not(delay%3):
- if e3_i==0:
- enemy3_down_sound.play()
- screen.blit(each.destroy_images[e3_i],each.rect)
- e3_i=(e3_i+1)%6
- if not(bool(e3_i)):
- me_down_sound.stop()
- each.reset()
-
-
- for each in mid:
- if each.active:
- if each.hit==False:
- screen.blit(each.image_hit,each.rect)
- hit=False
- else:
- screen.blit(each.image,each.rect)
- each.move()
- pygame.draw.line(screen,BLACK,\
- (each.rect.left,each.rect.top-5),\
- (each.rect.right,each.rect.top-5),\
- 2)
- en_r=each.energy/myenemy.MidEnemy.energy
- if en_r>0.2:
- en_c=GREEN
- else:
- en_c=RED
- pygame.draw.line(screen,en_c,\
- (each.rect.left,each.rect.top-5),\
- (each.rect.left+each.rect.width*en_r,\
- each.rect.top-5),2)
-
-
- else:
- if not(delay%3):
- if e2_i==0:
- enemy2_down_sound.play()
- screen.blit(each.destroy_images[e2_i],each.rect)
- e2_i=(e2_i+1)%4
- if e2_i==0:
- each.reset()
-
- for each in small:
- if each.active:
- each.move()
- screen.blit(each.image,each.rect)
- else:
- if not(delay%3):
- if e1_i==0:
- enemy1_down_sound.play()
- screen.blit(each.destroy_images[e1_i],each.rect)
- e1_i=(e1_i+1)%4
- if e1_i==0:
- each.reset()
- screen.blit(background, (0,0)) #绘制背景
- if not (delay % 5):
- qie=not qie
- delay-=1
- if not delay:
- delay=100
-
- pygame.display.flip()
- clock.tick(60) #限制帧率
- if __name__ == "__main__":
- try:
- main()
- except SystemExit:
- pass
- except:
- traceback.print_exc() #报告异常
- pygame.quit()
- input()
复制代码
|
|