我已经开始使用街机模块和使用平铺地图编辑器创建的地图创建一个简单的开放世界游戏。我已经有点先进了,但我遇到了问题。我在互联网上到处找,但找不到任何东西......这是我的问题:角色用箭头键移动,地图地面分为两类:草地和路径(暂时),以及角色检测他所在的地面,如果他在一条路径上,他的移动速度会加倍。但事实证明,如果你在小路上进入草地,一旦进入草地,你的速度就不会改变。换句话说,在您松开按键并再次按下之前,角色不会检测到地面。如果你能帮助我,那就太好了!我已经在 https://openclassrooms.com/forum/sujet/probleme-de-detection-de-collision-c00dc#message-94985889 上问过这个问题,但没有人找到解决方案...
import arcade
class MyGame(arcade.Window):
def __init__(self):
###
def setup(self):
###
def on_draw(self):
###
def on_key_press(self, key, modifiers):
if key == arcade.key.UP:
self.player_sprite.change_y = self.speed
self.player_sprite.change_x = 0
self.player_sprite.texture = arcade.load_texture(self.texture_paths["up"])
if key == arcade.key.DOWN:
self.player_sprite.change_x = 0
self.player_sprite.change_y = -self.speed
self.player_sprite.texture = arcade.load_texture(self.texture_paths["down"])
if key == arcade.key.LEFT:
self.player_sprite.change_y = 0
self.player_sprite.change_x = -self.speed
self.player_sprite.texture = arcade.load_texture(self.texture_paths["left"])
if key == arcade.key.RIGHT:
self.player_sprite.change_y = 0
self.player_sprite.change_x = self.speed
self.player_sprite.texture = arcade.load_texture(self.texture_paths["right"])
def on_key_release(self, key, modifiers):
if key == arcade.key.UPorkey == arcade.key.DOWN:
self.player_sprite.change_y = 0
if key == arcade.key.LEFTorkey == arcade.key.RIGHT:
self.player_sprite.change_x = 0
def center_camera_to_player(self):
###
def update(self, deltatime):
ways_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.scene[LAYER_NAME_WAYS])
if ways_hit_list:
self.speed = 2
else:
self.speed = 1
###
def main():
window = MyGame()
window.setup()
arcade.run()
if __name__ == "__main__":
main()
我做了一些测试,我发现了一些事情:速度确实会根据角色所在的地面而变化。问题是,当我按下一个键来移动时,在释放该键之前考虑的整个移动的速度是按下该键时记录的速度...我尝试将该功能移动到不同的地方并创建一个新函数来调用速度检测,但没有任何效果......
您需要在每次迭代时重新计算玩家速度(不仅仅是在移动开始时)。简单示例(绿色背景为低速,红色为高速):
代码:
import arcade
class Game(arcade.Window):
def __init__(self):
super().__init__()
self.player_sprite = arcade.Sprite(':resources:images/animated_characters/male_person/malePerson_idle.png', center_x=100, center_y=300)
self.left_pressed = False
self.right_pressed = False
self.up_pressed = False
self.down_pressed = False
def on_draw(self):
self.clear()
arcade.draw_rectangle_filled(200, 300, 400, 600, arcade.color.GREEN)
arcade.draw_rectangle_filled(600, 300, 400, 600, arcade.color.RED)
self.player_sprite.draw()
def update_player_speed(self):
# Calculate speed based on the keys pressed
self.player_sprite.change_x = 0
self.player_sprite.change_y = 0
if self.player_sprite.center_x < 400:
speed = 5
else:
speed = 10
if self.up_pressed and not self.down_pressed:
self.player_sprite.change_y = speed
elif self.down_pressed and not self.up_pressed:
self.player_sprite.change_y = -speed
if self.left_pressed and not self.right_pressed:
self.player_sprite.change_x = -speed
elif self.right_pressed and not self.left_pressed:
self.player_sprite.change_x = speed
def on_key_press(self, key, modifiers):
"""Called whenever a key is pressed. """
if key == arcade.key.UP:
self.up_pressed = True
self.update_player_speed()
elif key == arcade.key.DOWN:
self.down_pressed = True
self.update_player_speed()
elif key == arcade.key.LEFT:
self.left_pressed = True
self.update_player_speed()
elif key == arcade.key.RIGHT:
self.right_pressed = True
self.update_player_speed()
def on_key_release(self, key, modifiers):
"""Called when the user releases a key. """
if key == arcade.key.UP:
self.up_pressed = False
self.update_player_speed()
elif key == arcade.key.DOWN:
self.down_pressed = False
self.update_player_speed()
elif key == arcade.key.LEFT:
self.left_pressed = False
self.update_player_speed()
elif key == arcade.key.RIGHT:
self.right_pressed = False
self.update_player_speed()
def update(self, deltatime):
self.player_sprite.update()
self.update_player_speed()
Game()
arcade.run()