当前位置: 首页 > 知识库问答 >
问题:

二人博弈的关键映射问题

倪灿
2023-03-14

我正在制作一个2人迷宫跑者游戏,我遇到了一些键盘事件的麻烦。如果两个玩家同时击中一个键,只有玩家1移动,因为我的代码首先测试的是Player1的事件。在python和pygame中是否有一种方法可以同时检查这两个事件?下面是我的player1课的一部分:

class Player( pygame.sprite.Sprite ):
    def __init__( self ):
        super( Player, self ).__init__()
        self.size = self.w,self.h = 75,75
        self.image = pygame.Surface( ( self.size ) )
        self.image.fill( white )
        self.rect = self.image.get_rect()

        self.move_y = 0
        self.move_x = 0

        self.speed = 5

        self.player = True
        self.alive = True

        self.level = None



    def update( self, collidable = pygame.sprite.Group(), event = None ):

        self.rect.x += self.move_x
        self.rect.y += self.move_y

        if not ( event == None ):
            if ( event.type == pygame.KEYDOWN ):
                if ( event.key == pygame.K_LEFT ):
                    self.move_y = 0
                    self.move_x = -self.speed
                if ( event.key == pygame.K_RIGHT ):
                    self.move_y = 0
                    self.move_x = self.speed
                if ( event.key == pygame.K_UP ):
                    self.move_x = 0
                    self.move_y = -self.speed
                if ( event.key == pygame.K_DOWN ):
                    self.move_x = 0
                    self.move_y = self.speed

很抱歉出现了代码块,但这对您理解它是如何工作的都是必要的。我为Player2提供了一个几乎相同的类,但使用了不同的键盘控制(WASD而不是箭头键)。

定义了player1和player2类:

player_object_list = pygame.sprite.Group()

p1 = Player()
p1.set_position( 40, 725 )
p1.set_image(deadpool_icon)

p2 = Player2()
p2.set_position( 525, 725 )
p2.set_image(girl_bow)

然后我更新并绘制它们:

 p1.update( current_level.object_list, event )
 p2.update( current_level.object_list, event )
 event = None

 player_object_list.draw( window )

总结一下:使用这段代码,键盘控制的移动运行良好,但它不会同时检查两个玩家的键盘事件,因此如果两个玩家同时按下一个键,只有player1检测到该事件,因为它在Player2之前更新:

 p1.update( current_level.object_list, event )
 p2.update( current_level.object_list, event )

共有1个答案

荆运诚
2023-03-14

记住我上面的评论,让我们尝试一下解决方案。首先,我想让您的代码更通用一点,也许更容易理解:使用一个查找表来进行移动翻译。

move_translate = {
    pygame.K_LEFT: (-1, 0),
    pygame.K_RIGHT: (1, 0),
    pygame.K_UP: (0, -1),
    pygame.K_DOWN: (0, 1)
}

if event is not None:
    if event.type == pygame.KEYDOWN:
        if event.key in move_translate:
            # dictionary.get() will improve this, 
            #    if you want to advance that far in Python syntax
            self.move_x, self.move_y = move_translate[event.key]
            self.move_x *= self.speed
            self.move_y *= self.speed

    # Here, you have to retire the event you just processed.
    # Then pass out of the first check for no event.
    # Check for another in the event queue, for player 2.
    # After this check, you can update the display.

这会让你走向一个解决方案吗?根据您使用的队列和交互,您可能能够将事件检查放入一个循环中,该循环处理这个时间刻度的所有事件。

 类似资料:
  • 我试图测试自己理解递归的能力,所以我给自己一个任务,在递归中做跳跃游戏练习 给定一个非负整数数组,您最初位于数组的第一个索引处。数组中的每个元素代表该位置的最大跳转长度。你的目标是在最小的跳跃次数内达到最后一个指数。 https://leetcode.com/problems/jump-game-ii/ 我试图修改这部分代码,但它没有出现在调试器上,因此我没有真正看到这部分代码中的问题 如果有人能

  • 在这个程序中,用户必须想出一个数字,然后让计算机来猜。 2.我试过这个程序,但电脑的猜测很奇怪。计算机不会根据我的指南猜出一个数字。

  • 我试图在我的应用程序中有一个无限滚动的部分。为了实现这一点,我使用这个组件来处理滚动事件等等。当滚动到达div的底部时,我调用一个函数来获取更多数据。到现在为止,一直都还不错。 为了使这个函数更有效,我试图在调用之前等待几秒钟,并确保数据得到正确处理。为此,我一直在查看Angular网站上展示的维基百科搜索示例。 我有一个类似于本文所示的设置,我的问题是调用时出现以下错误:

  • 问题内容: 欢迎, Hibernate映射存在一些问题。 数据库结构: POJO结构: 我想拥有的是TableC Pojo映射中TableB元素的集合,映射键是tableA。 该集合应该是只读的。 映射应为hbm而非注释。 我可能已经以各种可能的方式完成了此操作…我遇到的关闭情况是,当我对一个TableC对象进行操作时,一切都是正确的,但是如果我加载它们的集合,则只有最后一个具有正确的集合集。 更

  • 我 们已经映射了一个持久化实体类到表上。让我们在这个基础上增加一些类之间的关联。首先我们往应用程序里增加人(people)的概念,并存储他们所参与的 一个 Event 列表。(译者注:与 Event 一样,我们在后面将直接使用 person 来表示“人”而不是它的中文翻译) 1.2.1. 映射 Person 类 最初简单的 Person 类: package org.hibernate.tutor

  • 想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 我所拥有的是, 我想要的是, 其中,