(飞机为迷你亚索,外星人为迷你小诺手,由于时间关系和图片素材较难寻找,仅仅做了简易版,没有贴上背景图片。由于篇幅原因,对于函数讲解较为简略,可以自行搜索相应函数的用法)
主要利用pygame内置库进行图形化处理
主要游戏界面如下:
基础操作:导入pygame模块
-
首先利用screen=pygame.display.set_mode()创建一个pygame游戏窗口,参数为(width,height)
-
然后使用pygame.display.set_caption(),参数为你想要设置的游戏名的字符串,例如:“飞机大战”
-
找到图片素材,并将其绘制到屏幕上,在此需使用blit()函数将其绘制到窗口上,例如:之前的窗口为screen,则screen.blit(image,rect),其中image为需要绘制到屏幕上的图像,rect为绘制的位置的矩形,需要在之前通过pygame.Rect进行创建rect,并且设置好rect的位置。
-
对于屏幕上的字体,在pygame中字体的显示都是通过将字体转换为图形,然后用blit()函数绘制,首先设置字体font=pygame.font.Font(NONE,48),其中none指的是文字的字体,48指文字的大小,然后通过render函数进行转换为图形,例如,image=font.render(text,TRUE,font_color,bg_color),其中text是文字的内容,同样是字符串;TRUE指的是文字的锯齿开关;font_color是文字颜色的RGB值,bg_color为绘制处的背景颜色的RGB值,然后将image通过blit绘制出来就可以
-
设置主循环,对于游戏的运行,刚才所设置的所有运行后只会出现一瞬间,所以必须要将其放在while TRUE:的主循环中不停循环才能维持游戏界面
-
关于爆炸效果的制作,任何看起来连续的图片其实都是一帧帧图片快速播放,因为人眼的视觉停留看起来才连续,所以对于爆炸效果,只需要在子弹与外星人发生碰撞时,在外星人的位置,以一定的速度依次绘制爆炸图片就可以了; 爆炸图片如下:
以上是基础操作
主文件代码如下:
import pygame import sys from time import sleep from random import randint from settings import Settings from ship_mod_blit import Ship from bullet import Bullet from alien import Alien from button import Button from bullet import Skill from game_information import Information from bomp import Bomp game_state=0 menu=0 game=1 over=2 score=0 randnum=1 class Alienwar_game: def __init__(self): pygame.init() self.settings=Settings() self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height)) self.ship=Ship(self) self.button=Button(self,"start play") self.bullets=pygame.sprite.Group() self.aliens=pygame.sprite.Group() self.skills=pygame.sprite.Group() pygame.display.set_caption('诺克萨斯入侵') self.creat_alien() self.move=list() self.lives=self.settings.ship_lives self.information=Information(self) self.bomp=Bomp(self) self.clock=pygame.time.Clock() self.time=60 self.speed_x=self.settings.alien_speed self.speed_y=self.settings.alien_speed_y def creat_alien(self): available_space_x=self.settings.screen_width-2*40 avaliable_space_y=self.settings.screen_height-2*40 number_alien_x=available_space_x//80 for alien_number in range(number_alien_x): new_alien=Alien(self) new_alien.rect.x=randint(0,1000) new_alien.rect.y=randint(0,200) self.aliens.add(new_alien) def fire(self): if len(self.bullets)<self.settings.bullet_maxnum: new_bullet=Bullet(self) self.bullets.add(new_bullet) def fire_skill(self): newskill=Skill(self) self.skills.add(newskill) def event_check(self): global score global game_state for event in pygame.event.get(): if(event.type==pygame.QUIT): sys.exit() if(event.type==pygame.KEYDOWN): if(event.key==pygame.K_a or event.key==pygame.K_LEFT ): self.ship.lstate=1 if(event.key==pygame.K_d or event.key ==pygame.K_RIGHT): self.ship.rstate=1 if event.key==pygame.K_j: self.fire() if event.key==pygame.K_k: self.fire_skill() if(event.type==pygame.KEYUP): if(event.key==pygame.K_a or event.key==pygame.K_LEFT): self.ship.lstate=0 if(event.key==pygame.K_d or event.key==pygame.K_RIGHT): self.ship.rstate=0 if(event.type==pygame.MOUSEBUTTONDOWN): mouse_pos=pygame.mouse.get_pos() if game_state==2: if self.screen.get_rect().collidepoint(mouse_pos): game_state=menu score=0 elif game_state==0: if self.button.rect.collidepoint(mouse_pos): game_state = game self.lives=self.settings.ship_lives self.speed_y=self.settings.alien_speed_y self.speed_x=self.settings.alien_speed def run_game(self): global game_state global score global randnum count=0 count1=0 count2=0 while True: count2+=1 self.clock.tick(self.time) self.screen.fill(self.settings.bg_color) self.event_check() if game_state==menu: self.screen.blit(self.button.msg_image,self.button.rect) elif game_state==game: for number in range(self.lives): self.screen.blit(self.ship.image,pygame.Rect(number*40,0,40,40)) self.button.label1() i=0 if self.ship.rect.x>=self.settings.ship_speed: if self.ship.lstate == 1: self.ship.rect.x -= self.settings.ship_speed if self.ship.rect.x<=self.settings.screen_width-self.settings.ship_speed-40: if self.ship.rstate==1: self.ship.rect.x+=self.settings.ship_speed self.bullets.update() self.ship.blitme() for bullet in self.bullets.sprites(): bullet.drawit() if bullet.y<=0: self.bullets.remove(bullet) for skill in self.skills.sprites(): skill.skill_update() skill.blitit() if skill.rect.y<=0: self.skills.remove(skill) for num in range(len(self.aliens)): self.move.append(1) for alien in self.aliens.sprites(): if alien.rect.left==self.screen.get_rect().left or alien.rect.right==self.screen.get_rect().right: self.move[i]=-self.move[i] if alien.rect.right<self.screen.get_rect().right and alien.rect.left>self.screen.get_rect().left: if count2%50==0: randnum=randint(0,1) print(f"{randnum}") if randnum==0: self.move[i] = -self.move[i] alien.rect.x+=self.speed_x*self.move[i] alien.rect.y+=self.speed_y i+=1 if alien.rect.left<self.screen.get_rect().left: alien.rect.left=self.screen.get_rect().left if alien.rect.right>self.screen.get_rect().right: alien.rect.right=self.screen.get_rect().right if alien.rect.centery>=self.screen.get_rect().bottom: print("诺手打进你家了!!!") sleep(1.5) self.bullets.empty() self.aliens.empty() self.creat_alien() self.lives-=1 break for alien_self in self.aliens.sprites(): for bullet_self in self.bullets.sprites(): if pygame.sprite.collide_rect(alien_self,bullet_self): x=alien_self.rect.x y=alien_self.rect.y if pygame.sprite.collide_rect(alien_self,bullet_self) or count!=0 and count<=100: self.bomp.draw_image(x,y,count1%5) count+=1 if(count%20==0): count1+=1 if count>100: count=0 collision=pygame.sprite.groupcollide(self.bullets,self.aliens,True,True) collision2=pygame.sprite.groupcollide(self.skills,self.aliens,False,True) if collision: score+=self.settings.alien_score if collision2: score+=self.settings.alien_score*len(collision2.values()) self.information.draw_score('score: '+str(score)) self.screen.blit(self.information.score_image,self.information.score_image_rect) if not self.aliens: self.bullets.empty() self.skills.empty() self.creat_alien() self.speed_x+=0.5 if(score!=0 and score%10000==0): self.speed_y+=0.01 if pygame.sprite.spritecollideany(self.ship,self.aliens): print("亚索被诺手打死了 !!!") sleep(1.5) self.ship.rect.midbottom=self.screen.get_rect().midbottom self.bullets.empty() self.aliens.empty() self.creat_alien() self.lives-=1 if self.lives==0: game_state=over count2=0 self.aliens.draw(self.screen) elif game_state == over: self.button.label2() self.button.label3(str(score)) pygame.display.flip() if __name__=='__main__': ai_game=Alienwar_game() ai_game.run_game()
这只是主文件的代码,由于代码导入了其他文件的函数,所以无法整成运行, 具体的操作可以通过代码来看,由于代码放在多个文件中,不便全部复制粘贴到这里,以免导致代码无法运行,完整的代码及图片素材都存放在GitHub或gitee码云上,想要看的朋友可以访问,这是我的网址:
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取