zoukankan      html  css  js  c++  java
  • python游戏开发:pygame事件与设备轮询

    一、pygame事件

    1.简介

    pygame事件可以处理游戏中的各种事情。其实在前两节的博客中,我们已经使用过他们了。如下是pygame的完整事件列表:

    QUIT,ACTIVEEVENT,KEYDOWN,KEYDOWN,MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN,JOYAXISMOTION,

    JOYBALLMOTION,JOYHATMOTION........

    更多的事件可以去查pygame的文档。http://www.pygame.org/docs/index.html

    查看pygame的文档是一种非常好的学习方式。

    2.实时事件循环

    pygame中的事件处理是放在一个实时的循环中来完成的。将代码都放在一个while True的循环中,但是这样会造成死循环,所以在里面加一句sys.exit()来退出。

    for event in pygame.event.get()
    上面的代码将会创建当前等待处理的事件的一个列表,然后使用for循环来遍历里面的事件。这样,我们将会根据事件产生的顺序依次地进行不同的操作。常见的事件是按键按下,按键释放以及鼠标移动。通常需要最先处理QUIT事件(在用户关闭窗口的时候会产生该事件。)

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    pygame.quit()
    sys.exit()
    3.键盘事件

    键盘事件包括最典型的keyup 和 keydown 当按键按下的时候响应KEYDOWN事件,按键弹起的时候响应KEYDOWN事件。通常可以设置一个事件变量,然后根据keyup或者keydown给它赋不同的值。

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    sys.exit()
    elif event.type == KEYDOWN:
    key_flag = True
    elif event.type == KEYUP:
    key_flag = False
    默认的话pygame不会重复地去响应一个被一直按住的键,只是在按键第一次被按下的时候响应一次,如果需要重复响应一个按键的话下面的操作:

    pygame.key.set_repeat(10)
    #参数是一个以毫秒为单位的值
    4.鼠标事件

    pygame支持一些鼠标事件,他们包括MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN.

    在MOUSEMOTION中包含了一些属性:event.pos,event.rel,event.buttons

    for event in pygame.event.get():
    if event.type == MOUSEMOTION:
    mouse_x,mouse_y = event.pos
    move_x,move_y = event.rel
    MOUSEBUTTONDOWN里面的属性:

    event.type == MOUSEBUTTONDOWN:
    mouse_down = event.button
    mouse_down_x,mouse_down_y = event.pos
    MOUSEBUTTONUP里面的属性:

    event.type == MOUSEBUTTONUP:
    mouse_up = event.button
    mouse_up_x,mouse_up_y = event.pos
    二、设备轮询

    在pygame中除了pygame事件,还可以使用设备轮询的方法来检测是否有事件发生。而且在python里面是没有switch语句的,因此当需要处理的事件过多时,我们肯定不会去一条一条的去写if...elif....else来匹配,而设备轮询正好解决了这个棘手的问题。

    1.轮询键盘

    在pygame中,使用pygame.key.get_pressed()来轮询键盘接口。这个方法会返回布尔值的一个列表,其中每个键一个标志。使用键常量值来匹配按键,这样的好处就是不必遍历事件系统就可以检测多个键的按下。例如:

    keys = pygame.key.get_pressed()

    if keys[K_ESCAPE]:

    pygame.quit()

    sys.exit()
    我们可以设计一个打字测速小游戏来综合练习一下键盘的轮询:

    import sys, random, time, pygame
    from pygame.locals import *
    '''
    想要学习Python?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!
    '''
    def print_text(font, x, y, text, color=(255,255,255)):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x,y))


    #主程序
    pygame.init()
    screen = pygame.display.set_mode((600,500))
    pygame.display.set_caption("Keyboard Demo")
    font1 = pygame.font.Font(None, 24)
    font2 = pygame.font.Font(None, 200)
    white = 255,255,255
    yellow = 255,255,0
    color = 125,100,210

    key_flag = False
    correct_answer = 97
    seconds = 10
    score = 0
    clock_start = 0
    game_over = True

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    pygame.quit()
    sys.exit()
    elif event.type == KEYDOWN:
    key_flag = True
    elif event.type == KEYUP:
    key_flag = False

    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
    sys.exit()

    if keys[K_RETURN]:
    if game_over:
    game_over = False
    score = 0
    seconds = 11
    clock_start = time.clock()

    current = time.clock() - clock_start
    speed = score * 6
    if seconds-current < 0:
    game_over = True
    elif current <= 10:
    if keys[correct_answer]:
    correct_answer = random.randint(97,122)
    score += 1


    #清屏
    screen.fill(color)

    print_text(font1, 0, 20, "Try to keep up for 10 seconds...")

    if key_flag:
    print_text(font1, 450, 0, "you are keying...")

    if not game_over:
    print_text(font1, 0, 80, "Time: " + str(int(seconds-current)))

    print_text(font1, 0, 100, "Speed: " + str(speed) + " letters/min")

    if game_over:
    print_text(font1, 0, 160, "Press Enter to start...")

    print_text(font2, 0, 240, chr(correct_answer-32), yellow)


    #更新
    pygame.display.update()
    在这个程序中,我们使用到了一些新的模块和函数,让我们来了解一下。

    Random.randint(x,y);看名字知道这个函数的作用了,它可以返回一个x~y之间的随机数。

    另外一个模块是time。time.clock()函数会返回从程序启动到现在为止的时间。

    2.轮询鼠标

    同样,我们可以使用类似的方法去轮询鼠标事件。

    这里有3个相关的函数:

    (1)pygame.mouse.get_pos(),这个函数会返回鼠标当前的坐标x,y;

    (2)pygame.mouse.get_rel();

    rel_x ,rel_y = pygame.mouse.get_rel().利用这个函数可以读取鼠标的相对移动。

    (3)btn_one,btn_two,btn_three = pygame.mouse.get_pressed();

    利用这个函数,可以获取鼠标按钮的状态。比如当左键按下的时候btn_one 的值会被赋值为1,鼠标按键弹起是会被赋值为0。

    同样我们可以设计一个小案例来熟悉一下鼠标轮询,比如当鼠标按下的时候 打印鼠标按的是左键还是右键,鼠标点击的位置,鼠标当前的坐标等等。这里就不给出实现代码了,感兴趣的可以自己实现一下。

     
    --------------------- 

  • 相关阅读:
    [LeetCode] Reverse Linked List II
    [LeetCode] Reverse Linked List
    [LeetCode] Palindrome Linked List
    人工智能之一《tensorflow》
    计算机视觉之《OpenCV开发环境搭建》
    Android Automotive开发之一《编译自己的SDK 》 // TOBEDONE
    Android Automotive开发之一《环境: JDK7&JDK8切换 》
    Android Auto开发之一《开始学习Auto 》
    网络安全之证书、密钥、密钥库等名词解释
    Android开发笔记之《特斯拉-Tesla 代码分析》
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10983028.html
Copyright © 2011-2022 走看看