Newer
Older
kotlin-webgl-test / lib / kotludens / shooter / Shooter.kt
package com.persesgames.shooter

import com.persesgames.game.DrawMode
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 = 15500f
    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 = 1500f // units per second

        if (Keys.isDown(KeyCode.LEFT)) {
            x -= delta * speed
            println("x=$x")
        }

        if (Keys.isDown(KeyCode.RIGHT)) {
            x += delta * speed
            println("x=$x")
        }

        if (Keys.isDown(KeyCode.UP)) {
            y += delta * speed
            println("y=$y")
        }

        if (Keys.isDown(KeyCode.DOWN)) {
            y -= delta * speed
            println("y=$y")
        }

        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, this.x, this.y)
        map.drawLayer(2, this.x, this.y)

        val time = this.time / 10f
        for (index in 0..numberOfSprites) {
            r = index * 0.05f
            d = index * 2.13f
            x = 1000f + (Math.sin((time + d).toDouble()) * r).toFloat()
            y = 500f + (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.draw(sprite, 350f, 350f, scale = 4f, rotation = -time)

        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.setToHeight(1000f)
    Game.view.drawMode = DrawMode.LINEAR

    Game.view.minAspectRatio = 0.9f
    Game.view.maxAspectRatio = 1.5f

    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()
}