我应该在哪里实现碰撞检查方法?

2024-09-27 17:54:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pygame中制作了一个口袋妖怪的翻版,我已经制作了一个测试玩家是否在高草中的方法。但是,我不知道应该在哪里调用该方法。我试过玩家移动法、游戏循环法和更新法。当我这样做时,它会在你离开草地后检查,这意味着你第一次进入草地时它不会工作,而当你第一次离开草地时它会工作(当它不应该)

in_grass(self)方法:

def in_grass(self):
        for g in self.game.grass:
            if pygame.sprite.collide_rect(self, g):
                print(random.randint(1, 10000))
                if random.randint(1, 180) <= 25:
                    self.battle()

播放器move(self)方法:

def move(self, x_change, y_change):
        if x_change > 0:
            self.dir = 'RIGHT'
        if x_change < 0:
            self.dir = 'LEFT'
        if y_change > 0:
            self.dir = 'DOWN'
        if y_change < 0:
            self.dir = 'UP'

        if not self.collide(x_change, y_change):
            self.x += x_change
            self.y += y_change

            image_list = None
            if self.dir == 'UP':
                image_list = self.image_up
            elif self.dir == 'LEFT':
                image_list = self.image_left
            elif self.dir == 'RIGHT':
                image_list = self.image_right
            elif self.dir == 'DOWN':
                image_list = self.image_down

            if image_list:
                if self.walkcount >= len(image_list):
                    self.walkcount = 0
                self.image = image_list[self.walkcount]
                self.walkcount += 1
                self.image.set_colorkey(BLACK)

主回路:

 def events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    self.player.move(0, -1)
                if event.key == pygame.K_a:
                    self.player.move(-1, 0)
                if event.key == pygame.K_s:
                    self.player.move(0, 1)
                if event.key == pygame.K_d:
                    self.player.move(1, 0)

            if event.type == pygame.KEYUP:
                self.player.image = self.player.default_images[self.player.dir]
                self.player.image.set_colorkey(BLACK)

编辑:我终于让它工作了!我不能给我自己赏金,所以我想它只能坐在那里


Tags: 方法keyinimageselfeventmoveif
2条回答

在播放器的__init__方法调用self.checked = False中创建一个布尔值。然后,在in_grass方法的末尾,设置self.checked = True。在update方法中,if not self.checked: self.in_grass。最后,在move方法中,从一开始就设置self.checked = False 我终于成功了,耶

这里有一些值得思考的东西

小免责声明, 我不是一个游戏开发者,也不是一个经验丰富的开发者

在一个更大的游戏中,你可能想要很好地掌握在哪里发生的事情。现在假设我们有一个充满实体的游戏(把实体想象成你在屏幕上看到的对游戏有某种影响的东西)。我们想在游戏循环的每一帧更新所有这些实体

实体可能会被渲染、移动、碰撞检查、受玩家输入的影响、动画或游戏需要的任何功能。 假设我们有一个实体列表,那么这样做的顺序对我们的游戏很重要

entities = []

然后我们可以做类似的事情,在游戏中循环每个敌人,执行他们的行为功能。我们将所有实体传递到check_collision函数中,以使代码更易于理解

版本1

entities = []
def game_loop:
    while(true):
        for entity in entities:
            entity.gather_input()
            entity.move()
            entity.check_collision(entities)
            entity.animate()
            entity.render()

现在看一下这个:

版本2

entities = []
def game_loop:
    while(true):
        for entity in entities:
            entity.gather_input()
        for entity in entities:
            entity.move()
        for entity in entities:
            entity.check_collision(entities)
        for entity in entities:
            entity.animate()
        for entity in entities:
            entity.render()

我们执行实体的顺序及其行为发生了变化。我们现在有了分组行为,可以说我们已经定义了gameloop的更新方式。我们现在知道,在检查实体的所有碰撞之前,实体的所有移动都已更新

而在版本1中,我们首先对1个实体执行所有逻辑,然后再执行下一个。使用版本1时,我们可能会在单个帧中丢失相关数据,因为1个实体可能会移动并检查碰撞,它实际上应该等到所有实体都移动了

希望这能激发更多关于兔子洞(即游戏设计/架构)的研究

相关问题 更多 >

    热门问题