驴友花雕 发表于 2025-9-24 15:47:39

【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃



Kitronik ARCADE 是一款由英国教育科技公司 Kitronik 精心打造的可编程游戏机开发板,专为编程教学与创客实践而设计。该设备原生支持微软的 MakeCode Arcade 平台,用户可通过图形化或 JavaScript 编程方式,轻松创建、下载并运行复古风格的街机游戏。

它集成了彩色 LCD 显示屏、方向控制键、功能按键、蜂鸣器和震动马达等交互组件,提供完整的游戏输入输出体验。无论是初学者进行编程启蒙,还是创客群体开发交互式作品,Kitronik ARCADE 都能作为理想的硬件载体,助力创意实现。

凭借其开源友好、易于上手、兼容性强等特点,该开发板广泛应用于中小学编程课程、创客工作坊、游戏开发教学以及个人项目原型设计,深受教育者与技术爱好者的喜爱。



驴友花雕 发表于 2025-9-24 15:49:28

【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃

作为学习、练习与尝试,这里创建一个平台跳跃的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:平台跳跃

MicroPython实验代码

class ActionKind(Enum):
    RunningLeft = 0
    RunningRight = 1
    Idle = 2
    IdleLeft = 3
    IdleRight = 4
    JumpingLeft = 5
    JumpingRight = 6
    CrouchLeft = 7
    CrouchRight = 8
    Flying = 9
    Walking = 10
    Jumping = 11
@namespace
class SpriteKind:
    Bumper = SpriteKind.create()
    Goal = SpriteKind.create()
    Coin = SpriteKind.create()
    Flier = SpriteKind.create()

def on_on_overlap(sprite, otherSprite):
    if sprite.vy > 0 and not (sprite.is_hitting_tile(CollisionDirection.BOTTOM)) or sprite.y < otherSprite.top:
      otherSprite.destroy(effects.ashes, 250)
      otherSprite.vy = -50
      sprite.vy = -2 * pixelsToMeters
      info.change_score_by(1)
      music.power_up.play()
    else:
      info.change_life_by(-1)
      sprite.say("Ow!", invincibilityPeriod)
      music.power_down.play()
    pause(invincibilityPeriod)
sprites.on_overlap(SpriteKind.player, SpriteKind.Bumper, on_on_overlap)

def initializeAnimations():
    initializeHeroAnimations()
    initializeCoinAnimation()
    initializeFlierAnimations()
