一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python-pygame 游戲開發(fā)

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者: 程序猿知秋 ? 2023-02-16 15:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

pygame 基本介紹與使用

介紹

  • pygame 就是一個Python 模塊,專為電子游戲設(shè)計
  • 官方網(wǎng)站:www.pygame.org
  • Pygame 是一個高可移植性的模塊可以支持多個操作系統(tǒng)

安裝

  • 在命令窗口輸入:pip3 install pygame
  • 驗證安裝成功,在命令窗口輸入**:python -m pygame.examples.aliens**

**游戲的初始化與退出

**

  • 要使用 pygame 提供所有功能之前,需要調(diào)用 init 方法
  • 在游戲結(jié)束時,需要調(diào)用 quit 方法,卸載所有pygame模塊
方法 說明
pygame.init() 導(dǎo)入并初始化所有pygame模塊,使用其它模塊之前,必須先調(diào)用 init 方法
pygame.quit() 卸載所有pygame模塊,在游戲結(jié)束前調(diào)用

游戲中的坐標系

  • **原點 **指游戲窗口的左上角 ,坐標是 0,0
  • **x軸 **水平方向向右,逐漸增加
  • **y軸 **垂直方向向下,逐漸增加
  • 在游戲中,所有可見的元素都是以 矩形區(qū)域 來描述位置的
    • 描述一個矩形區(qū)域有四個要素:x、y、width、height
  • pygame 專門提供了一個類 **pygame.Rect **用于描述 矩形區(qū)域
  • pygame.Rect 是一個 比較特殊的類 ,內(nèi)部只是封裝了一些數(shù)字計算,不執(zhí)行pygame.init() 方法同樣能夠使用

示例

import pygame
# 定義一個英雄的矩形,參數(shù):x軸,y軸,寬,高
hero_rect=pygame.Rect(100,300,120,50)
print("英雄的原點是:%d,%d"%(hero_rect.x,hero_rect.y))
print("英雄的寬高是:%d,%d"%(hero_rect.width,hero_rect.height))

圖片

創(chuàng)建游戲主窗口

  • pygame 專門提供了一個模塊 pygame.display 用于創(chuàng)建和管理游戲窗口
方法 說明
pygame.display.set_mode(resolution=(0,0),flags=0,depth=0) 初始化游戲顯示窗口參數(shù):resolution: 指定屏幕的寬和高,默認創(chuàng)建的窗口大小和屏幕大小一致flags:指定屏幕的附加選項,例如是否全屏等,默認不需要傳遞depth:表示顏色的位數(shù),默認自動匹配
pygame.display.update() 刷新屏幕內(nèi)容顯示
  • 圖****像繪制
    • 使用 pygame.image.load() 加載圖像的數(shù)據(jù)
    • 使用 游戲屏幕 對象,調(diào)用 blit() 方法,將圖像繪制到指定位置
    • 調(diào)用** pygame.update()** 方法更新整個屏幕顯示

示例

pygame.init()
# 創(chuàng)建游戲的主窗口,只指定寬和高
screen=pygame.display.set_mode((512,768))


# 加載圖像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上繪制圖像
screen.blit(bg,(0,0))
# 更新屏幕顯示
pygame.display.update()

**游戲中的動畫原理

**

  • 動畫的本質(zhì)就是 快速 的在屏幕上繪制 圖像
  • 電影是將多張 靜止的電影膠片 連續(xù)、快速的播放,產(chǎn)生連貫的視覺效果
  • 一般在電腦每秒繪制60次 ,就能夠達到非常連續(xù)、高品質(zhì)的動畫效果
    • 每次繪制的結(jié)果被稱為 幀F(xiàn)rame
  • 游戲時鐘
    • pygame 專門提供了一個類 pygame.time.Clock 可以非常方便的設(shè)置屏幕繪制速度(刷新頻率)
    • 在游戲初始化 創(chuàng)建一個 時鐘對象
    • 在游戲循環(huán)中, 讓時鐘對象調(diào)用** tick(幀率) 方法**
    • tick 方法會根據(jù) 上次被調(diào)用的時間,自動設(shè)置 游戲循環(huán) 中的延時

示例

# 創(chuàng)建游戲時鐘
clock=pygame.time.Clock()


while True:
    # 設(shè)置每秒刷新60次
    clock.tick(60)

