package com.persesgames.shooter import com.persesgames.game.Game import com.persesgames.game.Screen import com.persesgames.input.EmptyInputProcessor import com.persesgames.input.KeyCode import com.persesgames.input.Keys import com.persesgames.map.tiled.TiledMap import com.persesgames.sound.Music import com.persesgames.sound.Sounds import com.persesgames.sprite.Sprite import com.persesgames.sprite.SpriteBatch import com.persesgames.text.Texts import com.persesgames.texture.Textures import org.w3c.dom.HTMLAudioElement import org.w3c.dom.HTMLInputElement import kotlin.browser.document /** * Created by rnentjes on 19-4-16. */ class GameInputProcessor : EmptyInputProcessor() { override fun keyPressed(charCode: Int) { println("charCode: $charCode") if (charCode == 32) { Sounds.play("EXPLOSION", 0.5f) } else if (charCode == 'x'.toInt()) { Sounds.play("DROP", 0.75f) } } override fun pointerClick(pointer: Int, x: Float, y: Float) { println("POINTER $pointer -> ($x, $y)") } } var music: HTMLAudioElement? = null var showFPS: Boolean = true class WelcomeScreen : Screen() { override fun loadResources() { println("loading resource!") //music = Music.play("music/DST-TechnoBasic.mp3", 1.0, looping = true) Textures.loadSpriteSheet("images/data-0.json") Keys.setInputProcessor(GameInputProcessor()) } override fun update(time: Float, delta: Float) { } override fun render() { if (showFPS) { Texts.drawText(20f, 100f, "Hello! FPS ${Game.fps}", font = "bold 72pt Arial") } } } class GameScreen : Screen() { val map = TiledMap("maps", "level_1_01.json") var sprites = SpriteBatch() var x = 0f var y = 0f var sprite = Sprite("SHIP") var numberOfSprites: Int = 5000 var time: Float = 0f override fun loadResources() { Textures.load("SHIP", "images/ship2.png") Sounds.load("EXPLOSION", "sounds/Explosion7.ogg", channels = 2) Sounds.load("DROP", "sounds/Bomb_Drop.ogg", channels = 4) music = Music.play("music/DST-TechnoBasic.mp3", 0.5, looping = true) Keys.setInputProcessor(GameInputProcessor()) println("width: ${map.data.width}") println("height: ${map.data.height}") println("layers: ${map.data.layers?.size}") val layers = map.data.layers if (layers != null) { println("layer0: ${layers[0].name}") } val tilesets = map.data.tilesets if (tilesets != null) { println("tilesets ${tilesets.size}") println("tileset0: ${tilesets[0].name}") } } override fun update(time: Float, delta: Float) { this.time = time val speed = 500f // units per second if (Keys.isDown(KeyCode.LEFT)) { x -= delta * speed } if (Keys.isDown(KeyCode.RIGHT)) { x += delta * speed } if (Keys.isDown(KeyCode.UP)) { y += delta * speed } if (Keys.isDown(KeyCode.DOWN)) { y -= delta * speed } if (Keys.isDown(KeyCode.MINUS)) { if (numberOfSprites > 25) { numberOfSprites = (numberOfSprites * 0.9f).toInt() } } if (Keys.isDown(KeyCode.PLUS)) { numberOfSprites = (numberOfSprites * 1.1f).toInt() } } override fun render() { var r = 0f var d = 0f var x = 0f var y = 0f map.drawLayer(1, 0f, 0f) val time = this.time / 10f for (index in 0..numberOfSprites) { r = index * 0.05f d = index * 2.13f x = (Math.sin((time + d).toDouble()) * r).toFloat() y = (Math.cos((time + d).toDouble()) * r).toFloat() sprites.draw(sprite, x.toFloat(), y.toFloat(), scale = 0.4f + Math.sin(time.toDouble() + r).toFloat(), rotation = r * 10f) } sprites.render() Texts.drawText(20f, 150f, "Drawing $numberOfSprites sprites per frame.") if (showFPS) { Texts.drawText(20f, 100f, "FPS ${Game.fps}", font = "bold 72pt Arial", fillStyle = "red") Texts.drawText(15f, -20f, "Music by DST", font = "bold 28pt Arial", fillStyle = "green") } } } fun main(args: Array<String>) { Game.view.setToWidth(2000f) Game.start(WelcomeScreen()) } fun changeMusic(it: HTMLInputElement) { val mus = music if (mus != null) { if (it.checked) { mus.volume = 0.5 } else { mus.volume = 0.0 } } } fun showFPS(it: HTMLInputElement) { showFPS = it.checked } fun pause(it: HTMLInputElement) { Game.pause = it.checked } fun playGame() { document.getElementById("menu")?.setAttribute("style", "display: none;") Game.setScreen(GameScreen()) } fun fullscreen() { Game.view.requestFullscreen() }