pygame開發PC端微信打飛機遊戲
一、專案簡介
1. 介紹
本專案類似曾經火爆的微信打飛機遊戲。遊戲將使用Python語言開發,主要用到pygame的API。遊戲最終將會以python原始檔game.py形式完成,只需要執行python game.py就可以進入遊戲。
遊戲最終效果截圖如下:
#2. 知識點
本實驗中將介紹在Linux桌面環境下使用Python及pygame快速開發小遊戲的方式。可以透過這個遊戲入門pygame遊戲開發。
3. 參考文件
程式碼參考Kill-Console寫的PythonShootGame
文件參考 pygame文件
4. 安裝依賴套件
(以下內容需要在實驗大樓官方網站實現,不需要的也可以直接跳過)
需要安裝pygame庫來支援本實驗所需的程式碼運行。
在實驗環境中開啟Xfce終端,並輸入以下指令安裝pygame,會提示輸入shiyanlou的密碼,密碼也是shiyanlou:
$ sudo apt-get update$ sudo apt-get install python-pygame
二、技術設計
1. 遊戲角色
本遊戲中所需的角色包括玩家飛機、敵機及***。使用者可以透過鍵盤移動玩家飛機在螢幕上的位置來打擊不同位置的敵機。因此設計下列Player,Enemy和Bullet三個類別對應三種遊戲角色。
對於Player,所需的操作有射擊和移動兩種,移動又分為上下左右4種情況。
對於Enemy,則比較簡單,只需要移動即可,從螢幕上方出現並移動到螢幕下方。
對於Bullet,與飛機相同,只需以一定速度移動即可。
2. 遊戲功能
相信玩過微信打飛機的朋友都很熟悉,這裡將遊戲做了簡化。飛機的速度固定,***的速度固定,基本操作是移動玩家飛機,目標飛機隨機從屏幕上方出現並勻速落到下方,***從玩家飛機發出,碰到目標飛機會擊毀,如果目標飛機碰到玩家飛機,則Game Over並顯示分數。
三、程式碼實作
1. 介面顯示
程式碼實作所需的resources圖片檔案都可以透過下述指令取得:
$git clone https://github .com/shiyanlou/PythonShootGame.git
詳細步驟
初始化pygame
設定遊戲介面大小、背景圖片及標題
遊戲主循環內需要處理遊戲介面的初始化、更新及退出
顯示玩家飛機(程式碼中使用的resources/image/shoot.png圖裡包含多種飛機,只需要使用pygame .image的subsurface API根據位置截取shoot.png中所需的圖片)
#範例程式碼
#1. 初始化pygame pygame.init() #2. 设置游戏界面大小、背景图片及标题 # 游戏界面像素大小 screen = pygame.display.set_mode((480, 800)) # 游戏界面标题 pygame.display.set_caption('飞机大战') # 背景图 background = pygame.image.load('resources/image/background.png').convert() # Game Over的背景图 game_over = pygame.image.load('resources/image/gameover.png') # 飞机图片 plane_img = pygame.image.load('resources/image/shoot.png') # 截取玩家飞机图片 player = plane_img.subsurface(pygame.Rect(0, 99, 102, 126)) #3. 游戏主循环内需要处理游戏界面的初始化、更新及退出 while True: # 初始化游戏屏幕 screen.fill(0) screen.blit(background, (0, 0)) # 显示玩家飞机在位置[200,600] screen.blit(player, [200, 600]) # 更新游戏屏幕 pygame.display.update() # 游戏退出事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit()
2. 事件處理
在主循環中處理鍵盤輸入的事件(上下左右按鍵操作),增加遊戲操作互動(玩家飛機的上下左右移動)。
詳細步驟
取得鍵盤事件(上下左右按鍵)
處理鍵盤事件(移動飛機的位置)
將上述步驟程式碼放入遊戲主循環中
範例程式碼
#1. 获取键盘事件(上下左右按键) key_pressed = pygame.key.get_pressed() #2. 处理键盘事件(移动飞机的位置) if key_pressed[K_w] or key_pressed[K_UP]: player.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: player.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: player.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: player.moveRight()
3. ***處理
***由玩家飛機發出,並以一定速度向介面上方移動。
詳細步驟
生成***,需要控制發射頻率
以固定速度移動***
移動出螢幕後刪除***
敵機被***擊中效果處理(下一節處理)
範例程式碼
#1. 生成***,需要控制发射频率 # 首先判断玩家飞机没有被击中 if not player.is_hit: if shoot_frequency % 15 == 0: player.shoot(bullet_img) shoot_frequency += 1 if shoot_frequency >= 15: shoot_frequency = 0 for bullet in player.bullets: #2. 以固定速度移动*** bullet.move() #3. 移动出屏幕后删除*** if bullet.rect.bottom < 0: player.bullets.remove(bullet) # 显示*** player.bullets.draw(screen)
4. 敵機處理
敵機需要隨機在介面上方產生,並以一定速度向下移動。
詳細步驟
產生敵機,需要控制產生頻率
移動敵機
敵機與玩家飛機碰撞效果處理
#移動出畫面後刪除敵機
敵機被***擊中效果處理
範例程式碼
#1. 生成敌机,需要控制生成频率 if enemy_frequency % 50 == 0: enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0] enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos) enemies1.add(enemy1) enemy_frequency += 1if enemy_frequency >= 100: enemy_frequency = 0 for enemy in enemies1: #2. 移动敌机 enemy.move() #3. 敌机与玩家飞机碰撞效果处理 if pygame.sprite.collide_circle(enemy, player): enemies_down.add(enemy) enemies1.remove(enemy) player.is_hit = True break #4. 移动出屏幕后删除飞机 if enemy.rect.top < 0: enemies1.remove(enemy) #5. 敌机被***击中效果处理 # 将被击中的敌机对象添加到击毁敌机Group中,用来渲染击毁动画 enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1) for enemy_down in enemies1_down: enemies_down.add(enemy_down) # 敌机被***击中效果显示 for enemy_down in enemies_down: if enemy_down.down_index == 0: pass if enemy_down.down_index > 7: enemies_down.remove(enemy_down) score += 1000 continue screen.blit(enemy_down.down_imgs[enemy_down.down_index / 2], enemy_down.rect) enemy_down.down_index += 1 # 显示敌机 enemies1.draw(screen)
5. 分數顯示
在遊戲介面固定位置顯示消滅了多少目標敵機。
範例程式碼
# 绘制得分 score_font = pygame.font.Font(None, 36) score_text = score_font.render(str(score), True, (128, 128, 128)) text_rect = score_text.get_rect() text_rect.topleft = [10, 10] screen.blit(score_text, text_rect)
以上是pygame開發PC端微信打飛機遊戲實例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!