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。

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

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

  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/hyhy904/p/10983028.html
Copyright © 2011-2022 走看看