MakeCode Arcade – cheat sheet

Sprites, kinds, kollisioner, tilemaps og game events · JavaScript/Python-mode

MakeCode Arcade kan kodes med blokke eller JavaScript/Python. Skift mellem dem øverst. Skærmen er 160×120 pixels. Hvert eksempel står alene.

1. Sprites og kinds

let spiller = sprites.create(img`
    . . . . f f . .
    . . f f f f . .
    . f 5 5 5 5 f .
`, SpriteKind.Player)

let fjende = sprites.create(img`...`,
                            SpriteKind.Enemy)
let mønt = sprites.create(img`...`,
                          SpriteKind.Food)

// Position og hastighed
spiller.setPosition(80, 60)
spiller.vx = 50        // pixel/sekund
spiller.ay = 200       // tyngdekraft
Kinds er nøglen: kollisioner og events kører på SpriteKind (Player, Enemy, Food, Projectile osv.). Glemmer du at sætte kind, rammer dine overlap-events aldrig. Lav egne via sprites.create(img`...`, SpriteKind.create()) eller udvid listen.

2. Bevægelse og fysik

// Controller: pilene styrer spilleren
controller.moveSprite(spiller, 100, 100)

// Manuel fysik
spiller.vy = -100      // hop (y peger NED)
spiller.ay = 300       // tyngdekraft trækker ned
spiller.fx = 100       // friktion

// Hold spilleren på banen
spiller.setStayInScreen(true)

// Spring af vægge
bold.setBounceOnWall(true)

// Følg en anden sprite
skygge.follow(spiller)

3. Kollisioner og overlap

// Køres når Player rører Enemy
sprites.onOverlap(SpriteKind.Player,
                  SpriteKind.Enemy,
                  function(spiller, fjende) {
    info.changeLifeBy(-1)
    fjende.destroy(effects.fire, 100)
})

// Spørg direkte
if (spiller.overlapsWith(mønt)) {
    info.changeScoreBy(1)
}

// Når en sprite ødelægges
sprites.onDestroyed(SpriteKind.Enemy,
                    function(sprite) {
    info.changeScoreBy(10)
})

onOverlap er som et event: defineres én gang og kører hver gang de to kinds rører hinanden. Parametrene er de to sprites – brug dem, ikke globale variabler.

4. Projektiler (skyd!)

controller.A.onEvent(
    ControllerButtonEvent.Pressed,
    function() {
        let skud = sprites
            .createProjectileFromSprite(
                img`...`,   // billede
                spiller,    // fra denne sprite
                0, -100)    // vx, vy (op = negativ y)
        skud.setKind(SpriteKind.Projectile)
    })

// Ødelæg fjende ved ram
sprites.onOverlap(SpriteKind.Projectile,
                  SpriteKind.Enemy,
                  function(skud, fjende) {
    skud.destroy()
    fjende.destroy(effects.disintegrate, 100)
    info.changeScoreBy(50)
})

5. Score, liv og tid

// Info-panel vises automatisk øverst
info.setScore(0)
info.changeScoreBy(10)
info.setLife(3)
info.changeLifeBy(-1)

// Nedtælling
info.startCountdown(60)   // 60 sekunder
info.onCountdownEnd(function() {
    game.gameOver(false)  // tabt
})

// Når liv = 0
info.onLifeZero(function() {
    game.gameOver(false)
})

6. Tilemaps: byg en bane

// Opret kortet i Tilemap-editoren først
scene.setTileMap(assets.tilemap`bane1`)

// Baggrundsfarve (eller billede)
scene.setBackgroundColor(9)
scene.setBackgroundImage(assets.image`baggrund`)

// Kamera følger spilleren
scene.cameraFollowSprite(spiller)

// Spawn ved tiles
tiles.placeOnRandomTile(spiller,
                        assets.tile`start`)

// Vægge: tiles med "wall" markeret
// gør at sprites ikke kan gå igennem

Workflow: klik på Assets → Tilemap → tegn banen. Markér nogle tiles som vægge (wall) i editoren – så stopper sprites automatisk ved dem uden kode.

7. Game-loop og events

// Køres hver frame (~30 gange/sek)
game.onUpdate(function() {
    if (spiller.y > 120) {  // faldet ud?
        info.changeLifeBy(-1)
        spiller.setPosition(80, 60)
    }
})

// Køres hvert X millisekund
game.onUpdateInterval(2000, function() {
    // spawn en fjende hvert 2. sekund
    let fjende = sprites.create(img`...`,
                                SpriteKind.Enemy)
    fjende.setPosition(160,
                       randint(0, 120))
    fjende.vx = -50
})

8. Lyd, effekter og game over

music.play(music.createSoundEffect(
    WaveShape.Square, 500, 1, 255, 0,
    100, SoundExpressionEffect.None,
    InterpolationCurve.Linear),
    PlaybackMode.UntilDone)

// Partikel-effekt ved død
fjende.destroy(effects.fire, 200)

// Game over med stil
game.setGameOverEffect(true,
                       effects.confetti)
game.setGameOverMessage(false,
                        "Prøv igen!")
game.gameOver(true)   // vundet

9. Nyttige tricks

// Tilfældigt tal
let x = randint(0, 160)

// Sprite siger noget (boble)
spiller.say("Av!", 500)  // i ms

// Flag: gennemgennemsigtig
spiller.setFlag(SpriteFlag.Ghost, true)

// Fjern ALLE fjender
for (let f of sprites.allOfKind(
             SpriteKind.Enemy)) {
    f.destroy()
}

// Spritedata: gem værdi på sprite
sprites.setDataNumber(fjende,
                      "liv", 3)

10. Hurtig oversigt

sprites.create(img, kind)ny sprite med kind controller.moveSprite(s, vx, vy)pile styrer sprite sprites.onOverlap(k1, k2, f)kollision-event info.changeScoreBy(n)opdatér score info.changeLifeBy(n)opdatér liv game.onUpdate(f)kør hver frame game.gameOver(vundet)afslut spillet scene.setTileMap(t)sæt bane sprite.destroy(effekt, ms)fjern med effekt randint(min, max)tilfældigt heltal sprite.setFlag(flag, on)fx Ghost gennem vægge

11. Typiske faldgruber