def giveIntroduction():
    game.set_dialog_frame(img("""
      . 2 2 2 2 2 2 2 2 2 2 2 2 2 . .
      2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 .
      2 1 1 2 2 2 2 2 2 2 2 2 1 1 2 .
      2 1 2 2 1 1 1 1 1 1 1 2 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 1 1 1 1 1 1 1 1 1 2 1 2 .
      2 1 2 2 1 1 1 1 1 1 1 2 2 1 2 .
      2 1 1 2 2 2 2 2 2 2 2 2 1 1 2 .
      2 2 1 1 1 1 1 1 1 1 1 1 1 2 2 .
      . 2 2 2 2 2 2 2 2 2 2 2 2 2 . .
      . . . . . . . . . . . . . . . .
      """))
    game.set_dialog_cursor(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f . . . . . .
      . . . . f f 5 5 5 5 f f . . . .
      . . . . f 5 5 5 5 5 5 f . . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . . f 5 5 5 5 5 5 f . . . .
      . . . . f f 5 5 5 5 f f . . . .
      . . . . . . f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    showInstruction("Move with the left and right buttons.")
    showInstruction("Jump with the up or A button.")
    showInstruction("Double jump by pressing jump again.")
def initializeCoinAnimation():
    global coinAnimation
    coinAnimation = animation.create_animation(ActionKind.Walking, 200)
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f . . . . . .
      . . . . f f 5 5 5 5 f f . . . .
      . . . . f 5 5 5 5 5 5 f . . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . f 5 5 5 4 4 5 5 5 f . . .
      . . . . f 5 5 5 5 5 5 f . . . .
      . . . . f f 5 5 5 5 f f . . . .
      . . . . . . f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . f f f f f f . . . . . .
      . . . f f 5 f 5 5 5 f . . . . .
      . . . f 5 f 5 5 5 5 5 f . . . .
      . . f 5 f 5 5 5 4 5 5 f . . . .
      . . f 5 f 5 5 5 4 4 5 5 f . . .
      . . f 5 f 5 5 5 4 4 5 5 f . . .
      . . f 5 f 5 5 5 4 5 5 f . . . .
      . . . f 5 f 5 5 5 5 5 f . . . .
      . . . . f 5 f 5 5 5 f . . . . .
      . . . . f f f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . f f f f f . . . . . .
      . . . . f f 5 f 5 f f . . . . .
      . . . f f 5 f 5 5 5 f . . . . .
      . . . f 5 f 5 5 5 5 f f . . . .
      . . . f 5 f 5 5 4 5 5 f . . . .
      . . . f 5 f 5 5 4 5 5 f . . . .
      . . . f 5 f 5 5 5 5 f f . . . .
      . . . f f 5 f 5 5 5 f . . . . .
      . . . . f f 5 f 5 f f . . . . .
      . . . . . f f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f . . . . . .
      . . . . . f f f f f . . . . . .
      . . . . . f 5 f 5 f f . . . . .
      . . . . . f 5 f 5 5 f . . . . .
      . . . . . f 5 f 5 5 f . . . . .
      . . . . . f 5 f 5 5 f . . . . .
      . . . . . f 5 f 5 5 f . . . . .
      . . . . . f 5 f 5 f f . . . . .
      . . . . . f f f f f . . . . . .
      . . . . . . f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f . . . . . .
      . . . . . . f f f f f . . . . .
      . . . . . f f 5 f 5 f . . . . .
      . . . . . f 5 5 f 5 f . . . . .
      . . . . . f 5 5 f 5 f . . . . .
      . . . . . f 5 5 f 5 f . . . . .
      . . . . . f 5 5 f 5 f . . . . .
      . . . . . f f 5 f 5 f . . . . .
      . . . . . . f f f f f . . . . .
      . . . . . . f f f f . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f . . . . .
      . . . . . f f 5 f 5 f f . . . .
      . . . . . f 5 5 5 f 5 f f . . .
      . . . . f f 5 5 5 5 f 5 f . . .
      . . . . f 5 5 4 5 5 f 5 f . . .
      . . . . f 5 5 4 5 5 f 5 f . . .
      . . . . f f 5 5 5 5 f 5 f . . .
      . . . . . f 5 5 5 f 5 f f . . .
      . . . . . f f 5 f 5 f f . . . .
      . . . . . . f f f f f . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    coinAnimation.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f f . . . .
      . . . . . f 5 5 5 f 5 f f . . .
      . . . . f 5 5 5 5 5 f 5 f . . .
      . . . . f 5 5 4 5 5 5 f 5 f . .
      . . . f 5 5 4 4 5 5 5 f 5 f . .
      . . . f 5 5 4 4 5 5 5 f 5 f . .
      . . . . f 5 5 4 5 5 5 f 5 f . .
      . . . . f 5 5 5 5 5 f 5 f . . .
      . . . . . f 5 5 5 f 5 f . . . .
      . . . . . . f f f f f f . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))

def on_on_overlap2(sprite2, otherSprite2):
    otherSprite2.destroy(effects.trail, 250)
    otherSprite2.y += -3
    info.change_score_by(3)
    music.ba_ding.play()
sprites.on_overlap(SpriteKind.player, SpriteKind.Coin, on_on_overlap2)

def attemptJump():
    global doubleJumpSpeed, canDoubleJump
    # else if: either fell off a ledge, or double jumping
    if hero.is_hitting_tile(CollisionDirection.BOTTOM):
      hero.vy = -4 * pixelsToMeters
    elif canDoubleJump:
      doubleJumpSpeed = -3 * pixelsToMeters
      # Good double jump
      if hero.vy >= -40:
            doubleJumpSpeed = -4.5 * pixelsToMeters
            hero.start_effect(effects.trail, 500)
            scene.camera_shake(2, 250)
      hero.vy = doubleJumpSpeed
      canDoubleJump = False

def on_up_pressed():
    attemptJump()
controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)

def animateIdle():
    global mainIdleLeft, mainIdleRight
    mainIdleLeft = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainIdleLeft)
    mainIdleLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d d d d d d d d d e e d f .
      . f d d f d d d d f d d e d f .
      . f d d f d d d d f d d d e f .
      . f d d f d d d d f d d d f . .
      . f d d d d d d d d d d d f . .
      . f a c c c c c c c c a b f . .
      . f d d c c c c c c d d d f . .
      . f d f f f b b f f f d d f . .
      . . f a a a a a a a a a b f . .
      . . . f a a b f f a a b f . . .
      . . . f a a b f f a a b f . . .
      . . . . f f f . . f f f . . . .
      """))
    mainIdleRight = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainIdleRight)
    mainIdleRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d e e d d d d d d d d d f .
      . f d e d d f d d d d f d d f .
      . f e d d d f d d d d f d d f .
      . . f d d d f d d d d f d d f .
      . . f d d d d d d d d d d d f .
      . . f b a c c c c c c c c a f .
      . . f d d d c c c c c c d d f .
      . . f d d f f f b b f f f d f .
      . . f b a a a a a a a a a f . .
      . . . f b a a f f b a a f . . .
      . . . f b a a f f b a a f . . .
      . . . . f f f . . f f f . . . .
      """))

def on_down_pressed():
    if not (hero.is_hitting_tile(CollisionDirection.BOTTOM)):
      hero.vy += 80
controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)

def setLevelTileMap(level: number):
    clearGame()
    if level == 0:
      tiles.set_tilemap(tilemap("""
            level
            """))
    elif level == 1:
      tiles.set_tilemap(tilemap("""
            level_0
            """))
    elif level == 2:
      tiles.set_tilemap(tilemap("""
            level_1
            """))
    elif level == 3:
      tiles.set_tilemap(tilemap("""
            level_2
            """))
    elif level == 4:
      tiles.set_tilemap(tilemap("""
            level_3
            """))
    elif level == 5:
      tiles.set_tilemap(tilemap("""
            level_4
            """))
    elif level == 6:
      tiles.set_tilemap(tilemap("""
            level_5
            """))
    elif level == 7:
      tiles.set_tilemap(tilemap("""
            level_6
            """))
    initializeLevel(level)
def initializeFlierAnimations():
    global flierFlying, flierIdle
    flierFlying = animation.create_animation(ActionKind.Walking, 100)
    flierFlying.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . f f f f f f f . . . .
      . . . . f 4 4 4 4 4 4 4 f . . .
      . . . f 4 5 5 4 4 4 5 5 4 f . .
      . f . f 4 4 4 5 4 5 4 4 4 f . f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . . . f 4 4 5 5 5 5 5 4 4 f . .
      . . . . f 4 5 4 4 4 5 4 f . . .
      . . . . . f f f f f f f . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    flierFlying.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . f f f f f f f . . . .
      . . . . f 4 4 4 4 4 4 4 f . . .
      . . . f 4 5 5 4 4 4 5 5 4 f . .
      . . . f 4 4 4 5 4 5 4 4 4 f . .
      . . f 4 4 4 4 4 4 4 4 4 4 4 f .
      . . f 4 4 4 4 5 4 5 4 4 4 4 f .
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f 4 4 4 4 4 4 4 4 4 4 4 4 4 f
      . f 4 f 4 4 5 5 5 5 5 4 4 f 4 f
      . f f . f 4 5 4 4 4 5 4 f . f f
      . f . . . f f f f f f f . . . f
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    flierFlying.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . f f f f f f f . . . .
      . . . . f 4 4 4 4 4 4 4 f . . .
      . . . f 4 5 5 4 4 4 5 5 4 f . .
      . f . f 4 4 4 5 4 5 4 4 4 f . f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . . . f 4 4 5 5 5 5 5 4 4 f . .
      . . . . f 4 5 4 4 4 5 4 f . . .
      . . . . . f f f f f f f . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
    flierIdle = animation.create_animation(ActionKind.Walking, 100)
    flierIdle.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . f f f f f f f . . . .
      . . . . f 4 4 4 4 4 4 4 f . . .
      . . . f 4 5 5 4 4 4 5 5 4 f . .
      . f . f 4 4 4 5 4 5 4 4 4 f . f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
      . f f 4 4 4 4 4 4 4 4 4 4 4 f f
      . . . f 4 4 5 5 5 5 5 4 4 f . .
      . . . . f 4 5 4 4 4 5 4 f . . .
      . . . . . f f f f f f f . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """))
def animateRun():
    global mainRunLeft, mainRunRight
    mainRunLeft = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainRunLeft)
    mainRunLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f . . . . . .
      . . f e e e e e e e f . . . . .
      . f e e e e e e e e e f . . . .
      . f d d d d e d d e e f . . . .
      . f d d f d d e d e e f . . . .
      . f d d f d d d e e e f . . . .
      . f d d f d d d d d d f . . . .
      . f d d d d d d d d d f . . . .
      . . f c c c a a c c b f . . . .
      . . f c c d d d c c b f . . . .
      . . f b f f d d f f f f . . . .
      . . f a a a a a a a b f . . . .
      . . . f a a a a b f f . . . . .
      . . . f a a a a b f . . . . . .
      . . . . f f f f f . . . . . . .
      """))
    mainRunLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f . . . . . .
      . . f e e e e e e e f . . . . .
      . f e e e e e e e e e f . . . .
      . f d d d d e d d e e f . . . .
      . f d d f d d e d e e f . . . .
      . f d d f d d d e e e f . . . .
      . f d d f d d d d d d f . . . .
      . f d d d d d d d d d f . . . .
      . . f c c c c a a c b f . . . .
      . . f c c c c d d c b f . . . .
      . . f b f f d d d f f f f . . .
      . . f a a a a a a a a b f f . .
      . . . f a a b f f a a a f f . .
      . . . . f f f . f f f f f . . .
      """))
    mainRunLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f . . . . . .
      . . f e e e e e e e f . . . . .
      . f e e e e e e e e e f . . . .
      . f d d d d e d d e e f . . . .
      . f d d f d d e d e e f . . . .
      . f d d f d d d e e e f . . . .
      . f d d f d d d d d d f . . . .
      . f d d d d d d d d d f . . . .
      . . f c c c a a c c b f . . . .
      . . f c c d d d c c b f . . . .
      . . f b f f d d f f f f . . . .
      . . f a a a a a a a b f . . . .
      . . . f a a a a b f f . . . . .
      . . . f a a a a b f . . . . . .
      . . . . f f f f f . . . . . . .
      """))
    mainRunLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f . . . . . .
      . . f e e e e e e e f . . . . .
      . f e e e e e e e e e f . . . .
      . f d d d d e d d e e f . . . .
      . f d d f d d e d e e f . . . .
      . f d d f d d d e e e f . . . .
      . f d d f d d d d d d f . . . .
      . f d d d d d d d d d f . . . .
      . . f c a a c c c c b f . . . .
      . f d d d b c c c c b f . . . .
      f f f d d f f f f f f f . . . .
      f f f a a a a a a a b f . . . .
      . f a a b f a a b f f . . . . .
      . f f f f . f f f . . . . . . .
      """))
    mainRunRight = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainRunRight)
    mainRunRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f f f . . .
      . . . . . f e e e e e e e f . .
      . . . . f e e e e e e e e e f .
      . . . . f e e d d e d d d d f .
      . . . . f e e d e d d f d d f .
      . . . . f e e e d d d f d d f .
      . . . . f d d d d d d f d d f .
      . . . . f d d d d d d d d d f .
      . . . . f b c c a a c c c f . .
      . . . . f b c c d d d c c f . .
      . . . . f f f f d d f f b f . .
      . . . . f b a a a a a a a f . .
      . . . . . f f b a a a a f . . .
      . . . . . . f b a a a a f . . .
      . . . . . . . f f f f f . . . .
      """))
    mainRunRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f f f . . .
      . . . . . f e e e e e e e f . .
      . . . . f e e e e e e e e e f .
      . . . . f e e d d e d d d d f .
      . . . . f e e d e d d f d d f .
      . . . . f e e e d d d f d d f .
      . . . . f d d d d d d f d d f .
      . . . . f d d d d d d d d d f .
      . . . . f b c a a c c c c f . .
      . . . . f b c d d c c c c f . .
      . . . f f f f d d d f f b f . .
      . . f f b a a a a a a a a f . .
      . . f f a a a f f b a a f . . .
      . . . f f f f . . f f f . . . .
      """))
    mainRunRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f f f . . .
      . . . . . f e e e e e e e f . .
      . . . . f e e e e e e e e e f .
      . . . . f e e d d e d d d d f .
      . . . . f e e d e d d f d d f .
      . . . . f e e e d d d f d d f .
      . . . . f d d d d d d f d d f .
      . . . . f d d d d d d d d d f .
      . . . . f b c c a a c c c f . .
      . . . . f b c c d d d c c f . .
      . . . . f f f f d d f f b f . .
      . . . . f b a a a a a a a f . .
      . . . . . f f b a a a a f . . .
      . . . . . . f b a a a a f . . .
      . . . . . . . f f f f f . . . .
      """))
    mainRunRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . f f f f f f f . . .
      . . . . . f e e e e e e e f . .
      . . . . f e e e e e e e e e f .
      . . . . f e e d d e d d d d f .
      . . . . f e e d e d d f d d f .
      . . . . f e e e d d d f d d f .
      . . . . f d d d d d d f d d f .
      . . . . f d d d d d d d d d f .
      . . . . f b c c c c a a c f . .
      . . . . f b c c c c b d d d f .
      . . . . f f f f f f f d d f f f
      . . . . f b a a a a a a a f f f
      . . . . . f f b a a f b a a f .
      . . . . . . . f f f . f f f . .
      """))

def on_a_pressed():
    attemptJump()
controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)

def animateJumps():
    global mainJumpLeft, mainJumpRight
    # Because there isn't currently an easy way to say "play this animation a single time
    # and stop at the end", this just adds a bunch of the same frame at the end to accomplish
    # the same behavior
    mainJumpLeft = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainJumpLeft)
    mainJumpLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d d d d d d d d d e e d f .
      . f d d f d d d d f d d e d f .
      . f d d f d d d d f d d d e f .
      . f d d f d d d d f d d d f . .
      . f d d d d d d d d d d d f . .
      . f a c c c c c c c c a b f . .
      . f d d c c c c c c d d d f . .
      . f d f f f b b f f f d d f . .
      . . f a a a a a a a a a b f . .
      . . . f a a b f f a a b f . . .
      . . . f a a b f f a a b f . . .
      . . . . f f f . . f f f . . . .
      """))
    mainJumpLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d d d d d d d d d e e d f .
      . f d d f d d d d f d d e d f .
      . f d d f d d d d f d d d e f .
      . f d d f d d d d f d d d f . .
      . f d d d d d d d d d d d f . .
      . f a c c c c c c c c a b f . .
      . f d d c c c c c c d d d f . .
      . f d f f f b b f f f d d f . .
      . . f a a a a a a a a a b f . .
      . . . f a a b f f a a b f . . .
      . . . . f f f . . f f f . . . .
      . . . . . . . . . . . . . . . .
      """))
    for index in range(30):
      mainJumpLeft.add_animation_frame(img("""
            . . . . . . . . . . . . . . . .
            . . . f f f f f f f f f f . . .
            . . f e e e e e e e e e e f . .
            . f e e e e e e e e e e e e f .
            . f d d d d d d d d d e e d f .
            . f d d f d d d d f d d e d f .
            . f d d f d d d d f d d d e f .
            . f d d f d d d d f d d d f . .
            . f d d d d d d d d d d d f f .
            . d a b c c c c c c c c b a d .
            . d a c c c c c c c c c c a d .
            . f f f f f b b f f f f f f f .
            . . f a a a a a a a a a b f . .
            . . . f a a b f f a a b f . . .
            . . . . f f f . . f f f . . . .
            . . . . . . . . . . . . . . . .
            """))
    mainJumpRight = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainJumpRight)
    mainJumpRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d e e d d d d d d d d d f .
      . f d e d d f d d d d f d d f .
      . f e d d d f d d d d f d d f .
      . . f d d d f d d d d f d d f .
      . . f d d d d d d d d d d d f .
      . . f b a c c c c c c c c a f .
      . . f d d d c c c c c c d d f .
      . . f d d f f f b b f f f d f .
      . . f b a a a a a a a a a f . .
      . . . f b a a f f b a a f . . .
      . . . f b a a f f b a a f . . .
      . . . . f f f . . f f f . . . .
      """))
    mainJumpRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d e e d d d d d d d d d f .
      . f d e d d f d d d d f d d f .
      . f e d d d f d d d d f d d f .
      . . f d d d f d d d d f d d f .
      . . f d d d d d d d d d d d f .
      . . f b a c c c c c c c c a f .
      . . f d d d c c c c c c d d f .
      . . f d d f f f b b f f f d f .
      . . f b a a a a a a a a a f . .
      . . . f b a a f f b a a f . . .
      . . . . f f f . . f f f . . . .
      . . . . . . . . . . . . . . . .
      """))
    for index2 in range(30):
      mainJumpRight.add_animation_frame(img("""
            . . . . . . . . . . . . . . . .
            . . . f f f f f f f f f f . . .
            . . f e e e e e e e e e e f . .
            . f e e e e e e e e e e e e f .
            . f d e e d d d d d d d d d f .
            . f d e d d f d d d d f d d f .
            . f e d d d f d d d d f d d f .
            . . f d d d f d d d d f d d f .
            . f f d d d d d d d d d d d f .
            . d a b c c c c c c c c b a d .
            . d a c c c c c c c c c c a d .
            . f f f f f f f b b f f f f f .
            . . f b a a a a a a a a a f . .
            . . . f b a a f f b a a f . . .
            . . . . f f f . . f f f . . . .
            . . . . . . . . . . . . . . . .
            """))
def animateCrouch():
    global mainCrouchLeft, mainCrouchRight
    mainCrouchLeft = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainCrouchLeft)
    mainCrouchLeft.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d d d d d d d d d e e d f .
      . f d d f d d d d f d d e d f .
      . f d d f d d d d f d d d e f .
      . f d d f d d d d f d d d f . .
      . f d d d d d d d d d d d f . .
      . f a c c c c c c c c a b f . .
      . f d c c c c c c c c c d d f .
      f d d f f f b b f f f f d d f .
      . f f a a a a a a a a a b f . .
      . . . f f f f . f f f f f . . .
      """))
    mainCrouchRight = animation.create_animation(ActionKind.Walking, 100)
    animation.attach_animation(hero, mainCrouchRight)
    mainCrouchRight.add_animation_frame(img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d e e d d d d d d d d d f .
      . f d e d d f d d d d f d d f .
      . f e d d d f d d d d f d d f .
      . . f d d d f d d d d f d d f .
      . . f d d d d d d d d d d d f .
      . . f b a c c c c c c c c a f .
      . f d d c c c c c c c c c d f .
      . f d d f f f f b b f f f d d f
      . . f b a a a a a a a a a f f .
      . . . f f f f f . f f f f . . .
      """))
def clearGame():
    for value in sprites.all_of_kind(SpriteKind.Bumper):
      value.destroy()
    for value2 in sprites.all_of_kind(SpriteKind.Coin):
      value2.destroy()
    for value3 in sprites.all_of_kind(SpriteKind.Goal):
      value3.destroy()
    for value4 in sprites.all_of_kind(SpriteKind.Flier):
      value4.destroy()

def on_overlap_tile(sprite3, location):
    global currentLevel
    info.change_life_by(1)
    currentLevel += 1
    if hasNextLevel():
      game.splash("Next level unlocked!")
      setLevelTileMap(currentLevel)
    else:
      game.over(True, effects.confetti)
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      tile1
      """),
    on_overlap_tile)