游戲的事件與監(jiān)聽(event)

  • 事件 :就是游戲啟動后,用戶針對游戲所做的操作 (例如:點擊關(guān)閉按鈕)
    • pygame 中通過 pygame.event.get() 可以獲取 用戶當前所做的動作 的事件列表
    • 這段代碼非常的固定,幾乎所有的 pygame 游戲都大同小異
  • 監(jiān)聽: 在游戲循環(huán)中,判斷用戶的** 具體操作**

示例

while True:
    # 設(shè)置每秒刷新60次
    clock.tick(60)


    # 監(jiān)聽用戶點擊關(guān)閉按鈕
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

            # 退出系統(tǒng)
            exit()

pygame 高級使用

精靈與精靈組

  • 精靈(pygame.sprite.Sprite)
    • 在游戲開發(fā)中,通過把 顯示圖像的對象 叫做精靈
    • 精靈有兩個重要的屬性
      • image:記錄圖像數(shù)據(jù)
      • rect:記錄在屏幕上的位置
    • update(*args):更新精靈的位置
    • kill():從所有組中刪除
    • Sprite 并沒有提供 image 和 rect 兩個屬性
      • 需要程序員pygame.sprite.Sprite 派生子類
      • 并在子類的初始化方法中設(shè)置 image和rect屬性
  • 精靈組 (pygame.sprite.Group)****
    • 一個精靈組可以包含多個精靈對象
    • 調(diào)用精靈組對象的** update方法** 會自動調(diào)用組內(nèi)每個精靈的 update方法
    • 調(diào)用精靈組的 draw(屏幕對象) 方法,可以將組內(nèi)每一個精靈的image 繪制在 rect 位置
    • 注:仍需要調(diào)用 pygame.display.update() 才能在屏幕上看到最終結(jié)果

示例

plane_sprites.py 模塊(定義派生精靈子類)

import pygame


# 自定義派生精靈子類,繼承pygame.sprite.Sprite
class GameSprites(pygame.sprite.Sprite):
    """游戲精靈基類"""


    def __init__(self,img_name,speed=1):
        # 調(diào)用父類的初始化方法
        super().__init__()


        # 加載圖像
        self.image=pygame.image.load(img_name)
        # 設(shè)置尺寸; get_rect()可以獲取圖像的原始大小
        self.rect=self.image.get_rect()
        # 設(shè)置速度
        self.speed=speed


    def update(self):
        # 默認在屏幕上垂直方向移動
        self.rect.y+=self.speed

main.py

from plane_sprites import *


pygame.init()
# 創(chuàng)建游戲的主窗口,只指定寬和高
screen=pygame.display.set_mode((512,768))
# 加載圖像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上繪制圖像
screen.blit(bg,(0,0))


# 定義英雄飛機
hero_img=pygame.image.load("./img/hero.png")
screen.blit(hero_img,(200,500))


# 創(chuàng)建游戲時鐘
clock=pygame.time.Clock()
hero_rect=pygame.Rect(200,500,120,79)


# 創(chuàng)建敵機的精靈
enemy1=GameSprites("./img/enemy1.png")
enemy2=GameSprites("./img/enemy1.png",2)
# 將精靈放入精靈組
enemy_group=pygame.sprite.Group(enemy1,enemy2)




while True:
    # 設(shè)置每秒刷新60次
    clock.tick(60)
    hero_rect.y-=1


    if hero_rect.bottom <= 0:
        hero_rect.top = 768


    screen.blit(bg,(0,0))
    screen.blit(hero_img,hero_rect)


    # 精靈組調(diào)用兩個方法,更新位置和在屏幕上繪制精靈
    enemy_group.update()
    enemy_group.draw(screen)


    pygame.display.update()


    # 監(jiān)聽用戶點擊關(guān)閉按鈕
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()


            # 退出系統(tǒng)
            exit()

**定時器

**

  • pygame中可以使用 pygame.time.set_timer() 來添加定時器
  • 定時器:就是每隔一段時間,去執(zhí)行一些動作
  • **set_timer **可以創(chuàng)建一個事件
  • 可以在游戲循環(huán)的** 事件監(jiān)聽中**捕獲到該事件
  • 定時器的監(jiān)聽
    • 通過 pygame.event.get() 可以獲取當前時刻所有的事件列表
    • 遍歷列表 并且判斷 event.type 是否等于 eventid,如果相等,表示**定時器事件 **發(fā)生

語法

