pyagme 圖像/圖形繪製

来源:https://www.cnblogs.com/liquancai/archive/2020/07/03/13232469.html
-Advertisement-
Play Games

pygame 圖像 / 圖形繪製 1. pygame 的圖像繪製 pygame 支持多種存儲圖像的方式(也就是圖片格式),例如 JPEG、PNG 等,具體支持 JPEG (一般擴展名為 .jpg 或者 .jpeg ,數位相機、網上的圖片基本上都是這種格式,這是一種有損壓縮方式,儘管對圖片的質量有所損 ...


pygame 圖像 / 圖形繪製

1. pygame 的圖像繪製

pygame 支持多種存儲圖像的方式(也就是圖片格式),例如 JPEG、PNG 等,具體支持 JPEG (一般擴展名為 .jpg 或者 .jpeg ,數位相機、網上的圖片基本上都是這種格式,這是一種有損壓縮方式,儘管對圖片的質量有所損壞,但對於減小文件尺寸很有幫助,其優點很多,只是不支持透明)、PNG(支持透明,無損壓縮)、GIF(網上使用得很多,支持透明和動畫,但只能有 256 種顏色,在軟體和游戲中的使用很少)以及 BMP、PCX、TGA、TIF 等格式。

pygame 使用 surface 對象來載入繪製的圖像。對於 pygame ,載入圖片使用 pygame.image.load(), 給它一個文件名然後返回一個 surface 對象。儘管載入的圖像格式不同,但 surface 對象隱藏了這些不同。用戶可以對一個 surface 對象進行塗畫、變形、複製等各種操作。事實上游戲屏幕也只是一個 surface, pygame.display.set_mode() 返回了一個 surface 對象。

對於任何一個 surface 對象,可以用 get_width() 、get_height() 和 get_size() 函數來獲取它的尺寸,get_rect() 用來獲取它的區域形狀。

例:使用 pygame 開發一個顯示坦克自由移動的游戲視窗

import pygame


def tank():
    
    pygame.init()
    tank_image = pygame.image.load("tank.png")
    tank_rect = tank_image.get_rect()
    screen = pygame.display.set_mode((400, 600))
    pygame.dispaly.set_caption("自由移動的tank")
    screen_rect = screen.get_rect()
    color_back = (255, 255, 255)
    tank_speed = [1, 1]
    fps_clock = pygame.time.Clock()
    
    while True:
        fps_clock.tick(60)
        for event in pygame.event.get():
            if evnet.type == pygame.QUIT:
                pygame.quit()
                exit()
		tank_rect = tank_rect.move(tank_speed)
        if tank_rect.left < 0 or tank_rect.right > screen_rect.right:
            tank_speed[0] = -tank_speed[0]
        if tank_rect.top < 0 or tank_rect.bottom > screen_rect.bottom:
            tank_speed[1] = tank_speed[1]
        screen.fill(color_back)
        screen.blit(tank_image, tank_rect)
        pygame.display.update()
      

if __name__ == '__main__':
    tank()

程式運行後,可以看到白色背景的游戲視窗,標題是“自由移動的 tank ”,如下圖所示:

image-20200703192037735

在該游戲中通過修改塔克圖像( surface 對象)區域的 left 屬性(可以認為是 x 座標)、 surface 對象的 top 屬性(可以認為是 y 屬性)改變坦克位置,從而顯示出坦克自由移動的效果。在視窗(視窗也是 surface 對象)使用的 blit() 函數上繪製坦克圖像,最後註意需要更新視窗顯示內容。

設置 fps_clock 變數的值即可控制創建刷新速度,語法如下:

fps_clock = pygame.time.Clock()

在無限迴圈中寫入 fps_clock.tick(60) ,可以按指定幀頻 60 更新游戲畫面(即每秒刷新 60 次屏幕)。


2.pygame 的圖形繪製

在屏幕上繪製各種圖形時使用 pygame.draw 模塊中的一些函數,事實上,pygame 可以不載入任何圖片,而使用圖形來製作一個游戲。

pygame.draw 中的函數的第 1 個參數總是一個 sueface , 然後是顏色,接著是一系列的座標等。對於電腦中的座標,(0,0)代表左上角,水平向右為 X 軸的正方向,垂直向下為 Y 軸的正方向。該函數的返回值是一個 rect 對象,包含了繪製的區域,這樣就可以很方便的更新那一部分了。pygame.draw 中的函數如下表所示:

函數 作用 函數 作用
rect() 繪製矩形 line() 繪製線
polygon() 繪製多邊形(3個及3個以上的邊) lines() 繪製一系列的線
circle() 繪製圓 aaline() 繪製一根平滑的線
ellipse() 繪製橢圓 aalines() 繪製一系列平滑的線
arc() 繪製圓弧

下麵詳細說明 pygame.draw 中各個函數的使用。

  1. pygame.draw.rect()

    格式:pygame.draw.rect(surface, color, rect, width=0)

    pygame.draw.rect() 在 surface 上畫一個矩形,除了 surface 和 color 以外,rect 接收一個矩形的座標和線寬參數,如果線寬是 0 或省略,則填充。

  2. pygame.draw.polygon()

    格式:pygame.draw.polygon(surface, color, pointlist, width=0)

    polygon() 用於畫多邊形,其用法類似於 rect(), 與 rect() 第1、第2、第 4 個參數都是相同的,只不過 polygon()會接收一系列座標的列表,代表了各個頂點的座標。

  3. pygame.draw.circle()

    格式:pygame.draw.circle(surface, color, pos, radius, width=0)

    circle() 用於畫一個圓,它接收一個圓心座標和一個半徑參數。

  4. pygame.draw.ellipse()

    格式:pygame.draw.ellipse(surface, color, rect, width=0)

    用戶可以把 ellipse 想象成一個被壓扁的圓,事實上,它可以被一個矩形裝起來。ellipse() 的第 3 個參數就是這個橢圓的外接矩形。

  5. pygame.draw.arc()

    格式:pygame.draw.arc(surface, color, rect, start_angle, stop_angle, width=1)

    arc() 是橢圓的一部分,所以它的參數比橢圓多一些。但它不是封閉的,因此沒有 fill() 方法,start_angle 和 stop_angle 為開始和結束的角度。

  6. pygame.draw.line()

    格式:pygame.draw.line(surface, color, start_pos, end_pos, width=1)

    line() 用於畫一條線段,start_pos 和 end_pos 是線段的起點和結點座標。

  7. pygame.draw.lines()

    格式:pygame.draw.lines(surface, color, closed, pointlist, width=1)

    closed 是一個布爾變數,指明是否需要多畫一條線來使這些線條閉合(這樣就和 polygon() 一樣了),pointlist 是一個頂點座標的數組。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java生鮮電商平臺-微服務電商優惠券的架構設計(小程式/APP) 說明:Java生鮮電商平臺的優惠券屬於電子優惠券,不過我們要先看看線下紙質優惠券: 商家決定做促銷,印製了10000張50元代金券; 其中1000張代金券分別發給1000個用戶; 到某一個時刻,這1000個用戶有300個適用了代金券 ...
  • 一、Java基礎知識 二、軟體 1. 軟體是什麼? 軟體=數據+指令[命令]+文檔 2. 軟體開髮指什麼? 軟體開發是根據用戶的需求創建出相應的軟體系統. 軟體開發是一個過程,包含需求的提取,需求分析,軟體的編寫,軟體測試. 三、人與電腦做交互 圖形化界面 vs 命令行方式 dir md rd c ...
  • 前言 剛回到家,又被公司群里的消息轟炸了。讓統計每個人最近是否去過石景山萬達廣場。 這基本上已經是每日必備了,只要有任何風吹草動,就需要我們填各種信息。 我們都知道,北京最近的疫情很不樂觀,從每天的數據就能看出來了。 也許很多小伙伴不在北京,是切實感受不到的。 就拿我自己舉例吧,在去公司的每一天,我 ...
  • 這篇博客還是整理從https://github.com/LyricTian/gin-admin 這個項目中學習的golang相關知識 作者在項目中使用了https://github.com/google/wire 做依賴註入,這個庫我之前沒有使用過,看了作者代碼中的使用,至少剛開始是看著優點懵,不知 ...
  • 轉載:https://blog.csdn.net/walkerJong/article/details/7946109 ...
  • # Definition for a binary tree node.class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Nonea = TreeNode(1)b = TreeNode( ...
  • 編寫程式,讀取在1到100 之間的整數,然後計算每個數出現的次數。假定輸入是以0 結束的。 下麵是這個程式的一個運行示例: Write a program that reads the integers between 1and 100 and counts the occurrences of e ...
  • 安裝pandas 通過python pip安裝pandas pip install pandas pandas數據結構 pandas常用數據結構包括:Series和DataFrame Series Series是一種一維的數組型對象,包含一個值序列(與numpy中的數據類型相似),數據標簽(稱為索引 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...