pygame开发PC端微信打飞机游戏
?pygame開發(fā)PC端微信打飛機游戲?
一、項目簡介
1. 介紹
本項目類似曾經(jīng)火爆的微信打飛機游戲。游戲?qū)⑹褂肞ython語言開發(fā),主要用到pygame的API。游戲最終將會以python源文件game.py形式完成,只需要運行python game.py就可以進(jìn)入游戲。
游戲最終效果截圖如下:
2. 知識點
本實驗中將介紹在Linux桌面環(huán)境下使用Python及pygame快速開發(fā)小游戲的方式??梢酝ㄟ^這個游戲入門pygame游戲開發(fā)。
3. 參考文檔
-
代碼參考 Kill-Console寫的PythonShootGame
-
文檔參考?pygame文檔
4. 安裝依賴包
(以下內(nèi)容需要在實驗樓官方網(wǎng)站實現(xiàn),不需要的也可以直接跳過)
需要安裝pygame庫來支持本實驗所需的代碼運行。
在實驗環(huán)境中打開Xfce終端,并輸入以下命令來安裝pygame,會提示輸入shiyanlou的密碼,密碼也是shiyanlou:
$ sudo apt-get update$ sudo apt-get install python-pygame
二、技術(shù)設(shè)計
1. 游戲角色
本游戲中所需的角色包括玩家飛機、敵機及***。用戶可以通過鍵盤移動玩家飛機在屏幕上的位置來打擊不同位置的敵機。因此設(shè)計以下Player,Enemy和Bullet三個類對應(yīng)三種游戲角色。
對于Player,需要的操作有射擊和移動兩種,移動又分為上下左右4種情況。
對于Enemy,則比較簡單,只需要移動即可,從屏幕上方出現(xiàn)并移動到屏幕下方。
對于Bullet,與飛機相同,僅需要以一定速度移動即可。
2. 游戲功能
相信玩過微信打飛機的朋友都熟悉,這里將游戲做了簡化。飛機的速度固定,***的速度固定,基本操作是移動玩家飛機,目標(biāo)飛機隨機從屏幕上方出現(xiàn)并勻速落到下方,***從玩家飛機發(fā)出,碰到目標(biāo)飛機會擊毀,如果目標(biāo)飛機碰到玩家飛機,則Game Over并顯示分?jǐn)?shù)。
三、代碼實現(xiàn)
1. 界面顯示
代碼實現(xiàn)所需的resources圖片文件都可以通過下述命令獲取:
$git clone https://github.com/shiyanlou/PythonShootGame.git
詳細(xì)步驟
-
初始化pygame
-
設(shè)置游戲界面大小、背景圖片及標(biāo)題
-
游戲主循環(huán)內(nèi)需要處理游戲界面的初始化、更新及退出
-
顯示玩家飛機(代碼中使用的resources/image/shoot.png圖里包含多種飛機,只需要使用pygame.image的subsurface API根據(jù)位置截取shoot.png中所需的圖片)
示例代碼
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #1.?初始化pygame pygame.init() #2.?設(shè)置游戲界面大小、背景圖片及標(biāo)題 #?游戲界面像素大小 screen?=?pygame.display.set_mode((480,?800)) #?游戲界面標(biāo)題 pygame.display.set_caption('飛機大戰(zhàn)') #?背景圖 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.?游戲主循環(huán)內(nèi)需要處理游戲界面的初始化、更新及退出 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. 事件處理
在主循環(huán)中處理鍵盤輸入的事件(上下左右按鍵操作),增加游戲操作交互(玩家飛機的上下左右移動)。
詳細(xì)步驟
-
獲取鍵盤事件(上下左右按鍵)
-
處理鍵盤事件(移動飛機的位置)
-
將上述步驟代碼放入游戲主循環(huán)中
示例代碼
| 1 2 3 4 5 6 7 8 9 10 11 12 | #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. ***處理
***由玩家飛機發(fā)出,并以一定速度向界面上方移動。
詳細(xì)步驟
-
生成***,需要控制發(fā)射頻率
-
以固定速度移動***
-
移動出屏幕后刪除***
-
敵機被***擊中效果處理(下一節(jié)處理)
示例代碼
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #1.?生成***,需要控制發(fā)射頻率 #?首先判斷玩家飛機沒有被擊中 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. 敵機處理
敵機需要隨機在界面上方產(chǎn)生,并以一定速度向下移動。
詳細(xì)步驟
-
生成敵機,需要控制生成頻率
-
移動敵機
-
敵機與玩家飛機碰撞效果處理
-
移動出屏幕后刪除敵機
-
敵機被***擊中效果處理
示例代碼
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #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. 得分顯示
在游戲界面固定位置顯示消滅了多少目標(biāo)敵機。
示例代碼
| 1 2 3 4 5 6 | #?繪制得分 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) |
?
四、完整代碼參考
大家可以按照上述步驟組合出自己的打飛機游戲,也可以登陸實驗樓官方網(wǎng)站參考完整代碼。
(http://www.shiyanlou.com/courses/49)
更多基礎(chǔ)課、項目課歡迎登陸實驗樓官方網(wǎng)站http://www.shiyanlou.com/courses/
總結(jié)
以上是生活随笔為你收集整理的pygame开发PC端微信打飞机游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用Python编写一个聊天室
- 下一篇: J2SE核心开发实战(一)——认识J2S