欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pygame實(shí)現(xiàn)鍵盤和鼠標(biāo)事件的處理

 更新時(shí)間:2021年03月18日 10:53:10   作者:言若是諾  
這篇文章主要介紹了pygame實(shí)現(xiàn)鍵盤和鼠標(biāo)事件的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

所謂事件,就是程序上發(fā)生的事。例如用戶按下鍵盤上的某個(gè)鍵或者單擊、移動(dòng)鼠標(biāo),對(duì)于這些事件,游戲程序需要作出反應(yīng)。如《 pygame 圖像/圖形繪制》中例子,程序會(huì)一直運(yùn)行下去,直到用戶關(guān)閉窗口而產(chǎn)生一個(gè) QUIT 事件,pygame 會(huì)接收用戶的各種操作(例如按鍵盤上的鍵、移動(dòng)鼠標(biāo)等)產(chǎn)生事件。事件隨時(shí)可能發(fā)生,而且量可能會(huì)很大,pygame 的做法是把一系列的事件存放到一個(gè)隊(duì)列里逐個(gè)處理。

在上節(jié)例子中使用了 pygame.event.get() 來(lái)處理所有事件,如果使用 pygame.event.wait() , pygame 會(huì)等到發(fā)生一個(gè)事件時(shí)才繼續(xù)下去,一般在游戲中不太實(shí)用,因?yàn)橛螒蛲切枰獎(jiǎng)討B(tài)運(yùn)作的。pygame 的常用事件如下所示:

事件 產(chǎn)生途徑 參數(shù)
QUIT 用戶按下“關(guān)閉”按鈕 None
ACTIVEEVENT pygame 被激活或者隱藏 gain 、state
KEYDOWN 鍵盤被按下 unicode 、key 、mod
KEYUP 鍵盤被放開(kāi) key 、mod
MOUSEMOTION 鼠標(biāo)移動(dòng) pos 、rel 、buttons
MOUSEBUTTONDOWN 鼠標(biāo)被按下 pos 、button
MOUSEBUTTONUP 鼠標(biāo)被放開(kāi) pos 、button

1. pygame 的鍵盤事件的處理

通常用 pyagme.event.get() 獲取所有事件,若 event.type == KEYDOWN , 這時(shí)是鍵盤事件,再判斷按鍵的 event.key 的種類(即 K_a 、 K_b 、 K_LEFT 這種形式)。用戶也可以使用 pygame.key.get_pressed() 來(lái)獲取所有被按下的鍵值,對(duì)應(yīng)的就是鍵是否被按下。

keys_pressed = pygame.key.get_pressed()
if keys_pressed[K_SPACE]:
  # 空格鍵被按下
  fire()      # 發(fā)射子彈

在 key 模塊下有很多函數(shù),如下:

  • key.get_focused(): 返回當(dāng)前的 pygame 窗口是否被激活。
  • key.get_pressed(): 獲得所有被按下的鍵值。
  • key.get_mods(): 按下的組合鍵(Alt 、Ctrl 、Shift)。
  • key.set_mods(): 模擬按下組合鍵的效果(KMOD_ALT 、 KMOD_CTRL 、 KMOD_SHIFT)。

使用 pygame 開(kāi)發(fā)一個(gè)由用戶控制坦克移動(dòng)的游戲。在上節(jié)例子的基礎(chǔ)上增加通過(guò)方向鍵控制坦克移動(dòng)的功能,并為游戲增加背景圖片。代碼如下:

