pygame游戲實例入門


開發環境
pycharm+anconda3;
第三方庫: pygame;(從標題看這句略顯多余)

第三方庫安裝
方法一:直接在pycharm里面安裝。
files->seting->project->python Interpreter
在左側界面的最左側邊欄上面有個加號,點擊后在彈出頁面搜索需要的第三方庫,然后直接安裝。
方法二:pip安裝。
因為用的是anconda所以需要在終端里面將目錄切換至anconda3/Scripts后再安裝。
命令:pip installs pygame

 

 任務介紹

本任務是開發一個猴子接香蕉的小游戲,通過鍵盤控制猴子運動,接住隨機掉落的香蕉。讀者需要自行准備背景圖片,猴子圖片,香蕉圖片三張,當然,如果不喜歡猴子或香蕉也可以選擇其它物品的圖片作為素材。

 

 

大概實現思路
我們需要編寫兩個類:猴子類,和香蕉類
兩個類都需要有圖片路徑,運動速度,初始位置等屬性。還需要有讓他們運動的方法。其中,香蕉只需要編寫從上至下運動,猴子類需要讓猴子可以在上下左右不同方向運動。
主函數里面需要用鍵盤來控制猴子運動,隨機生成香蕉從上到下運動,並且檢測猴子是否碰到香蕉

具體實現流程
游戲背景界面
首先是做一個游戲的背景界面,這里面需要引入背景圖片,並且實現手動開關游戲界面。

主函數:

import pygame
import sys


def main():
    pygame.init()#初始化pygame
    size = width, height = 450, 560#界面尺寸
    screen = pygame.display.set_mode(size)#設置界面尺寸
    bg = pygame.image.load('background.jpg')#加載背景圖片
    pygame.display.set_caption("游戲")#設置標題
    while True:
        #檢測事件發生
        for event in pygame.event.get():
            if event.type == pygame.QUIT:#發生的事件類型為關閉時
                sys.exit()                #退出
        screen.blit(bg, bg.get_rect())  #顯示圖片
        pygame.display.update()            #更新
        pygame.time.Clock().tick(60)    #設置游戲頻率為60


if __name__ == '__main__':
    main()

猴子類

猴子類編寫

界面的坐標是左上角為(0,0),猴子的起始位置為右下角,所以坐標是(界面寬度-猴子寬度,界面高度-猴子高度)

class Monkey(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        position = 400, 510
        self.speed = [0, 0]
        self.img = pygame.image.load('monkey.png')
        self.rect = self.img.get_rect()
        self.rect.center = position
        self.image = self.img

    def move_left(self):
        self.speed = [-5, 0]
        if self.rect.left < 0:
            self.rect.left = 0
        else:
            self.rect = self.rect.move(self.speed)

    def move_right(self):
        self.speed = [5, 0]
        if self.rect.right > 450:
            self.rect.right = 450
        else:
            self.rect = self.rect.move(self.speed)

    def move_up(self):
        self.speed = [0, -5]
        if self.rect.top < 0:
            self.rect.top = 0
        else:
            self.rect = self.rect.move(self.speed)

    def move_down(self):
        self.speed = [0, 5]
        if self.rect.bottom > 560:
            self.rect.bottom = 560
        else:
            self.rect = self.rect.move(self.speed)

猴子類運行

猴子類運行時需要根據鍵盤所按下的鍵來判斷猴子運動狀態,需要在前面加一句 from pygame.locals import

import pygame
import sys
from pygame.locals import *

def main():
    pygame.init()#初始化pygame
    size = width, height = 450, 560#界面尺寸
    screen = pygame.display.set_mode(size)#設置界面尺寸
    bg = pygame.image.load('background.jpg')#加載背景圖片
    pygame.display.set_caption("游戲")#設置標題
    mk = Monkey() #實例化猴子類
    while True:
        #檢測事件發生
        for event in pygame.event.get():
            if event.type == pygame.QUIT:#發生的事件類型為關閉時
                sys.exit()                #退出
           #實例化按鍵類型 
          key = pygame.key.get_pressed()
          # 根據 按鍵類型判斷運動方向
        if key[K_LEFT]:
            mk.move_left()
        if key[K_RIGHT]:
            mk.move_right()
        if key[K_UP]:
            mk.move_up()
        if key[K_DOWN]:
            mk.move_down()
        screen.blit(bg, bg.get_rect())  #顯示圖片
        screen.blit(mk.image, mk.rect)#顯示猴子,必須放在背景圖片之后
        pygame.display.update()            #更新
        pygame.time.Clock().tick(60)    #設置游戲頻率為60

if __name__ == '__main__':
    main()

香蕉類

香蕉類編寫

class Banana(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        x = randint(20, 430)
        position = [x, 20]
        speed = [0, 3]
        self.img = pygame.image.load('banana.png')
        self.rect = self.img.get_rect()
        self.rect.center = position
        self.image = self.img
        self.speed = speed

    def move(self):
        self.rect = self.rect.move(self.speed)

香蕉類運行

香蕉類要求隨機生成香蕉在屏幕中自上而下運動,因此需要實例化精靈組,將實例化的香蕉類放入精靈組中,在達到一定條件時控制精靈組中的香蕉運動並顯示在屏幕中。

import pygame
import sys
from pygame.locals import *

def main():
    pygame.init()
    size = width, height = 450, 560
    screen = pygame.display.set_mode(size)
    bg = pygame.image.load('background.jpg')
    pygame.display.set_caption("游戲")
    group = pygame.sprite.Group() #實例化精靈組
    i = 0 #作為條件判斷的變量
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        screen.blit(bg, bg.get_rect())
        i = i + 1
        if i % 30 == 0: #條件成立時
            ba = Banana() #實例化類
            group.add(ba) #添加到精靈組
        for b in group.sprites(): #從精靈組中循環
            b.move()
            screen.blit(b.img, b.rect)
        pygame.display.update()
        pygame.time.Clock().tick(60)


if __name__ == '__main__':
    main()

綜合編寫及碰撞檢測

下面把上述內容放在一起運行,並進行碰撞檢測,讓猴子撞到香蕉時在終端里面顯示出來。
使用pygame.sprite.collide_mask()函數檢測碰撞,當兩個傳入的參數碰撞時,返回true.

def main():
    pygame.init()
    size = width, height = 450, 560
    screen = pygame.display.set_mode(size)
    bg = pygame.image.load('background.jpg')
    pygame.display.set_caption("游戲")
    mk = Monkey()
    group = pygame.sprite.Group()
    i = 0
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_ESCAPE:
                    sys.exit()
        key = pygame.key.get_pressed()
        if key[K_LEFT]:
            mk.move_left()
        if key[K_RIGHT]:
            mk.move_right()
        if key[K_UP]:
            mk.move_up()
        if key[K_DOWN]:
            mk.move_down()
        screen.blit(bg, bg.get_rect())
        screen.blit(mk.image, mk.rect)
        i = i + 1
        if i % 30 == 0:
            ba = Banana()
            group.add(ba)
        for b in group.sprites():
            b.move()
            screen.blit(b.img, b.rect)
            if pygame.sprite.collide_mask(mk, b):#碰撞檢測
                print("撞到")
        pygame.display.update()
        pygame.time.Clock().tick(60)


if __name__ == '__main__':
    main()

總結

初學者經驗筆記,多有紕漏,內容繁瑣,即便作者寫完后也懶得再看一遍,如果有不幸讀完全文者,在程序運行過程中有任何問題,感謝指正(盡管我不一定搭理)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM