问题描述
我正在使用Node JS和Socket io制作2D多人剑术。 我有后端工作,但在前端我无法将剑固定在播放器上。 我希望它像 Sword is attached to player
但是问题是,当我移动鼠标时,剑会发生变化并且移到播放器外面。 Sword is not attached to player。因此,如果您想知道我的游戏的工作原理,基本上笑脸(玩家)总是指向鼠标(是的,它可能会颠倒过来),并且您可以使用箭头键移动玩家并使用剑杀死其他玩家。
这是我绘制玩家和剑的代码。
function drawImageLookat(img,x,y,lookx,looky){
ctx.setTransform(1,1,y); // set scale and origin
ctx.rotate(Math.atan2(looky - y,lookx - x)); // set angle
ctx.drawImage(img,-img.width / 2,-img.height / 2); // draw image
ctx.setTransform(1,0); // restore default not needed if you use setTransform for other rendering operations
}
const drawPlayer = (player) => {
const img = new Image()
const img2 = new Image()
img.src = "./assets/images/player.png"
img2.src = "./assets/images/sword.png"
img.onload = () => {
drawImageLookat(img,player.x,player.y,player.lookx,player.looky)
drawImageLookat(img2,player.x+50,player.looky)
}
};
socket.on('state',(gameState) => {
ctx.clearRect(0,1200,700)
for (let player in gameState.players) {
drawPlayer(gameState.players[player])
}
})
基本上,该“状态”每秒在游戏状态下发出60次。在游戏状态中,我们有玩家对象,其中包含诸如LookX(鼠标X位置),LookY(鼠标Y位置)以及玩家的X和Y之类的东西。下面的代码在服务器端。
const gameState = {
players: {}
}
io.on('connection',(socket) => {
socket.on('newPlayer',() => {
gameState.players[socket.id] = {
x: 250,y: 250,lookx: 0,looky: 0,width: 25,height: 25
}
})
//More stuff below here which is skipped
setInterval(() => {
io.sockets.emit('state',gameState);
},1000 / 60);
也是在客户端,这是我如何获取鼠标位置
//mouse stuf
var pos = 0;
document.addEventListener("mousemove",(e) => {
pos = getMousePos(e)
})
function getMousePos(evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,y: evt.clientY - rect.top
};
}
//send 2 server
setInterval(() => {
socket.emit('mouseAngle',pos);
socket.emit('playerMovement',playerMovement);
},1000 / 60);
因此,基本上我所希望的是,当我旋转鼠标时,播放器应该始终指向鼠标,并且剑附着在播放器的侧面并随之旋转...。 这是我的完整代码,如果您需要...
//SERVER.JS
var app = require('express')();
var express = require('express');
var path = require('path');
var http = require('http').createServer(app);
var io = require('socket.io')(http)
var htmlPath = path.join(__dirname,'client');
app.use(express.static(htmlPath));
const gameState = {
players: {}
}
io.on('connection',height: 25
}
})
socket.on('playerMovement',(playerMovement) => {
const player = gameState.players[socket.id]
const canvasWidth = 1200
const canvasHeight = 700
if (playerMovement.left && player.x > 0) {
player.x -= 4
}
if (playerMovement.right && player.x < canvasWidth - player.width) {
player.x += 4
}
if (playerMovement.up && player.y > 0) {
player.y -= 4
}
if (playerMovement.down && player.y < canvasHeight - player.height) {
player.y += 4
}
})
socket.on("mouseAngle",(pos) => {
const player = gameState.players[socket.id]
player.lookx = pos.x;
player.looky = pos.y;
})
socket.on("disconnect",() => {
delete gameState.players[socket.id]
})
})
setInterval(() => {
io.sockets.emit('state',1000 / 60);
http.listen(3000,() => {
console.log('listening on *:3000');
});
//Client/Index.html
var app = require('express')();
var express = require('express');
var path = require('path');
var http = require('http').createServer(app);
var io = require('socket.io')(http)
var htmlPath = path.join(__dirname,() => {
console.log('listening on *:3000');
});
//Client/Assets/Js/script.js
var socket = io();
var canvas = document.getElementById("game");
const ctx = canvas.getContext("2d")
document.getElementById("game").width =1200;
document.getElementById("game").height = 700;
socket.emit('newPlayer');
//mouse stuff
function drawImageLookat(img,700)
for (let player in gameState.players) {
drawPlayer(gameState.players[player])
}
})
//Client/assets/js/Controller.js
//v1
var canvas = document.getElementById("game")
const playerMovement = {
up: false,down: false,left: false,right: false
};
const keyDownHandler = (e) => {
if (e.keyCode == 39 || e.keyCode == 68) {
playerMovement.right = true;
} else if (e.keyCode == 37 || e.keyCode == 65) {
playerMovement.left = true;
} else if (e.keyCode == 38 || e.keyCode == 87) {
playerMovement.up = true;
} else if (e.keyCode == 40 || e.keyCode == 83) {
playerMovement.down = true;
}
};
const keyUpHandler = (e) => {
if (e.keyCode == 39 || e.keyCode == 68) {
playerMovement.right = false;
} else if (e.keyCode == 37 || e.keyCode == 65) {
playerMovement.left = false;
} else if (e.keyCode == 38 || e.keyCode == 87) {
playerMovement.up = false;
} else if (e.keyCode == 40 || e.keyCode == 83) {
playerMovement.down = false;
}
};
document.addEventListener('keydown',keyDownHandler,false);
document.addEventListener('keyup',keyUpHandler,false);
//mouse stuf
var pos = 0;
document.addEventListener("mousemove",1000 / 60);
如果您能帮助我,谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)