diff options
author | munvoseli <muslinmelody@gmail.com> | 2023-06-10 12:46:32 -0400 |
---|---|---|
committer | munvoseli <muslinmelody@gmail.com> | 2023-06-10 12:46:32 -0400 |
commit | 43e339118f0fae3a8bf39caf610ed1c2265f4283 (patch) | |
tree | 6b551ff4ed49d2abedce0b131a90522815711b53 | |
parent | fb8300d51afad21fb307422f54f150ba98dcd5e3 (diff) | |
parent | 906f352206bfa49304a9fbea5c3455df75cdfb3c (diff) |
merge new movement mechanics
-rw-r--r-- | public/javascript/game.js | 151 |
1 files changed, 77 insertions, 74 deletions
diff --git a/public/javascript/game.js b/public/javascript/game.js index 3103674..88ebf70 100644 --- a/public/javascript/game.js +++ b/public/javascript/game.js @@ -69,7 +69,6 @@ var textToPlaceInput; var textToPlace = null; var textToPlaceIndex; var textToPlaceIsWaitingToWalk; -var localPlayerWalkRepeatDirections = []; var localPlayerWalkRepeatDelay = 0; var localPlayerShouldStopWalkRepeat = true; var lKeyIsHeld = false; @@ -80,9 +79,11 @@ var gameUpdateSocket; var gameUpdateStartTimestamp; var moduleList = []; -var localPlayerWalkBuffer = -1; // no buffering -var lockWalkDir = -1; - +const walkAnimTime = (1 / 8) * framesPerSecond; +let walkAnimDir = -1; +let walkOnceBuffer = []; +let walkInputDirection = -1; +let lockWalkDir = -1; // Thanks to CatTail for this snippet of code. var encodeHtmlEntity = function(str) { @@ -686,7 +687,6 @@ Player.prototype.draw = function() { Player.prototype.walk = function(direction) { if (this.walkDelay > 0) { - console.log("aah"); return false; } if (this == localPlayer) { @@ -697,12 +697,14 @@ Player.prototype.walk = function(direction) { var tempPos = this.getPosInWalkDirection(direction); var tempTile = getTileBufferValue(tempPos); if (!this.canWalkThroughTile(tempTile)) { + walkAnimDir = -1; return false; } addWalkCommand(direction); this.pos.set(tempPos); placeLocalPlayerTrail(this.pos); - this.walkDelay = (1 / 8) * framesPerSecond; + walkAnimDir = direction; + this.walkDelay = walkAnimTime; return true; } @@ -727,7 +729,7 @@ Player.prototype.removeTile = function(direction) { localCrack = new Crack(-1, tempPos, localPlayer.username); localCrackTile = getTileBufferValue(tempPos); var tempDate = new Date(); - localCrackExpirationTime = tempDate.getTime() + 500; + localCrackExpirationTime = tempDate.getTime() + 1000; addRemoveTileCommand(direction); } @@ -741,7 +743,7 @@ Player.prototype.placeOrRemoveTile = function(direction) { var tempPos = this.getPosInWalkDirection(direction); var tempTile = getTileBufferValue(tempPos); if ((tempTile >= blockStartTile && tempTile < blockStartTile + blockTileAmount) - || (tempTile >= teleporterStartTile && tempTile < teleporterStartTile + teleporterTileAmount)) { + || (tempTile >= teleporterStartTile && tempTile < teleporterStartTile + teleporterTileAmount)) { this.removeTile(direction); } if ((tempTile >= flourTile && tempTile <= breadTile) @@ -758,7 +760,7 @@ Player.prototype.performActionInDirection = function(direction) { if (shiftKeyIsHeld) { this.placeOrRemoveTile(direction); if (this == localPlayer) { - localPlayerWalkRepeatDirections = []; + localPlayerWalkRepeatDirection = null; } } else { if (this == localPlayer) { @@ -770,7 +772,7 @@ Player.prototype.performActionInDirection = function(direction) { } Player.prototype.stopActionInDirection = function(direction) { - if (this == localPlayer) + if (this == localPlayer && !shiftKeyIsHeld) localPlayerStopWalking(direction); } @@ -1119,6 +1121,13 @@ function drawTileOnContext(context, pos, size, which) { function drawTile(pos, which) { var tempPos = pos.copy(); tempPos.scale(spriteRenderSize); + if (walkAnimDir >= 0) { + const size = spriteRenderSize; + const dx = [0,1,0,-1][walkAnimDir] * size; + const dy = [-1,0,1,0][walkAnimDir] * size; + tempPos.x += dx * localPlayer.walkDelay/walkAnimTime; + tempPos.y += dy * localPlayer.walkDelay/walkAnimTime; + } drawTileOnContext( context, tempPos, @@ -1196,31 +1205,32 @@ function startPlacingText(text) { textToPlaceIsWaitingToWalk = false; } -function localPlayerStartWalking(direction) { - if (localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1] !== direction) - { - if (this.walkDelay <= 0) - localPlayer.walk(direction); - else { - localPlayerWalkRepeatDirections.push(direction); - localPlayerWalkBuffer = direction; +let inputTracker = [null, null, null, null]; +function computeWalkingDirection() { + let earlytime = NaN; + let earlyind = -1; + for (let i = 0; i < 4; i++) { + if (inputTracker[i] == null) continue; + if (inputTracker[i] < earlytime) continue; + earlytime = inputTracker[i]; + earlyind = i; } + return earlyind; +} +function localPlayerStartWalking(direction) { + if (inputTracker[direction] != null) return; + walkOnceBuffer.push(direction); + inputTracker[direction] = performance.now(); + walkInputDirection = direction; lockWalkDir = -1; - } - //localPlayerWalkRepeatDelay = 0.1 * framesPerSecond; - //localPlayerShouldStopWalkRepeat = !lKeyIsHeld; } function localPlayerStopWalking(direction) { - if (localPlayerWalkRepeatDirections.length == 0) - return; - for (var i = localPlayerWalkRepeatDirections.length - 1; i >= 0; i--) - { - if (localPlayerWalkRepeatDirections[i] == direction) { - localPlayerWalkRepeatDirections.splice(i, 1); - i++; + //let dtframe = (performance.now() - inputTracker[direction]) / 1000 * FPS; + inputTracker[direction] = null; + if (walkInputDirection == direction) { + walkInputDirection = computeWalkingDirection(); } - } } function displayGuidelinePos() { @@ -1351,7 +1361,7 @@ function keyDownEvent(event) { if (keyCode == 16) { shiftKeyIsHeld = true; } - if (keyCode == 77) { // m + if (keyCode == 76) { // m lKeyIsHeld = true; } if (chatInputIsFocused) { @@ -1398,31 +1408,23 @@ function keyDownEvent(event) { overlayChatInput.focus(); overlayChatInputIsFocused = true; } - var key = event.key; - if (false) { - } + var key = event.key; + if (false) { + } else if (keyCode == 37 || keyCode == 65) { - localPlayerStartWalking(3); + localPlayer.performActionInDirection(3); } else if (keyCode == 39 || keyCode == 68) { - localPlayerStartWalking(1); + localPlayer.performActionInDirection(1); } else if (keyCode == 38 || keyCode == 87) { - localPlayerStartWalking(0); + localPlayer.performActionInDirection(0); } else if (keyCode == 40 || keyCode == 83) { - localPlayerStartWalking(2); + localPlayer.performActionInDirection(2); } - else if (key == "i") - localPlayer.placeOrRemoveTile(0); - else if (key == "l") - localPlayer.placeOrRemoveTile(1); - else if (key == "k") - localPlayer.placeOrRemoveTile(2); - else if (key == "j") - localPlayer.placeOrRemoveTile(3); - else if (key == "m") - lockWalkDir = localPlayerWalkBuffer >= 0 ? localPlayerWalkBuffer : localPlayerWalkRepeatDirections.length ? localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1] : -1; + else if (key == "m") + lockWalkDir = computeWalkingDirection(); else if (keyCode == 189 || keyCode == 173) { setZoom(0); } @@ -1465,7 +1467,7 @@ function keyUpEvent(event) { if (keyCode == 16) { shiftKeyIsHeld = false; } - if (keyCode == 77) { // m + if (keyCode == 76) { // l lKeyIsHeld = false; } if (keyCode == 37 || keyCode == 65) { @@ -1566,22 +1568,17 @@ function timerEvent() { } } } - if (localPlayer.walkDelay > 0) - { - // idk - } - else if (localPlayerWalkRepeatDirections.length > 0 || localPlayerWalkBuffer >= 0 || lockWalkDir >= 0) { - console.log(localPlayerWalkBuffer); - if (localPlayerWalkBuffer >= 0) { - localPlayer.walk(localPlayerWalkBuffer); - localPlayerWalkBuffer = -1; - } - else if (localPlayerWalkRepeatDirections.length) { - localPlayer.walk(localPlayerWalkRepeatDirections[localPlayerWalkRepeatDirections.length - 1]); + if (walkOnceBuffer.length == 0 && walkInputDirection == -1 && lockWalkDir == -1) { + if (localPlayer.walkDelay <= 0) { + walkAnimDir = -1; } - else { - localPlayer.walk(lockWalkDir); - } + } else if (walkOnceBuffer.length >= 1) { + if (localPlayer.walkDelay <= 0) + localPlayer.walk(walkOnceBuffer.shift()); + } else if (walkInputDirection != -1) { + localPlayer.walk(walkInputDirection); + } else if (lockWalkDir != -1) { + localPlayer.walk(lockWalkDir); } cameraPos.set(localPlayer.pos); var tempOffset = Math.floor(canvasSpriteSize / 2); @@ -1589,17 +1586,23 @@ function timerEvent() { cameraPos.y -= tempOffset; clearCanvas(); - var tempPos = new Pos(0, 0); - var tempOffset = new Pos(0, 0); - while (tempOffset.y < canvasSpriteSize) { - tempPos.set(cameraPos); - tempPos.add(tempOffset); - var tempTile = getTileBufferValue(tempPos); - drawTile(tempOffset, tempTile); - tempOffset.x += 1; - if (tempOffset.x >= canvasSpriteSize) { - tempOffset.x = 0; - tempOffset.y += 1; + { + const x0 = walkAnimDir == 1 ? -1 : 0; + const y0 = walkAnimDir == 2 ? -1 : 0; + const x2 = walkAnimDir == 3 ? canvasSpriteSize+1 : canvasSpriteSize; + const y2 = walkAnimDir == 0 ? canvasSpriteSize+1 : canvasSpriteSize; + let tempPos = new Pos(0, 0); + let tempOffset = new Pos(x0, y0); + while (tempOffset.y < y2) { + tempPos.set(cameraPos); + tempPos.add(tempOffset); + var tempTile = getTileBufferValue(tempPos); + drawTile(tempOffset, tempTile); + tempOffset.x += 1; + if (tempOffset.x >= x2) { + tempOffset.x = x0; + tempOffset.y += 1; + } } } var index = 0; |