diff --git a/README.md b/README.md index b2b01ae..f612b37 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Simple JS platformer to modify and extend. - [x] Die properties werden als Array exportiert. Da brauche ich in der setup Funktion noch eine Function um die zu Konviertieren. - [x] Globales Objekt bauen mit einem einzigen Wert ("life = 3" z.B.), den ich immer Anzeige und der über die Level hinaus bestehen bleibt. - +- [ ] fix Frame Rate on Mobile () - [ ] Gravity Variable für verschiedene Umgebungen (Land, Wasser, Space) - [ ] Verschiedene Biomes diff --git a/docs/roadmap.md b/docs/roadmap.md index d4c12c3..16d8ad3 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -2,16 +2,17 @@ - [ ] Test Map - [ ] Vehicles -- [ ] Swimming +- [ ] Swimming - [x] Oxygen-Meter - [ ] ordentliches HUD bauen - [ ] Elemente müssen variable und optional sein. - [ ] Global Progress Object +- [ ] One-Time Pickups (für z.B. Powerups die nicht respawned werden) - [ ] Menus & Textboxes - [ ] Save & Load - [ ] Mobile Controls - [ ] Collision Boxes (nicht identisch mit der Sprite-Größe) -- [ ] Spores +- [ ] Spores (?? tbd) - [ ] Webhosting - [ ] Boss Battles @@ -34,6 +35,37 @@ - boss-levels +## General Control Scheme +- D-Pad: ArrowKeys +- Buttons (A, B): X, Y +- Start: Enter +- Select: Space + +## Player Controls +- X = Jump +- Y = Attack +- ArrowUp = Enter Door/Use +- Space = Select Weapon + +## Vehicle Controls +- X = Engine Acceleration (in 0.5er Steps von 0 bis +2) +- Y = Weapon/Tool +- ArrowKeys für Richtungen +- Space = Select Weapon/Tool + +## HUD +- Hitpoints = Text "HP" + Boxes +- Collected Crystals = Icon + Number +- active Weapon + Ammo = Icon + Number +- Oxygen (nur wenn diving) = Icon + Bar +- Extralifes = Icon + Number +- möglicherweise Depth = Number + Text "m" + +Anordnung: +HP OOOOOOO (W)25 (C)36 (L)3 +O2 ========= + + ## Objects & Variables - GlobalProgress diff --git a/index.html b/index.html index 1f7312a..16ad960 100644 --- a/index.html +++ b/index.html @@ -15,47 +15,37 @@ support the <canvas> element + -
- LEFT/RIGHT to move, SPACE to jump, collect gold and jump - on monsters. +
+
+
-
-
-
- -
-
- - -
-
- -
-
-
- - -
-
-
+
+ + +
- +
+ +
+
+ +
+ +
- - + + - + diff --git a/js/main.js b/js/main.js index a0eee71..00f33ee 100644 --- a/js/main.js +++ b/js/main.js @@ -67,6 +67,129 @@ function main() { } }) + // * Touch Controls + + function touchControl(ev, button, down) { + switch (button) { + case 'jump': + player.jump = down + ev.preventDefault() + return false + case 'shoot': + shoot(player) + ev.preventDefault() + return false + case 'left': + player.left = down + ev.preventDefault() + return false + case 'right': + player.right = down + ev.preventDefault() + return false + case 'up': + player.up = down + ev.preventDefault() + return false + case 'down': + player.down = down + ev.preventDefault() + return false + } + } + + const buttonA = document.getElementById('button-a') + const buttonB = document.getElementById('button-b') + const dpadLeft = document.getElementById('dpad-left') + const dpadRight = document.getElementById('dpad-right') + const dpadUp = document.getElementById('dpad-up') + const dpadDown = document.getElementById('dpad-down') + + buttonA.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'jump', true) + }, + false + ) + buttonA.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'jump', false) + }, + false + ) + buttonB.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'shoot', true) + }, + false + ) + buttonB.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'shoot', false) + }, + false + ) + dpadLeft.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'left', true) + }, + false + ) + dpadLeft.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'left', false) + }, + false + ) + dpadRight.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'right', true) + }, + false + ) + dpadRight.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'right', false) + }, + false + ) + dpadUp.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'up', true) + }, + false + ) + dpadUp.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'up', false) + }, + false + ) + dpadDown.addEventListener( + 'touchstart', + function (ev) { + return touchControl(ev, 'down', true) + }, + false + ) + dpadDown.addEventListener( + 'touchend', + function (ev) { + return touchControl(ev, 'down', false) + }, + false + ) + // ! Vielleicht kann ich statt des setup() an dieser Stelle auch eine gameStart() Funktion erstellen, die beim erstmaligen Start alles erledigt. Später wird dann ja immer die _initLevel() aufgerufen. setup(currentLevel.levelData) // ! Was brauche ich hier, damit das variabel alle Level laden kann? diff --git a/style.css b/style.css index 3e0bb3c..33744b4 100644 --- a/style.css +++ b/style.css @@ -5,14 +5,13 @@ --start-button-color: #597ea7; } - @font-face { - font-family: "C64 TrueType"; + font-family: 'C64 TrueType'; src: url('fonts/C64_Pro_Mono-STYLE.eot'); src: url('fonts/C64_Pro_Mono-STYLE.eot') format('embedded-opentype'), - url('fonts/C64_Pro_Mono-STYLE.woff2') format('woff2'), - url('fonts/C64_Pro_Mono-STYLE.woff') format('woff'), - url('fonts/C64_Pro_Mono-STYLE.ttf') format('truetype'); + url('fonts/C64_Pro_Mono-STYLE.woff2') format('woff2'), + url('fonts/C64_Pro_Mono-STYLE.woff') format('woff'), + url('fonts/C64_Pro_Mono-STYLE.ttf') format('truetype'); } body { @@ -20,7 +19,6 @@ body { } .controls-wrapper { - display: none; } .dpad-wrapper { @@ -32,7 +30,14 @@ body { flex-direction: column; padding: 20px; justify-content: center; + + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + margin-left: 8px; } + .dpad-top-bottom { margin-left: auto; margin-right: auto; @@ -74,13 +79,34 @@ body { border-radius: 50%; margin: auto; } + +.button-a { + margin-top: 50%; +} + +.button-b { + margin-bottom: 50%; +} + .buttons-wrapper { background-color: var(--shell-color); border-radius: 60px; - height: 100px; - width: 240px; + height: 200px; + width: 180px; display: flex; padding: 10px; + + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +@media only screen and (min-width: 1000px) { + .dpad-wrapper, + .buttons-wrapper { + display: none; + } } #platformer {