• 售前

  • 售后

热门帖子
入门百科

pygame实现键盘和鼠标事件的处置惩罚

[复制链接]
hdnnuz62 显示全部楼层 发表于 2021-10-26 12:23:50 |阅读模式 打印 上一主题 下一主题
所谓事件,就是程序上发生的事。比方用户按下键盘上的某个键或者单击、移动鼠标,对于这些事件,游戏程序须要作出反应。如《 pygame 图像/图形绘制》中例子,程序会不停运行下去,直到用户关闭窗口而产生一个 QUIT 事件,pygame 会接收用户的各种操纵(比方按键盘上的键、移动鼠标等)产生事件。事件随时大概发生,而且量大概会很大,pygame 的做法是把一系列的事件存放到一个队列里逐个处置惩罚。
在上节例子中使用了
  1. pygame.event.get()
复制代码
来处置惩罚全部事件,如果使用
  1. pygame.event.wait()
复制代码
, 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 的键盘事件的处置惩罚

通常用
  1. pyagme.event.get()
复制代码
获取全部事件,若
  1. event.type == KEYDOWN
复制代码
, 这时是键盘事件,再判断按键的
  1. event.key
复制代码
的种类(即 K_a 、 K_b 、 K_LEFT 这种形式)。用户也可以使用
  1. pygame.key.get_pressed()
复制代码
来获取全部被按下的键值,对应的就是键是否被按下。
  1. keys_pressed = pygame.key.get_pressed()
  2. if keys_pressed[K_SPACE]:
  3.   # 空格键被按下
  4.   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 开发一个由用户控制坦克移动的游戏。在上节例子的底子上增加通过方向键控制坦克移动的功能,并为游戏增加配景图片。代码如下:
  1. import pygame
  2. def tank_play():
  3.   pygame,inite()
  4.   tank_image = pygame.image.load("../images/tank.png")
  5.   tank_rect = tank_image.get_rect()
  6.   back_image = pygame.iamge.load("../images/background2.jpg")
  7.   back_rect = back_image.get_rect()
  8.   screen = pygame.display.set_mode(back_rect.size)
  9.   pygame.display.set_caption("用户方向键控制移动的坦克")
  10.   offset = 2   # 偏移量
  11.   fps_clock = pygame.time.Clock()
  12.   while True:
  13.     fps_clock.tick(60)
  14.     for event in pygame.event.get():
  15.       if event.type == pygame.QUIT:
  16.         pygame.quit()
  17.         exit()
  18.     keys_pressed = pygame.key.get_presssed()
  19.     if keys_pressed[pygame.K_RIGHT]:
  20.       tank_rect.x += offset
  21.     if keys_pressed[pygame.K_LEFT]:
  22.       tank_rect.x -= offset
  23.     if keys_pressed[oygame.K_UP]:
  24.       tank_rect.y -= offset
  25.     if keys_pressed[pygame.K_DOWN]:
  26.       tank_rect.y += offset
  27.     tank_rect.clamp_ip(back_rect)
  28.     screen.blit(back_image, back_rect)
  29.     screen.blit(tank_image, tank_rect)
  30.     pygame.display.update()
  31.       
  32. if __name__ == '__main--':
  33.   tank_play()
复制代码
当用户按下方向键时坦克按指定方向移动,释放方向键时坦克停止移动。如下所示:

2. pygame 的鼠标事件的处置惩罚

pygame.mouse 的函数如下:
      
  • pygame.mouse.get_pressed(): 返回按键的按下情况,返回的是一元组,分别为左键、中键、右键,如果被按下则为 True 。  
  • pygame.mouse.get_rel(): 返回相对偏移量,即(x 方向偏移量,y 方向偏移量)的一元组。  
  • pygame.mouse.get_pos(): 返回当前鼠标位置(x, y)。
比方:
  1. 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(): 返回鼠标的光标样式。
演示鼠标事件的处置惩罚程序,代码如下:
  1. from math import pi
  2. from random import randint
  3. import pygame
  4. pygame.init()
  5. screen = pygame.display.set_mode((640, 480))
  6. points = []
  7. while True:
  8.   for event in pygame.event.get():
  9.     if event.type == pygame.QUIT:
  10.       pygame.quit()
  11.       exit()
  12.           if event.type == pygame.KEYDOWN:
  13.       # 按任意键可清屏,并把点恢复到原始状态
  14.       points = []
  15.       srceen.fill((255, 255, 255))   # 用白色填充窗口背景
  16.     if event.type == pygame.MOUSEBUTTONDOWN:        # 鼠标按下
  17.       screen.fill((255, 255, 255))
  18.       # 画随机矩形
  19.       rc = (255, 0, 0)        # 红色
  20.       rp = (randint(0, 639), randint(0, 479))
  21.       rs = (639 - randint(rp[0], 639), 479 - randint(rp[1], 479))
  22.       pygame.draw.rect(screen, rc, pygame.Rect(rp, rs))
  23.       # 画随机圆形
  24.       rc = (0, 255, 0)        # 绿色
  25.       rp = (randint(0, 639), randint(0, 479))
  26.       rr = randint(1, 200)
  27.       pygame.draw.circle(screen, rc, rp, rr)
  28.       # 获取当前鼠标单击位置
  29.       x, y = pygame.mouse.get_pos()
  30.       points.append((x, y))
  31.       # 根据单击位置画弧线
  32.       angle = (x / 639) * pi * 2
  33.       pygame.draw.arc(screen, (0, 0, 0), (0, 0, 639, 479), 0, angle, 3)
  34.       # 根据单击位置画椭圆
  35.       pygame.draw.ellipse(screen, (0, 255, 0), (0, 0, x, y))
  36.       # 从左上和右下画两根连线到单击位置
  37.       pygame.draw.line(screen, (0, 0, 255), (0, 0), (x, y))
  38.       pygame.draw.line(screen, (255, 0, 0), (640, 480), (x, y))
  39.       # 画单击轨迹图
  40.       if len(points) > 1:
  41.         pygame.draw.lines(screen, (155, 155, 0), points, False, 2)
  42.       # 把鼠标单击的每个点画明显点
  43.       for p in points:
  44.         pygame.draw.circle(screen, (155, 155, 155), p, 3)
  45.         pygame.display.update()
复制代码
运行这个程序,在窗口上单击鼠标就会有图形出来,按键盘上任意键可清屏重新开始。如下:

到此这篇关于pygame实现键盘和鼠标事件的处置惩罚的文章就介绍到这了,更多相关pygame 键盘和鼠标事件内容请搜索草根技术分享从前的文章或继续浏览下面的相关文章盼望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作