Untitled
unknown
plain_text
3 years ago
6.5 kB
10
Indexable
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})Editor is loading...