import pygame
def tank_play():
  pygame,inite()
  tank_image = pygame.image.load("../images/tank.png")
  tank_rect = tank_image.get_rect()
  back_image = pygame.iamge.load("../images/background2.jpg")
  back_rect = back_image.get_rect()
  screen = pygame.display.set_mode(back_rect.size)
  pygame.display.set_caption("用戶方向鍵控制移動(dòng)的坦克")
  offset = 2   # 偏移量
  fps_clock = pygame.time.Clock()
  while True:
    fps_clock.tick(60)
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        pygame.quit()
        exit()
    keys_pressed = pygame.key.get_presssed()
    if keys_pressed[pygame.K_RIGHT]:
      tank_rect.x += offset
    if keys_pressed[pygame.K_LEFT]:
      tank_rect.x -= offset
    if keys_pressed[oygame.K_UP]:
      tank_rect.y -= offset
    if keys_pressed[pygame.K_DOWN]:
      tank_rect.y += offset
    tank_rect.clamp_ip(back_rect)
    screen.blit(back_image, back_rect)
    screen.blit(tank_image, tank_rect)
    pygame.display.update()
      
if __name__ == '__main--':
  tank_play()

當(dāng)用戶按下方向鍵時(shí)坦克按指定方向移動(dòng),釋放方向鍵時(shí)坦克停止移動(dòng)。如下所示:

2. pygame 的鼠標(biāo)事件的處理

pygame.mouse 的函數(shù)如下:

  • pygame.mouse.get_pressed(): 返回按鍵的按下情況,返回的是一元組,分別為左鍵、中鍵、右鍵,如果被按下則為 True 。
  • pygame.mouse.get_rel(): 返回相對(duì)偏移量,即(x 方向偏移量,y 方向偏移量)的一元組。
  • pygame.mouse.get_pos(): 返回當(dāng)前鼠標(biāo)位置(x, y)。

例如:x, y = pygame.mouse.get_pos() 用于獲取鼠標(biāo)位置。

  • pygame.mouse.set_pos(): 設(shè)置鼠標(biāo)位置。
  • pygame.mouse.set_visible(): 設(shè)置鼠標(biāo)光標(biāo)是否可見(jiàn)。
  • pygame.mouse.get_focused(): 如果鼠標(biāo)在 pygame 窗口內(nèi)有效,返回 True 。
  • pygame.mouse.set_cursor(): 設(shè)置鼠標(biāo)的默認(rèn)光標(biāo)樣式。
  • pygame.mouse.get_cursor(): 返回鼠標(biāo)的光標(biāo)樣式。

演示鼠標(biāo)事件的處理程序,代碼如下:

from math import pi
from random import randint
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
points = []
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()
  	if event.type == pygame.KEYDOWN:
      # 按任意鍵可清屏,并把點(diǎn)恢復(fù)到原始狀態(tài)
      points = []
      srceen.fill((255, 255, 255))   # 用白色填充窗口背景
    if event.type == pygame.MOUSEBUTTONDOWN:	# 鼠標(biāo)按下
      screen.fill((255, 255, 255))
      # 畫(huà)隨機(jī)矩形
      rc = (255, 0, 0)	# 紅色
      rp = (randint(0, 639), randint(0, 479))
      rs = (639 - randint(rp[0], 639), 479 - randint(rp[1], 479))
      pygame.draw.rect(screen, rc, pygame.Rect(rp, rs))
      # 畫(huà)隨機(jī)圓形
      rc = (0, 255, 0)	# 綠色
      rp = (randint(0, 639), randint(0, 479))
      rr = randint(1, 200)
      pygame.draw.circle(screen, rc, rp, rr)
      # 獲取當(dāng)前鼠標(biāo)單擊位置
      x, y = pygame.mouse.get_pos()
      points.append((x, y))
      # 根據(jù)單擊位置畫(huà)弧線
      angle = (x / 639) * pi * 2
      pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
      # 根據(jù)單擊位置畫(huà)橢圓
      pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))
      # 從左上和右下畫(huà)兩根連線到單擊位置
      pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))
      pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))
      # 畫(huà)單擊軌跡圖
      if len(points) > 1:
        pygame.draw.lines(screen, (155, 155, 0), points, False, 2)
      # 把鼠標(biāo)單擊的每個(gè)點(diǎn)畫(huà)明顯點(diǎn)
      for p in points:
        pygame.draw.circle(screen, (155, 155, 155), p, 3)
	pygame.display.update()

