Untitled
unknown
plain_text
7 months ago
6.5 kB
1
Indexable
Never
import kaboom from "kaboom" // initialize context kaboom({ background: [0, 0, 0] }) //Ladataan hahmot/palikat loadSprite("block", "sprites/block.png"); loadSprite("blue-block", "sprites/blue-block.png"); loadSprite("blue-brick", "sprites/blue-brick.png"); loadSprite("blue-evil-shroom", "sprites/blue-evil-shroom.png"); loadSprite("blue-steel", "sprites/blue-steel.png"); loadSprite("blue-surprise", "sprites/blue-surprise.png"); loadSprite("brick", "sprites/brick.png"); loadSprite("coin", "sprites/coin.png"); loadSprite("evil-shroom-1", "sprites/evil-shroom-1.png"); loadSprite("mario-standing", "sprites/mario-standing.png"); loadSprite("mushroom", "sprites/mushroom.png"); loadSprite("pipe-top", "sprites/pipe-top.png"); loadSprite("pipe-left", "sprites/Pipe-Left.png"); loadSprite("pipe-right", "sprites/Pipe-Right.png"); loadSprite("pipe-upper-left", "sprites/Pipe-Upper-Left.png"); loadSprite("pipe-upper-right", "sprites/Pipe-Upper-Right.png"); loadSprite("question", "sprites/question.png"); loadSprite("unboxed", "sprites/unboxed.png"); scene("game", ({ level, score }) =>{ layers(['bg', 'obj', 'ui'], 'obj') const move_speed = 120 const jump_force = 400 const big_jump_force = 550 let current_jump_force = jump_force const ENEMY_MOVESPEED = 30 const FALL_DEATH = 600 let isJumping = true //Kartta ja muuttujat const maps = [ [ ' ', ' ', ' ', ' ', ' ', ' % =*=% ', ' ', ' -+ ', ' ^ ^ () ', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx xxx', ], [ '£ £', '£ £', '£ £', '£ @@@@@ s £', '£ s s s £', '£ s s s s s -+£', '£ ! s s s s s s ()£', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ] ] const levelCfg = { width: 20, height: 20, '=': () => [sprite('block'), solid(), area()], 'x': () => [sprite('brick'), solid(), area()], '$': () => [sprite('coin'), 'coin', area()], '%': () => [sprite('question'), 'coin-surprise', scale(0.5), solid(), area()], '*': () => [sprite('question'), 'mushroom-surprise', scale(0.5), solid(), area()], '}': () => [sprite('unboxed'), solid(), area()], '(': () => [sprite('pipe-left'), scale(0.5), solid(), area()], ')': () => [sprite('pipe-right'), scale(0.5), solid(), area()], '-': () => [sprite('pipe-upper-left'), scale(0.5), solid(), area(), 'pipe'], '+': () => [sprite('pipe-upper-right'), scale(0.5), solid(), area(), 'pipe'], '^': () => [sprite('evil-shroom-1'), body(), area(), solid(), 'dangerous'], '#': () => [sprite('mushroom'), 'mushroom', body(), area(),], '£': () => [sprite('blue-brick'), solid(), area(), scale(0.5),], 'z': () => [sprite('blue-block'), solid(), area(), scale(0.5),], '@': () => [sprite('blue-surprise'), solid(), area(), 'coin-surprise'], '!': () => [sprite('blue-evil-shroom'), 'dangerous', scale(0.5), body(), area()], 's': () => [sprite('blue-steel'), solid(), area(), scale(0.5),], } const gameLevel = addLevel(maps[level], levelCfg) //Pistemäärä -teksti const scoreGlobal = 0 const scoreLabel = add([ text(scoreGlobal, { font: "sink" }), pos(30, 6), scale(1.5), layer('ui'), { value: scoreGlobal, } ]) //Taso -teksti add([text('level ' + parseInt(level + 1), { font: "sink" }), pos(50, 6), scale(1.5)]) //Kun Mario saa sienen... function big() { let timer = 0 let isBig = false return { update() { if (isBig) { //Mario suurenee joksikin aikaa ja palaa takaisin ennalleen timer -= dt() if (timer <= 0) { this.smallify() } } }, isBig() { return isBig }, //Muokataan hyppykorkeudet niin, että isompi Mario hyppää korkeammalle smallify() { this.scale = vec2(1) timer = 0 isBig = false current_jump_force = jump_force }, biggify(time) { this.scale = vec2(1.99) timer = time isBig = true current_jump_force = big_jump_force } } } //Pelaajan muuttujat const player = add([ sprite('mario-standing'), pos(30, 0), body(), area(), big() ]) player.action(() => { camPos(player.pos) if (player.pos.y >= FALL_DEATH) { go('lose', { score: scoreLabel.value }) } }) //Kun painetaan 'vasen nuolta' tai 'oikeaa nuolta', hahmo liikkuu sivuille keyDown('left', () => { player.move(-move_speed, 0) }) keyDown('right', () => { player.move(move_speed, 0) }) player.action(() => { if (player.grounded()) { isJumping = false } }) keyDown('space', () => { if (player.grounded()) { isJumping = true player.jump(current_jump_force) } }) //Kun Mario lyö päänsä 'erityispalikoihin', niistä ilmestyy kolikoita tai sieniä player.on('headbutt', (obj) => { if (obj.is('coin-surprise')) { gameLevel.spawn('$', obj.gridPos.sub(0, 1)), destroy(obj), gameLevel.spawn('}', obj.gridPos.sub(0, 0)) } if (obj.is('mushroom-surprise')) { gameLevel.spawn('#', obj.gridPos.sub(0, 1)), destroy(obj), gameLevel.spawn('}', obj.gridPos.sub(0, 0)) } }) //Kun pelaaja menee piipusta alas, pääsee uuteen tasoon player.collides('pipe', () => { keyPress('down', () => { go("game", { level: (level + 1) % maps.length, score: scoreLabel.value }) }) }) //Sieni pistetään liikkumaan action('mushroom', (m) => { m.move(20, 0) }) //Kun Mario osuu sieneen, hän suurenee ja sieni katoaa player.collides('mushroom', (m) => { player.biggify(6) destroy(m) }) //Kun Mario ottaa kolikon, saa yhden pistemäärän lisää ja se päivitetään tekstiin, kolikko lopulta tuhotaan player.collides('coin', (c) => { scoreLabel.value++ scoreLabel.text = scoreLabel.value destroy(c) }) action('dangerous', (d) => { d.move(-ENEMY_MOVESPEED, 0) }) player.collides('dangerous', (d) => { if (isJumping) { destroy(d) } else { go('lose', { score: scoreLabel.value }) } }) scene('lose', () => { add([ text("GAME OVER! SCORE: " + scoreLabel.value, { size: 35, font: "sink" }), pos(width() / 2, height() / 2), origin("center"), layer("ui"), ]) }) }) go("game", { level: 0, score: 0})