在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Python-pygame 游戲開發

汽車電子技術 ? 來源:程序猿知秋 ? 作者: 程序猿知秋 ? 2023-02-16 15:43 ? 次閱讀

pygame 基本介紹與使用

介紹

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

安裝

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

**游戲的初始化與退出

**

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

游戲中的坐標系

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

示例

import pygame
# 定義一個英雄的矩形,參數: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))

圖片

創建游戲主窗口

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

示例

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


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

**游戲中的動畫原理

**

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

示例

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


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

游戲的事件與監聽(event)

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

示例

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


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

            # 退出系統
            exit()

pygame 高級使用

精靈與精靈組

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

示例

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

import pygame


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


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


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


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

main.py

from plane_sprites import *


pygame.init()
# 創建游戲的主窗口,只指定寬和高
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))


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


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




while True:
    # 設置每秒刷新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)


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


    pygame.display.update()


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


            # 退出系統
            exit()

**定時器

**

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

語法

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


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

示例

# 自定義事件
EVENT_ENEMY=pygame.USEREVENT


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


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


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

鍵盤按鍵捕****獲

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

第一種方式語法

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

第二種方式語法

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

碰撞檢測

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

繪制字體

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

**示例:

**

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


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


# 在屏幕上繪制字體,第一個參數是字體對象,第二個參數是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)          # 設置音量,音量值在 0~1 區間
pygame.mixer.music.play(-1)                 # 播放音樂,參數是一個正整數,表示具體循環次數, -1 則表示無限循環


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

    關注

    7

    文章

    2723

    瀏覽量

    47603
  • 電子游戲
    +關注

    關注

    0

    文章

    39

    瀏覽量

    9940
  • python
    +關注

    關注

    56

    文章

    4801

    瀏覽量

    84849
收藏 人收藏

    評論

    相關推薦

    Pygame初學者教程 -蟒蛇游戲開發課程_第1節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第2節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第3節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第4節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第5節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第7節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第9節 #硬聲創作季

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

    Pygame初學者教程 -蟒蛇游戲開發課程_第10節 #硬聲創作季

    游戲開發javascriptpython
    充八萬
    發布于 :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
    發表于 09-07 22:18

    python開發ide哪個好?

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

    快速學會用python游戲

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

    如何用Python創建自己的Dino Run?

    ,讓我們直接進入教程,如何用Python創建自己的Dino Run?請遵循所有精心給出的說明,以免在運行Dino Run游戲時出現任何問題?! ∪绾斡?b class='flag-5'>Python創建自己的Dino Run?  首先,從安裝
    發表于 07-21 18:11

    一切從游戲開始_python

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

    零基礎學python基礎教程PDF電子書免費下載

    程序管理的知識和技術。全書共分 17 章,包括初識 PythonPython 語言基礎、流程控制語句、序列的應用、Pygame 游戲編程、網絡爬蟲
    發表于 09-29 08:00 ?27次下載

    【飛凌RZ/G2L開發板試用體驗】開發環境體驗之python開發2048小游戲

    本文來源電子發燒友社區,作者:李先生, 帖子地址: https://bbs.elecfans.com/jishu_2299870_1_1.html Python開發環境體驗:2048游戲 前言 查看
    的頭像 發表于 10-24 17:44 ?911次閱讀
    【飛凌RZ/G2L<b class='flag-5'>開發</b>板試用體驗】<b class='flag-5'>開發</b>環境體驗之<b class='flag-5'>python</b><b class='flag-5'>開發</b>2048小<b class='flag-5'>游戲</b>
    主站蜘蛛池模板: 快乐你懂的在线视频免费观看| 久久这里只精品热在线8| 黄蓉h肉辣文大全| 男女交性视频免费视频| 好爽好深太大了再快一点| 中文天堂最新版www| 亚洲综合丁香婷婷六月香| 亚洲国产成人久久一区www| 四虎影院在线免费播放| 日本亚洲精品色婷婷在线影院| 欧美大狠狠大臿蕉香蕉大视频| 啪啪中文字幕| 人人草草| 能可以直接看的av网址| 中国一级特黄aa毛片大片| 婷婷六月激情| 人碰人操| 国产精品99r8免费视频2022| 亚洲午夜久久| 九九精品在线| 5566成人| 亚洲人色大成年网站在线观看| 日本香蕉视频| 国产美女精品视频免费观看| 午夜传媒| 日本69sex护士www| www.亚洲欧美| 日韩免费| 成人网在线视频| 人人做人人干| 777黄色片| 一级国产特黄aa大片| 欧美在线小视频| 成熟妇女毛耸耸性视频| 免费一级毛片正在播放| 六月丁香深爱六月综合激情| 被男同桌摸内裤好爽视频| 日本丶国产丶欧美色综合| 国产高清视频免费最新在线| 全免费一级毛片在线播放| zsvdy午夜片|