"""
第1個參數(shù) 事件代號 需要基于常量 pygame.USEREVENT 來指定,
USEREVENT 是一個整數(shù),再增加的事件可以使用 USEREVENT+1 指定,依次類推.


第2個參數(shù)是 事件觸發(fā) 間隔的毫秒值.
""" 
set_timer(eventid,milliseconds) ——>None

示例

# 自定義事件
EVENT_ENEMY=pygame.USEREVENT


# 添加定時器,每秒執(zhí)行一次自定義事件
pygame.time.set_timer(EVENT_ENEMY,1000)


# 監(jiān)聽事件
while True:
    for event in pygame.event.get():
        # 監(jiān)聽自定義事件
        if event.type == EVENT_ENEMY:
            print("自定義事件觸發(fā)了...")


        # 監(jiān)聽退出事件
        if event.type == pygame.QUIT:
            # 卸載模塊
            pygame.quit()
            # 退出系統(tǒng)
            exit()

鍵盤按鍵捕****獲

  • 在 pygame 中針對鍵盤按鍵的捕獲有** 兩種方式**
  • 方式1:通過 event.type == pygame.KEYDOWN
  • 方式2:通過 pygame.key.get_pressed() 返回 所有按鍵元組,通過鍵盤常量,判斷元組中 某一個鍵是否被按下 ——如果被按下,對應(yīng)數(shù)值為 1( 注:此種方式可以應(yīng)對 長時間按住某個鍵)

第一種方式語法

if event.type== pygame.KEYDOWN and event.key==pygame.K_RIGHT:
  print("向右移動...")

第二種方式語法

# 返回所有按鍵的元組,如果某個按鍵按下,對應(yīng)的值是1
keys_pressed=pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
  print("向右移動...")

碰撞檢測

  • pygame 提供了兩個非常方便的方法,可以實現(xiàn)碰撞檢測
  • 方法一:pygame.sprite.groupcollide()
    • 檢測兩個精靈組中 所有的精靈 的碰撞檢測
    • groupcollide(group1,group2,dokill1,dokill2,collided=None)——> Dict[Sprite, Sprite]
      
    • 如果將dokill 設(shè)置為 True,則發(fā)生碰撞的精靈將被自動移除
    • collided 參數(shù)用于 計算碰撞的回調(diào)函數(shù) ,如果沒有指定,則每個精靈必須有一個 rect 屬性
  • 方法二:pygame.sprite.spritecollide()
    • 檢測** 某個精靈** 和指定精靈組 中的精靈的碰撞
    • spritecollide(sprite,group,dokill,collided=None)——>  List[Sprite]
      
    • 如果將 dokill 設(shè)置為 True,則指定精靈組中發(fā)生碰撞的精靈將自動被移除
    • collided 碼數(shù)用于 計算碰撞的回調(diào)函數(shù) ,如果沒有指定,則每個精靈必須有一個 rect 屬性
    • 返回 精靈組 中跟精靈** 發(fā)生碰撞的 **精靈列表

繪制字體

  • 在 pygame 中有三個步驟
    • 步驟1:使用** pygame.font.Font **方法初始化字體
    • 步驟2:使用 font.render( 內(nèi)容, 布爾值,是否開啟抗鋸齒, 字體顏色,字體背景(不填,默認是透明))
    • 步驟3:使用** 屏幕對象.blit(字體對象,位置)**

**示例:

**

# 第一個參數(shù)是字體名,第二個大小
# 字體文件可以在自己的系統(tǒng)中查找,然后拷貝到 代碼同級目錄下即可。
# 字體文件路徑,以下以win7為例:C:\\Windows\\Fonts\\微軟雅黑
my_font =  pygame.font.Font("msyh.ttf",58)


# 第一個參數(shù)是寫的文字;
# 第二個參數(shù)是個布爾值,以為這是否開啟抗鋸齒,就是說True的話字體會比較平滑,不過相應(yīng)的速度有一點點影響;
# 第三個參數(shù)是字體的顏色;
# 第四個參數(shù)是背景色,如果你想沒有背景色(也就是透明),那么可以不加這第四個參數(shù)。
ext_surface = my_font.render("Pygame Score! ", True, (0,0,0), (255, 255, 255))


# 在屏幕上繪制字體,第一個參數(shù)是字體對象,第二個參數(shù)是x,y軸的位置
screen.blit(text_surface, (0, 0))
# 刷新屏幕
pygame.display.update()

