怎么在pygame中对键盘和鼠标事件进行处理

本篇文章为大家展示了怎么在pygame中对键盘和鼠标事件进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

pygame 的常用事件如下所示:

事件 产生途径 参数
QUIT 用户按下“关闭”按钮 None
ACTIVEEVENT pygame 被激活或者隐藏 gain 、state
KEYDOWN 键盘被按下 unicode 、key 、mod
KEYUP 键盘被放开 key 、mod
MOUSEMOTION 鼠标移动 pos 、rel 、buttons
MOUSEBUTTONDOWN 鼠标被按下 pos 、button
MOUSEBUTTONUP 鼠标被放开 pos 、button

1. pygame 的键盘事件的处理

通常用 pyagme.event.get() 获取所有事件,若 event.type == KEYDOWN , 这时是键盘事件,再判断按键的 event.key 的种类(即 K_a 、 K_b 、 K_LEFT 这种形式)。用户也可以使用 pygame.key.get_pressed() 来获取所有被按下的键值,对应的就是键是否被按下。

keys_pressed = pygame.key.get_pressed()
if keys_pressed[K_SPACE]:
  # 空格键被按下
  fire()      # 发射子弹

在 key 模块下有很多函数,如下:

  • key.get_focused(): 返回当前的 pygame 窗口是否被激活。

  • key.get_pressed(): 获得所有被按下的键值。

  • key.get_mods(): 按下的组合键(Alt 、Ctrl 、Shift)。

  • key.set_mods(): 模拟按下组合键的效果(KMOD_ALT 、 KMOD_CTRL 、 KMOD_SHIFT)。

使用 pygame 开发一个由用户控制坦克移动的游戏。在上节例子的基础上增加通过方向键控制坦克移动的功能,并为游戏增加背景图片。代码如下:

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()

当用户按下方向键时坦克按指定方向移动,释放方向键时坦克停止移动。如下所示:

怎么在pygame中对键盘和鼠标事件进行处理

2. pygame 的鼠标事件的处理

pygame.mouse 的函数如下:

  • pygame.mouse.get_pressed(): 返回按键的按下情况,返回的是一元组,分别为左键、中键、右键,如果被按下则为 True 。

  • pygame.mouse.get_rel(): 返回相对偏移量,即(x 方向偏移量,y 方向偏移量)的一元组。

  • pygame.mouse.get_pos(): 返回当前鼠标位置(x, y)。

例如:x, y = pygame.mouse.get_pos() 用于获取鼠标位置。

  • pygame.mouse.set_pos(): 设置鼠标位置。

  • pygame.mouse.set_visible(): 设置鼠标光标是否可见。

  • pygame.mouse.get_focused(): 如果鼠标在 pygame 窗口内有效,返回 True 。

  • pygame.mouse.set_cursor(): 设置鼠标的默认光标样式。

  • pygame.mouse.get_cursor(): 返回鼠标的光标样式。

演示鼠标事件的处理程序,代码如下:

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:
      # 按任意键可清屏,并把点恢复到原始状态
      points = []
      srceen.fill((255, 255, 255))   # 用白色填充窗口背景
    if event.type == pygame.MOUSEBUTTONDOWN:	# 鼠标按下
      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)
      # 获取当前鼠标单击位置
      x, y = pygame.mouse.get_pos()
      points.append((x, y))
      # 根据单击位置画弧线
      angle = (x / 639) * pi * 2
      pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
      # 根据单击位置画椭圆
      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)
      # 把鼠标单击的每个点画明显点
      for p in points:
        pygame.draw.circle(screen, (155, 155, 155), p, 3)
	pygame.display.update()

上述内容就是怎么在pygame中对键盘和鼠标事件进行处理,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。