主頁 > 知識庫 > pygame實現(xiàn)鍵盤和鼠標(biāo)事件的處理

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

熱門標(biāo)簽:西藏快速地圖標(biāo)注地點 地圖標(biāo)注推廣單頁 長春人工智能電銷機器人官網(wǎng) 廈門crm外呼系統(tǒng)如何 如何在地圖標(biāo)注文字 女王谷地圖標(biāo)注 n400電話申請多少錢 ai地圖標(biāo)注 百應(yīng)ai電銷機器人鄭州

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

在上節(jié)例子中使用了 pygame.event.get() 來處理所有事件,如果使用 pygame.event.wait() , pygame 會等到發(fā)生一個事件時才繼續(xù)下去,一般在游戲中不太實用,因為游戲往往是需要動態(tài)運作的。pygame 的常用事件如下所示:

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

1. pygame 的鍵盤事件的處理

通常用 pyagme.event.get() 獲取所有事件,若 event.type == KEYDOWN , 這時是鍵盤事件,再判斷按鍵的 event.key 的種類(即 K_a 、 K_b 、 K_LEFT 這種形式)。用戶也可以使用 pygame.key.get_pressed() 來獲取所有被按下的鍵值,對應(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 開發(fā)一個由用戶控制坦克移動的游戲。在上節(jié)例子的基礎(chǔ)上增加通過方向鍵控制坦克移動的功能,并為游戲增加背景圖片。代碼如下:

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("用戶方向鍵控制移動的坦克")
  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)用戶按下方向鍵時坦克按指定方向移動,釋放方向鍵時坦克停止移動。如下所示:

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

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

  • pygame.mouse.get_pressed(): 返回按鍵的按下情況,返回的是一元組,分別為左鍵、中鍵、右鍵,如果被按下則為 True 。
  • pygame.mouse.get_rel(): 返回相對偏移量,即(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)是否可見。
  • 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:
      # 按任意鍵可清屏,并把點恢復(fù)到原始狀態(tài)
      points = []
      srceen.fill((255, 255, 255))   # 用白色填充窗口背景
    if event.type == pygame.MOUSEBUTTONDOWN:	# 鼠標(biāo)按下
      screen.fill((255, 255, 255))
      # 畫隨機矩形
      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))
      # 畫隨機圓形
      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ù)單擊位置畫弧線
      angle = (x / 639) * pi * 2
      pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
      # 根據(jù)單擊位置畫橢圓
      pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))
      # 從左上和右下畫兩根連線到單擊位置
      pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))
      pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))
      # 畫單擊軌跡圖
      if len(points) > 1:
        pygame.draw.lines(screen, (155, 155, 0), points, False, 2)
      # 把鼠標(biāo)單擊的每個點畫明顯點
      for p in points:
        pygame.draw.circle(screen, (155, 155, 155), p, 3)
	pygame.display.update()

運行這個程序,在窗口上單擊鼠標(biāo)就會有圖形出來,按鍵盤上任意鍵可清屏重新開始。如下:

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

您可能感興趣的文章:
  • 詳解pygame捕獲鍵盤事件的兩種方式
  • Python中pygame的mouse鼠標(biāo)事件用法實例
  • python基于pygame實現(xiàn)響應(yīng)游戲中事件的方法(附源碼)
  • 詳解Python中Pygame鍵盤事件

標(biāo)簽:興安盟 黔東 內(nèi)江 拉薩 亳州 廊坊 渭南 綿陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《pygame實現(xiàn)鍵盤和鼠標(biāo)事件的處理》,本文關(guān)鍵詞  pygame,實現(xiàn),鍵盤,和,鼠標(biāo),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《pygame實現(xiàn)鍵盤和鼠標(biāo)事件的處理》相關(guān)的同類信息!
  • 本頁收集關(guān)于pygame實現(xiàn)鍵盤和鼠標(biāo)事件的處理的相關(guān)信息資訊供網(wǎng)民參考!
  • 企业400电话

    智能AI客服机器人
    15000

    在线订购

    合计11份范本:公司章程+合伙协议+出资协议+合作协议+股权转让协议+增资扩股协议+股权激励+股东会决议+董事会决议

    推薦文章