我在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)
编辑:我终于让它工作了!我不能给我自己赏金,所以我想它只能坐在那里
在播放器的
__init__
方法调用self.checked = False
中创建一个布尔值。然后,在in_grass
方法的末尾,设置self.checked = True
。在update
方法中,if not self.checked: self.in_grass
。最后,在move
方法中,从一开始就设置self.checked = False
我终于成功了,耶这里有一些值得思考的东西
小免责声明, 我不是一个游戏开发者,也不是一个经验丰富的开发者
在一个更大的游戏中,你可能想要很好地掌握在哪里发生的事情。现在假设我们有一个充满实体的游戏(把实体想象成你在屏幕上看到的对游戏有某种影响的东西)。我们想在游戏循环的每一帧更新所有这些实体
实体可能会被渲染、移动、碰撞检查、受玩家输入的影响、动画或游戏需要的任何功能。 假设我们有一个实体列表,那么这样做的顺序对我们的游戏很重要
然后我们可以做类似的事情,在游戏中循环每个敌人,执行他们的行为功能。我们将所有实体传递到check_collision函数中,以使代码更易于理解
版本1
现在看一下这个:
版本2
我们执行实体的顺序及其行为发生了变化。我们现在有了分组行为,可以说我们已经定义了gameloop的更新方式。我们现在知道,在检查实体的所有碰撞之前,实体的所有移动都已更新
而在版本1中,我们首先对1个实体执行所有逻辑,然后再执行下一个。使用版本1时,我们可能会在单个帧中丢失相关数据,因为1个实体可能会移动并检查碰撞,它实际上应该等到所有实体都移动了
希望这能激发更多关于兔子洞(即游戏设计/架构)的研究
相关问题 更多 >
编程相关推荐