Webbserverprogrammering 1

Show sourcecode

The following files exists in this folder. Click to view.

webbserverprogrammering/projekt/GYA-2026/js/

box.js
door.js
gate.js
global.js
imagesNSound_handler.js
main.js
player.js
pressure_plate.js
rolling_stone.js
saveInputs.js
world.js

player.js

167 lines UTF-8 Windows (CRLF)
// Spelarens atribut
let player = {
  width : tile_size * 0.8,
  height : tile_size * 0.8,
  color : "rgb(218, 103, 9)",
  speed : 1,
  dx : 0,
  dy : 0,
  currentTexture : 2,
  walkAnimationDelay : 0,
  walkAnimationDelayMax : 21,
  blinkDelay : 0,
  blinkDelayMax : 12,
  facing : "right",
  idleCounter: 0
}

// Spelarens spawnpoint för varje bana
if (level == 0) {
    player.x = tile_size * 14.6;
    player.y = tile_size * 4.6;
  } else if (level == 1) {
    player.x = tile_size * 2.6;
    player.y = tile_size * 4.6;
  } else if (level == 2) {
    player.x = tile_size * 0.6;
    player.y = tile_size * 6.6;
  } else if (level == 3) {
    player.x = tile_size * 6.6;
    player.y = tile_size * 6.6;
  } else if (level == 4) {
    player.x = tile_size * 11.1;
    player.y = tile_size * 8;
  } else if (level == 5) {
    player.x = tile_size * 12.1;
    player.y = tile_size * 0.1;
  } else if (level == 6) {
    player.x = tile_size * 14.1;
    player.y = tile_size * 3.1;
  } else if (level == 7) {
    player.x = tile_size * 2.6;
    player.y = tile_size * 7.6;
}

// Bytter riktning hos spelaren
let keysDown = {};
function updateDirection() {
  // WASD och piltangenterna
  if (keysDown["w"] || keysDown["arrowup"]) {
    player.dx = 0; 
    player.dy = -1;
    player.facing = "up";
  } else if (keysDown["s"] || keysDown["arrowdown"]) {
    player.dx = 0; 
    player.dy = 1;
    player.facing = "down";
  } else if (keysDown["a"] || keysDown["arrowleft"]) {
    player.dx = -1; 
    player.dy = 0;
    player.facing = "left";
  } else if (keysDown["d"] || keysDown["arrowright"]) {
    player.dx = 1; 
    player.dy = 0;
    player.facing = "right";
  } else if (keysDown["escape"]) {
    if (draw_interval) {
      startGame();
    }
  } else if ((keysDown["r"] || keysDown["b"] || keysDown["backspace"])) {
    document.getElementById("send_button").style.display = "none";
    resetPlayer();
    load();
  } else {
    player.dx = 0; 
    player.dy = 0;
  }
}

// Flyttar spelaren
function movePlayer() {
  player.x += player.dx * player.speed;
  player.y += player.dy * player.speed;
}

// Spelarens kollision med världskanten
function clampPlayer(canvas) {
  player.x = Math.max(0, Math.min(player.x, canvas.canvas.width - player.width));
  player.y = Math.max(0, Math.min(player.y, canvas.canvas.height - player.height));
}

// Spelarens kollision med blocken
function playerBlocked(world, tile_size, blockedTypes) {
  function isBlocked(x, y) {
    let gridX = Math.floor(x / tile_size);
    let gridY = Math.floor(y / tile_size);
    if (gridY >= 0 && gridY < world.length && gridX >= 0 && gridX < world[0].length) {
      return blockedTypes.includes(world[gridY][gridX]);
    }
    return false;
  }
  return (isBlocked(player.x, player.y) || isBlocked(player.x + player.width, player.y) || isBlocked(player.x, player.y + player.height) || isBlocked(player.x + player.width, player.y + player.height));
}

// Ritar spelaren på spelplanen
function drawPlayer() {
  // Ritar spelarens animation
  if (player.dx !== 0 || player.dy !== 0) {
    player.walkAnimationDelay++;
    player.idleCounter = 0; // reset när spelaren rör sig
    if (player.walkAnimationDelay >= player.walkAnimationDelayMax) {
      player.walkAnimationDelay = 0;
      if (player.facing === "up" || player.facing === "down") {
        if (player.currentTexture < 4) {
          player.currentTexture++;
        } else {
          player.currentTexture = 1;
        }
      } else {
        if (player.currentTexture < 8) {
          player.currentTexture++;
        } else {
          player.currentTexture = 3;
        }
      }
    }
  } else {
    // Får spelaren att blinka när hon står stilla
    player.blinkDelay++;
    player.idleCounter++;
    if (Math.random() <= 0.05 && player.blinkDelay >= player.blinkDelayMax) {
      player.currentTexture = 1;
      player.blinkDelay = 0;
    } else if (player.blinkDelay >= player.blinkDelayMax) {
      player.currentTexture = 2;
      player.blinkDelay = 0;
    }
    // återställ front efter ~1 sekund
    if (player.idleCounter >= 20) {
      player.currentTexture = 2;
      if (player.facing == "left") {
        player.facing = "left";
      } else {
        player.facing = "right";
      }
    }
  }

  if (player.facing == "left") {
    canvas.scale(-1,1);
    make_base(playerTextures[player.currentTexture], player.x*-1, player.y, player.width*-1, player.height, canvas);
    canvas.scale(-1,1);
  } else if (player.facing == "up" || player.facing == "down") {
    let idx = player.currentTexture;
    if (idx < 1) idx = 1;
    if (idx > 4) idx = 4;
    make_base(playerUpNDown[idx], player.x, player.y, player.width, player.height, canvas);
  } else {
    make_base(playerTextures[player.currentTexture], player.x, player.y, player.width, player.height, canvas);
  }

  // Ändrar spelarens hastighet beroende på skärmtyp
  if (screenType == "pc") {
    player.speed = 1.4;
  } else {
    player.speed = 0.8;
  }
}