飞机大战(简易版)
一、游戲分析
飛機大戰中的主要“角色”有:
1.英雄
2.敵方飛機
3.英雄發射的子彈
我們需要控制的有:
1.繪制屏幕內的角色
2.控制角色的邏輯,比如:敵方飛機與我方飛機的碰撞檢測,我方飛機發射的子彈與敵方飛機之間的碰撞檢測。
資源:
要完成一個游戲,還要有資源的加載,比如飛機,子彈等圖片的加載等。
游戲背景的繪制。
二、如何繪制循環滾動的背景圖片
代碼如下:
三、如何繪制飛機
繪制敵機:
繪制英雄:
class Hero(GameSprite):"""英雄精靈"""def __init__(self):# 1.調用父類方法super().__init__("./images/hero.png",0)# 2.設置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120# 3.創建子彈的精靈組self.bullets = pygame.sprite.Group()def update(self):# 英雄在水平方向移動self.rect.x += self.speed# 控制英雄不能離開屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.y < 0:self.rect.y = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightelif self.rect.bottom > SCREEN_RECT.bottom:self.rect.bottom = SCREEN_RECT.bottomdef fire(self):print("發射子彈")for i in (0,1,2):# 1.創建子彈精靈bullet = Bullet()# 2.設置精靈的位置bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerx# 3.將精靈添加到精靈組self.bullets.add(bullet)四、如何繪制子彈
創建個子彈類
五、如何判斷碰撞(子彈與敵機碰撞、英雄與敵機碰撞)
def __check_collide(self):# 1.子彈摧毀敵機pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)# 2.敵機摧毀英雄# pygame.sprite.spritecollide(self.hero, self.enemy_group, True)enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)# 3.判斷列表是否有內容if len(enemies) > 0:# 讓英雄犧牲self.hero.kill()# 結束游戲 PlaneGame.__game_over()六、如何控制英雄移動
#elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:#print("向右")# 使用鍵盤提供的方法獲取鍵盤按鍵 - 按鍵元組keys_pressed = pygame.key.get_pressed()# 判斷元組中對應的按鍵索引值if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2elif keys_pressed[pygame.K_UP]:self.hero.rect.y -= 2elif keys_pressed[pygame.K_DOWN]:self.hero.rect.y += 2else:self.hero.speed = 0七、總結
此次完成的小游戲還有很多改進的地方,比如可以加入背景音樂,在子彈擊中敵機后有一個飛機爆炸的效果,敵機的移動軌跡可以設計的更復雜一些等。
在這次課程設計中,我學到了很多。讓我發現時間的重要性,學到的知識在多次運用后才能融會貫通。
全部代碼如下
主程序 :plane_game.py
精靈 :plane_sprites.py
import random import pygame# 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0,0,480,700) # 刷新的幀率 FRAME_PER_SEC = 60 # 創建敵機的定時器常量 CREATE_ENEMY_EVENT = pygame.USEREVENT # 英雄發射子彈事件 HERO_FIRE_EVENT = pygame.USEREVENT + 1class GameSprite(pygame.sprite.Sprite):'''飛機大戰游戲精靈'''def __init__(self,image_name,speed=1):# 調用父類的初始化方法super().__init__()# 定義對象的屬性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speeddef update(self):# 在屏幕的垂直方向上移動self.rect.y += self.speedclass Background(GameSprite):"""游戲背景精靈"""# def __index__(self, is_alt=False):## super().__init__("./images/background.png")## if is_alt:# self.rect.y = -self.rect.heightdef update(self):# 1.調用父類的方法實現super().update()# 2.判斷是否移出屏幕,如果移出,將圖像設置到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敵機精靈"""def __init__(self):# 1.調用父類方法,創造敵機精靈,同時指定敵機圖片super().__init__("./images/enemy.png")# 2.指定敵機的初始隨機速度 1-3self.speed = random.randint(1,3)# 3.指定敵機的初始隨機位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0,max_x)def update(self):super().update()if self.rect.y >= SCREEN_RECT.height:# print("飛出屏幕,需要刪除")# 移出精靈組,自動銷毀self.kill()def __del__(self):print("敵機掛了%s" % self.rect)class Hero(GameSprite):"""英雄精靈"""def __init__(self):# 1.調用父類方法,設置super().__init__("./images/hero.png",0)# 2.設置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120# 3.創建子彈的精靈組self.bullets = pygame.sprite.Group()def update(self):# 英雄在水平方向移動self.rect.x += self.speed# 控制英雄不能離開屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.y < 0:self.rect.y = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightelif self.rect.bottom > SCREEN_RECT.bottom:self.rect.bottom = SCREEN_RECT.bottomdef fire(self):print("發射子彈")for i in (0,1,2):# 1.創建子彈精靈bullet = Bullet()# 2.設置精靈的位置bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerx# 3.將精靈添加到精靈組self.bullets.add(bullet)class Bullet(GameSprite):def __init__(self):# 調用父類方法,設置子彈圖片,設置初始速度super().__init__("./images/bullet.png",-2)def update(self):# 調用父類方法,讓子彈沿垂直方向飛行super().update()# 判斷子彈是否飛出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子彈被銷毀")飛機大戰圖片素材
總結
- 上一篇: 图解算法学习笔记(三):递归
- 下一篇: pavmail.exe - pavmai