我正在尝试制作一个收集游戏。它仍在进行中。我想要完成的是在画布上的矩形中添加碰撞检测,这样精灵就无法通过它进行相位调整。我知道如何添加碰撞,所以我的精灵不会离开画布。我的矩形位于画布的不同点上,它们的大小各不相同。我想知道我应该怎么做呢?
此外,完全可选,我应该怎么做才能让玩家在与狗交谈之前收集所有的收藏品。有点像一个任务。
如果我所描述的内容没有任何意义,我是新手,所以道歉。
谢谢!
这是现场:https://yewtreedesign.github.io/441_HW/HW11/index.html
我试图在“if”中使用ctx.rect作为值
function moveCharacter(deltaX, deltaY, direction) {
if (positionX + deltaX > 0 && positionX + SCALED_WIDTH + deltaX < canvas.width) {
positionX += deltaX;
}
if (positionY + deltaY > 0 && positionY + SCALED_HEIGHT + deltaY < canvas.height) {
positionY += deltaY;
}
但精灵陷入困境。
<script>
const SCALE = 1;
const WIDTH = 18;
const HEIGHT = 31;
const SCALED_WIDTH = SCALE * WIDTH;
const SCALED_HEIGHT = SCALE * HEIGHT;
const CYCLE_LOOP = [0, 1, 0, 2];
const FACING_DOWN = 0;
const FACING_UP = 1;
const FACING_LEFT = 2;
const FACING_RIGHT = 3;
const FRAME_LIMIT = 12;
const MOVEMENT_SPEED = 1;
let canvas = document.querySelector('canvas');
let ctx = canvas.getContext('2d');
let keyPresses = {};
let currentDirection = FACING_DOWN;
let currentLoopIndex = 0;
let frameCount = 0;
let positionX = 0;
let positionY = 0;
let img = new Image();
let shiba = new Image();
let rays = new Image();
let doritos = new Image();
let walls= new Image();
window.addEventListener('keydown', keyDownListener);
function keyDownListener(event) {
keyPresses[event.key] = true;
}
window.addEventListener('keyup', keyUpListener);
function keyUpListener(event) {
keyPresses[event.key] = false;
}
function loadImage() {
walls.src='image/walls.png'
img.src = 'atlus/mainsprite.png';
shiba.src = 'image/shiba.gif';
rays.src='image/shades.png';
doritos.src='image/dorit.png';
img.onload = function() {
window.requestAnimationFrame(gameLoop);
};
}
function drawFrame(frameX, frameY, canvasX, canvasY) {
ctx.beginPath();
ctx.drawImage(shiba, 225,20);
ctx.closePath();
ctx.beginPath();
ctx.drawImage(rays, 400,20);
ctx.drawImage(doritos, 420,250);
ctx.drawImage(img,
frameX * WIDTH, frameY * HEIGHT, WIDTH, HEIGHT,
canvasX, canvasY, SCALED_WIDTH, SCALED_HEIGHT);
ctx.drawImage(walls,0,0);
ctx.closePath();
}
function drawWalls(){
ctx.beginPath();
ctx.rect(105.3, -1, 14.1, 73.5);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.rect(366.5, -1, 14.1, 73.5);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.rect(367, 173.2, 120, 14.1);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.rect(-1, 173.2, 120, 14.1);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.rect(105.3, 267.5, 14.1, 73.5);
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.rect(366.5, 267.5, 14.1, 73.5);
ctx.stroke();
ctx.closePath();
}
loadImage();
function gameLoop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
let hasMoved = false;
if (keyPresses.ArrowUp) {
moveCharacter(0, -MOVEMENT_SPEED, FACING_UP);
hasMoved = true;
} else if (keyPresses.ArrowDown) {
moveCharacter(0, MOVEMENT_SPEED, FACING_DOWN);
hasMoved = true;
}
if (keyPresses.ArrowLeft) {
moveCharacter(-MOVEMENT_SPEED, 0, FACING_LEFT);
hasMoved = true;
} else if (keyPresses.ArrowRight) {
moveCharacter(MOVEMENT_SPEED, 0, FACING_RIGHT);
hasMoved = true;
}
if (hasMoved) {
frameCount++;
if (frameCount >= FRAME_LIMIT) {
frameCount = 0;
currentLoopIndex++;
if (currentLoopIndex >= CYCLE_LOOP.length) {
currentLoopIndex = 0;
}
}
}
if (!hasMoved) {
currentLoopIndex = 0;
}
drawFrame(CYCLE_LOOP[currentLoopIndex], currentDirection, positionX, positionY);
window.requestAnimationFrame(gameLoop);
}
function moveCharacter(deltaX, deltaY, direction) {
if (positionX + deltaX > 0 && positionX + SCALED_WIDTH + deltaX < canvas.width) {
positionX += deltaX;
}
if (positionY + deltaY > 0 && positionY + SCALED_HEIGHT + deltaY < canvas.height) {
positionY += deltaY;
}
currentDirection = direction;
}
</script>
现在代码正在显示它应该的东西,只是在对象之间没有碰撞检测,除了画布的边框与精灵。
更新:感谢ellertsmari,我能够在我的控制台上进行冲突检测以进行注册和读取。有碰撞检测。我试图得到它所以我的角色会停止检测,所以精灵不会走过它。我目前正在研究它。如果有人知道如何让它工作,这将是伟大的。如果我能够自己找到它,我会在这里更新代码供其他人查看:]。
更新的代码:(链接也更新)
const SCALE = 1;
const WIDTH = 18;
const HEIGHT = 31;
const SCALED_WIDTH = SCALE * WIDTH;
const SCALED_HEIGHT = SCALE * HEIGHT;
const CYCLE_LOOP = [0, 1, 0, 2];
const FACING_DOWN = 0;
const FACING_UP = 1;
const FACING_LEFT = 2;
const FACING_RIGHT = 3;
const FRAME_LIMIT = 12;
const MOVEMENT_SPEED = 1;
let canvas = document.querySelector('canvas');
let ctx = canvas.getContext('2d');
let keyPresses = {};
let currentDirection = FACING_DOWN;
let currentLoopIndex = 0;
let frameCount = 0;
let positionX = 0;
let positionY = 0;
let img = new Image();
let shiba = new Image();
let rays = new Image();
let doritos = new Image();
let walls= [{"id": "wall1", "x": 105.3, "y": -1, "width": 14.1, "height": 73.5},
{"id": "wall2", "x": 366.5, "y": -1, "width": 14.1, "height": 73.5},
{"id": "wall3", "x": 367, "y": 173.2, "width": 120, "height": 14.1},
{"id": "wall4", "x": -1, "y": 173.2, "width": 120, "height": 14.1},
{"id": "wall5", "x": 105.3, "y": 267.5, "width": 14.1, "height": 73.5},
{"id": "wall6", "x": 366.5, "y": 267.5, "width": 14.1, "height": 73.5}
];
function drawWalls(){
for(var i=0; i< walls.length; i++){
ctx.fillStyle="white";
ctx.fillRect(walls[i].x, walls[i].y, walls[i].width,walls[i].height);
}
}
function collidingWith(walls){
console.log("you are colliding with:", walls.id);
}
window.addEventListener('keydown', keyDownListener);
function keyDownListener(event) {
keyPresses[event.key] = true;
}
window.addEventListener('keyup', keyUpListener);
function keyUpListener(event) {
keyPresses[event.key] = false;
}
function loadImage() {
img.src = 'atlus/mainsprite.png';
shiba.src = 'image/shiba.gif';
rays.src='image/shades.png';
doritos.src='image/dorit.png';
img.onload = function() {
window.requestAnimationFrame(gameLoop);
};
}
function drawFrame(frameX, frameY, canvasX, canvasY) {
ctx.beginPath();
ctx.drawImage(shiba, 225,20);
ctx.closePath();
ctx.beginPath();
ctx.drawImage(rays, 400,20);
ctx.drawImage(doritos, 420,250);
ctx.drawImage(img,
frameX * WIDTH, frameY * HEIGHT, WIDTH, HEIGHT,
canvasX, canvasY, SCALED_WIDTH, SCALED_HEIGHT);
ctx.closePath();
}
loadImage();
function gameLoop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawWalls();
let hasMoved = false;
if (keyPresses.ArrowUp) {
moveCharacter(0, -MOVEMENT_SPEED, FACING_UP);
hasMoved = true;
} else if (keyPresses.ArrowDown) {
moveCharacter(0, MOVEMENT_SPEED, FACING_DOWN);
hasMoved = true;
}
if (keyPresses.ArrowLeft) {
moveCharacter(-MOVEMENT_SPEED, 0, FACING_LEFT);
hasMoved = true;
} else if (keyPresses.ArrowRight) {
moveCharacter(MOVEMENT_SPEED, 0, FACING_RIGHT);
hasMoved = true;
}
if (hasMoved) {
frameCount++;
if (frameCount >= FRAME_LIMIT) {
frameCount = 0;
currentLoopIndex++;
if (currentLoopIndex >= CYCLE_LOOP.length) {
currentLoopIndex = 0;
}
}
}
if (!hasMoved) {
currentLoopIndex = 0;
}
drawFrame(CYCLE_LOOP[currentLoopIndex], currentDirection, positionX, positionY);
window.requestAnimationFrame(gameLoop);
}
function moveCharacter(deltaX, deltaY, direction) {
walls.forEach(walls=>{
if( positionX + deltaX + SCALED_WIDTH > walls.x && positionX + deltaX < walls.x + walls.width
&& positionY + deltaY + SCALED_HEIGHT > walls.y && positionY + deltaY < walls.y + walls.height
){
collidingWith(walls);
}
})
if (positionX + deltaX > 0 && positionX + SCALED_WIDTH + deltaX < canvas.width) {positionX += deltaX;}
if (positionY + deltaY > 0 && positionY + SCALED_HEIGHT + deltaY < canvas.height) {positionY += deltaY;}
currentDirection = direction;
}