播放音****樂

  • 在 pygame 中用 pygame.mixer模塊 來播放音樂,其中播放音樂有兩種方式
  • 方式一: pygame.mixer.music.load( 音頻文件名 )
    • 可以播放OGG、WAV、mp3 等格式音頻
    • 適用音樂文件比較大,時長比較長的音樂,比如背景音樂
  • 方式二: pygame.mixer.Sound( 音頻文件名 )
    • 可以播放OGG、WAV、mp3 等格式音頻
    • 這種方式一般是用來加載一些比較短的聲音,比如一些音效

示例

# 方式一 ,加載背景音樂
pygame.mixer.music.load("./music/bg.mp3")   # 加載背景音樂
pygame.mixer.music.set_volume(0.5)          # 設(shè)置音量,音量值在 0~1 區(qū)間
pygame.mixer.music.play(-1)                 # 播放音樂,參數(shù)是一個正整數(shù),表示具體循環(huán)次數(shù), -1 則表示無限循環(huán)


# 方式二 ,加載短音效,如 爆炸,發(fā)射子彈等
boomMusic = pygame.mixer.Sound("./music/boom.mp3") # 加載背景音樂
boomMusic.set_volume(0.3) # 設(shè)置音量,音量值在 0~1 區(qū)間
boomMusic.play()   # 播放音樂,參數(shù)是一個正整數(shù),表示具體循環(huán)次數(shù), 不填寫,默認是一次
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2785

    瀏覽量

    49990
  • 電子游戲
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    10069
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86444
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第1節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:37:43

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第2節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:38:33

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第3節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:39:23

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第4節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:40:13

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第5節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:41:04

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第7節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:42:44

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第9節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:44:25

    Pygame初學(xué)者教程 -蟒蛇游戲開發(fā)課程_第10節(jié) #硬聲創(chuàng)作季

    游戲開發(fā)javascriptpython
    充八萬
    發(fā)布于 :2023年08月04日 14:45:15

    【DragonBoard 410c試用體驗】之添加simpleCV庫和Python IDLE

    -numpy python-pygame python-setuptools python-pip步驟2:通過pip命令下載并安裝SimpleCVsudo pip install https://github.com
    發(fā)表于 09-07 22:18

    python開發(fā)ide哪個好?

    有,IDEL用Python實現(xiàn)的Python的IDE工具,但說實話,功能真心不咋地。我個人常用的IDE如下:PyCharmPyCharm是JetBrains開發(fā)Python IDE。
    發(fā)表于 06-07 14:55

    快速學(xué)會用python游戲

    10分鐘學(xué)會用python游戲!Python其實很簡單!
    發(fā)表于 07-01 15:24

    如何用Python創(chuàng)建自己的Dino Run?

    ,讓我們直接進入教程,如何用Python創(chuàng)建自己的Dino Run?請遵循所有精心給出的說明,以免在運行Dino Run游戲時出現(xiàn)任何問題。  如何用Python創(chuàng)建自己的Dino Run?  首先,從安裝
    發(fā)表于 07-21 18:11

    一切從游戲開始_python

    一切從游戲開始_python
    發(fā)表于 03-19 11:23 ?7次下載

    零基礎(chǔ)學(xué)python基礎(chǔ)教程PDF電子書免費下載

    程序管理的知識和技術(shù)。全書共分 17 章,包括初識 PythonPython 語言基礎(chǔ)、流程控制語句、序列的應(yīng)用、Pygame 游戲編程、網(wǎng)絡(luò)爬蟲
    發(fā)表于 09-29 08:00 ?27次下載

    【飛凌RZ/G2L開發(fā)板試用體驗】開發(fā)環(huán)境體驗之python開發(fā)2048小游戲

    本文來源電子發(fā)燒友社區(qū),作者:李先生, 帖子地址: https://bbs.elecfans.com/jishu_2299870_1_1.html Python開發(fā)環(huán)境體驗:2048游戲 前言 查看
    的頭像 發(fā)表于 10-24 17:44 ?1138次閱讀
    【飛凌RZ/G2L<b class='flag-5'>開發(fā)</b>板試用體驗】<b class='flag-5'>開發(fā)</b>環(huán)境體驗之<b class='flag-5'>python</b><b class='flag-5'>開發(fā)</b>2048小<b class='flag-5'>游戲</b>