運(yùn)行這個(gè)程序,在窗口上單擊鼠標(biāo)就會(huì)有圖形出來(lái),按鍵盤上任意鍵可清屏重新開(kāi)始。如下:

到此這篇關(guān)于pygame實(shí)現(xiàn)鍵盤和鼠標(biāo)事件的處理的文章就介紹到這了,更多相關(guān)pygame 鍵盤和鼠標(biāo)事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析

    Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析

    這篇文章主要介紹了Python 讀取用戶指令和格式化打印實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • K-means聚類算法介紹與利用python實(shí)現(xiàn)的代碼示例

    K-means聚類算法介紹與利用python實(shí)現(xiàn)的代碼示例

    K-means聚類算法(事先數(shù)據(jù)并沒(méi)有類別之分!所有的數(shù)據(jù)都是一樣的)是我們大家應(yīng)該都聽(tīng)過(guò)的一種算法,下面這篇文章主要給大家介紹了關(guān)于K-means聚類算法的基礎(chǔ)知識(shí)與利用python如何實(shí)現(xiàn)該算法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11
  • OpenCV+MediaPipe實(shí)現(xiàn)手部關(guān)鍵點(diǎn)識(shí)別

    OpenCV+MediaPipe實(shí)現(xiàn)手部關(guān)鍵點(diǎn)識(shí)別

    這篇文章主要介紹了如何通過(guò)OpenCV MediaPipe實(shí)現(xiàn)手部關(guān)鍵點(diǎn)識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的價(jià)值,需要的可以參考一下
    2022-01-01
  • django rest framework serializers序列化實(shí)例

    django rest framework serializers序列化實(shí)例

    這篇文章主要介紹了django rest framework serializers序列化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解

    Python實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解

    matplotlib中的animation提供了動(dòng)態(tài)繪圖功能,這篇文章主要為大家詳細(xì)介紹了Python如何利用matplotlib實(shí)現(xiàn)動(dòng)態(tài)繪圖,感興趣的可以了解一下
    2023-05-05
  • python實(shí)現(xiàn)AHP算法的方法實(shí)例(層次分析法)

    python實(shí)現(xiàn)AHP算法的方法實(shí)例(層次分析法)

    這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)AHP算法(層次分析法)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Pyecharts可視化圖片渲染的方法詳解

    Pyecharts可視化圖片渲染的方法詳解

    使用 pyecharts 渲染成圖片一直是開(kāi)發(fā)者比較關(guān)心的功能,pyecharts提供了selenium、phantomjs和pyppeteer 三種方式。本文將具體介紹一下這三種方式的使用,需要的可以參考一下
    2022-02-02
  • 基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法

    基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法

    今天小編就為大家分享一篇基于多進(jìn)程中APScheduler重復(fù)運(yùn)行的解決方法,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • PyQt實(shí)現(xiàn)異步數(shù)據(jù)庫(kù)請(qǐng)求的實(shí)戰(zhàn)記錄

    PyQt實(shí)現(xiàn)異步數(shù)據(jù)庫(kù)請(qǐng)求的實(shí)戰(zhàn)記錄

    開(kāi)發(fā)軟件的時(shí)候不可避免要和數(shù)據(jù)庫(kù)發(fā)生交互,但是有些 SQL 請(qǐng)求非常耗時(shí),如果在主線程中發(fā)送請(qǐng)求,可能會(huì)造成界面卡頓,本文將介紹一種讓數(shù)據(jù)庫(kù)請(qǐng)求變得和前端的 ajax 請(qǐng)求一樣簡(jiǎn)單,希望對(duì)大家有所幫助
    2023-12-12
  • 詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹

    詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹

    這篇文章主要介紹了詳解pytest實(shí)現(xiàn)mark標(biāo)記功能詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論