def on_on_overlap3(sprite4, otherSprite3):
    info.change_life_by(-1)
    sprite4.say("Ow!", invincibilityPeriod * 1.5)
    music.power_down.play()
    pause(invincibilityPeriod * 1.5)
sprites.on_overlap(SpriteKind.player, SpriteKind.Flier, on_on_overlap3)

def createEnemies():
    global bumper, flier
    # enemy that moves back and forth
    for value5 in tiles.get_tiles_by_type(assets.tile("""
      tile4
      """)):
      bumper = sprites.create(img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . f f f f f f . . . . . .
                . . . f 7 2 7 7 7 2 f . . . . .
                . . f 7 7 7 2 7 2 7 7 f . . . .
                . . f 7 7 7 7 7 7 7 7 7 f . . .
                . f 7 7 7 2 7 7 7 2 7 7 f . . .
                . f 7 7 7 2 7 7 7 2 7 7 7 f . .
                . f 7 7 7 7 7 7 7 7 7 7 7 7 f .
                . f 7 7 7 7 2 2 2 7 7 7 7 7 f .
                . . f 7 7 2 2 7 2 2 7 7 7 7 f .
                . . f 7 7 2 7 7 7 2 2 7 7 7 f .
                . . . f 7 7 7 7 7 7 7 7 7 7 f .
                . . . . f f 7 7 7 7 7 7 7 f . .
                . . . . . . f f f f f f f . . .
                . . . . . . . . . . . . . . . .
                """),
            SpriteKind.Bumper)
      tiles.place_on_tile(bumper, value5)
      tiles.set_tile_at(value5, assets.tile("""
            tile0
            """))
      bumper.ay = gravity
      if Math.percent_chance(50):
            bumper.vx = Math.random_range(30, 60)
      else:
            bumper.vx = Math.random_range(-60, -30)
    # enemy that flies at player
    for value6 in tiles.get_tiles_by_type(assets.tile("""
      tile7
      """)):
      flier = sprites.create(img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . f f f f f f f . . . .
                . . . . f 4 4 4 4 4 4 4 f . . .
                . . . f 4 5 5 4 4 4 5 5 4 f . .
                . f . f 4 4 4 5 4 5 4 4 4 f . f
                . f f 4 4 4 4 4 4 4 4 4 4 4 f f
                . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
                . f 4 4 4 4 4 5 4 5 4 4 4 4 4 f
                . f f 4 4 4 4 4 4 4 4 4 4 4 f f
                . . . f 4 4 5 5 5 5 5 4 4 f . .
                . . . . f 4 5 4 4 4 5 4 f . . .
                . . . . . f f f f f f f . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            SpriteKind.Flier)
      tiles.place_on_tile(flier, value6)
      tiles.set_tile_at(value6, assets.tile("""
            tile0
            """))
      animation.attach_animation(flier, flierFlying)
      animation.attach_animation(flier, flierIdle)
def showInstruction(text: str):
    game.show_long_text(text, DialogLayout.BOTTOM)
    music.ba_ding.play()
    info.change_score_by(1)
def initializeHeroAnimations():
    animateRun()
    animateIdle()
    animateCrouch()
    animateJumps()
def createPlayer(player2: Sprite):
    player2.ay = gravity
    scene.camera_follow_sprite(player2)
    controller.move_sprite(player2, 100, 0)
    player2.z = 5
    info.set_life(3)
    info.set_score(0)
def initializeLevel(level2: number):
    global playerStartLocation
    effects.clouds.start_screen_effect()
    playerStartLocation = tiles.get_tiles_by_type(assets.tile("""
      tile6
      """))
    tiles.place_on_tile(hero, playerStartLocation)
    tiles.set_tile_at(playerStartLocation, assets.tile("""
      tile0
      """))
    createEnemies()
    spawnGoals()
def hasNextLevel():
    return currentLevel != levelCount
def spawnGoals():
    global coin
    for value7 in tiles.get_tiles_by_type(assets.tile("""
      tile5
      """)):
      coin = sprites.create(img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . f f f f . . . . . .
                . . . . f f 5 5 5 5 f f . . . .
                . . . . f 5 5 5 5 5 5 f . . . .
                . . . f 5 5 5 4 4 5 5 5 f . . .
                . . . f 5 5 5 4 4 5 5 5 f . . .
                . . . f 5 5 5 4 4 5 5 5 f . . .
                . . . f 5 5 5 4 4 5 5 5 f . . .
                . . . . f 5 5 5 5 5 5 f . . . .
                . . . . f f 5 5 5 5 f f . . . .
                . . . . . . f f f f . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            SpriteKind.Coin)
      tiles.place_on_tile(coin, value7)
      animation.attach_animation(coin, coinAnimation)
      animation.set_action(coin, ActionKind.Walking)
      tiles.set_tile_at(value7, assets.tile("""
            tile0
            """))
heroFacingLeft = False
coin: Sprite = None
playerStartLocation: tiles.Location = None
flier: Sprite = None
bumper: Sprite = None
mainCrouchRight: animation.Animation = None
mainCrouchLeft: animation.Animation = None
mainJumpRight: animation.Animation = None
mainJumpLeft: animation.Animation = None
mainRunRight: animation.Animation = None
mainRunLeft: animation.Animation = None
flierIdle: animation.Animation = None
flierFlying: animation.Animation = None
mainIdleRight: animation.Animation = None
mainIdleLeft: animation.Animation = None
doubleJumpSpeed = 0
canDoubleJump = False
coinAnimation: animation.Animation = None
currentLevel = 0
levelCount = 0
gravity = 0
pixelsToMeters = 0
invincibilityPeriod = 0
hero: Sprite = None
hero = sprites.create(img("""
      . . . . . . . . . . . . . . . .
      . . . f f f f f f f f f f . . .
      . . f e e e e e e e e e e f . .
      . f e e e e e e e e e e e e f .
      . f d e e d d d d d d d d d f .
      . f d e d d f d d d d f d d f .
      . f e d d d f d d d d f d d f .
      . . f d d d f d d d d f d d f .
      . . f d d d d d d d d d d d f .
      . . f b a c c c c c c c c a f .
      . . f d d d c c c c c c d d f .
      . . f d d f f f b b f f f d f .
      . . f b a a a a a a a a a f . .
      . . . f b a a f f b a a f . . .
      . . . f b a a f f b a a f . . .
      . . . . f f f . . f f f . . . .
      """),
    SpriteKind.player)
# how long to pause between each contact with a
# single enemy
invincibilityPeriod = 600
pixelsToMeters = 30
gravity = 9.81 * pixelsToMeters
scene.set_background_image(img("""
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989998999899989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998999899989998999899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989898999898989998989899989998999899989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999989999999899999998999999999999999999999999999999
    8989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    """))
initializeAnimations()
createPlayer(hero)
levelCount = 8
currentLevel = 0
setLevelTileMap(currentLevel)
giveIntroduction()
# set up hero animations

def on_on_update():
    global heroFacingLeft
    if hero.vx < 0:
      heroFacingLeft = True
    elif hero.vx > 0:
      heroFacingLeft = False
    if hero.is_hitting_tile(CollisionDirection.TOP):
      hero.vy = 0
    if controller.down.is_pressed():
      if heroFacingLeft:
            animation.set_action(hero, ActionKind.Walking)
      else:
            animation.set_action(hero, ActionKind.Walking)
    elif hero.vy < 20 and not (hero.is_hitting_tile(CollisionDirection.BOTTOM)):
      if heroFacingLeft:
            animation.set_action(hero, ActionKind.Walking)
      else:
            animation.set_action(hero, ActionKind.Walking)
    elif hero.vx < 0:
      animation.set_action(hero, ActionKind.Walking)
    elif hero.vx > 0:
      animation.set_action(hero, ActionKind.Walking)
    else:
      if heroFacingLeft:
            animation.set_action(hero, ActionKind.Walking)
      else:
            animation.set_action(hero, ActionKind.Walking)
game.on_update(on_on_update)

# Flier movement

def on_on_update2():
    for value8 in sprites.all_of_kind(SpriteKind.Flier):
      if abs(value8.x - hero.x) < 60:
            if value8.x - hero.x < -5:
                value8.vx = 25
            elif value8.x - hero.x > 5:
                value8.vx = -25
            if value8.y - hero.y < -5:
                value8.vy = 25
            elif value8.y - hero.y > 5:
                value8.vy = -25
            animation.set_action(value8, ActionKind.Walking)
      else:
            value8.vy = -20
            value8.vx = 0
            animation.set_action(value8, ActionKind.Walking)
game.on_update(on_on_update2)

# Reset double jump when standing on wall

def on_on_update3():
    global canDoubleJump
    if hero.is_hitting_tile(CollisionDirection.BOTTOM):
      canDoubleJump = True
game.on_update(on_on_update3)

# bumper movement

def on_on_update4():
    for value9 in sprites.all_of_kind(SpriteKind.Bumper):
      if value9.is_hitting_tile(CollisionDirection.LEFT):
            value9.vx = Math.random_range(30, 60)
      elif value9.is_hitting_tile(CollisionDirection.RIGHT):
            value9.vx = Math.random_range(-60, -30)
game.on_update(on_on_update4)


驴友花雕 发表于 2025-9-24 15:56:26

【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃

这是一个基于ARCADE MakeCode的平台跳跃游戏代码。

游戏概述
这是一个经典的2D平台跳跃游戏,玩家控制一个角色在不同关卡中跳跃、收集金币、躲避敌人,最终到达终点。

代码结构分析
1. 枚举定义
python
class ActionKind(Enum):

    # 定义角色各种动作状态

    RunningLeft = 0

    RunningRight = 1

    Idle = 2

    # ... 其他动作状态
定义了角色可能的所有动作状态,用于动画管理。

2. 精灵种类定义
python
class SpriteKind:

    Bumper = SpriteKind.create()# 碰撞敌人

    Goal = SpriteKind.create()    # 目标/终点

    Coin = SpriteKind.create()    # 金币

    Flier = SpriteKind.create()   # 飞行敌人

3. 核心游戏机制

跳跃系统
python
def attemptJump():

    if hero.is_hitting_tile(CollisionDirection.BOTTOM):

      hero.vy = -4 * pixelsToMeters# 普通跳跃

    elif canDoubleJump:

      hero.vy = -3 * pixelsToMeters# 二段跳

      canDoubleJump = False
支持二段跳机制,玩家可以在空中再次跳跃。

物理系统
python
pixelsToMeters = 30

gravity = 9.81 * pixelsToMeters# 模拟真实重力
使用真实物理计算,让跳跃感觉更自然。

4. 动画系统
游戏包含丰富的动画:
奔跑动画:左右方向的奔跑帧
跳跃动画:跳跃和下落状态
下蹲动画:下蹲状态
闲置动画:站立状态
金币动画:旋转的金币效果
飞行敌人动画:翅膀扇动效果

5. 敌人系统
两种敌人类型:
Bumper(碰撞敌人):在地面来回移动
Flier(飞行敌人):会追踪玩家位置

6. 关卡系统
python
def setLevelTileMap(level: number):

    if level == 0:

      tiles.set_tilemap(tilemap("level"))

    elif level == 1:

      tiles.set_tilemap(tilemap("level_0"))

    # ... 最多8个关卡
支持多个关卡,玩家完成一关后进入下一关。

驴友花雕 发表于 2025-9-24 15:59:42

【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃

图形编程参考实验程序



通过模拟器,调试与模拟运行



实验场景记录







驴友花雕 发表于 2025-9-24 16:02:02

【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃


页: [1]
查看完整版本: 【花雕动手做】基于 Kitronik 游戏机开发板之平台跳跃