javascript - 游戏内子弹错误:未捕获类型错误:无法读取未定义的属性“长度”
问题描述
我真的很难为我正在为我的计算机科学课制作的多人游戏制作子弹。我正在使用socket.io,并且我正在将子弹数组从服务器发送到客户端,但是每当我尝试遍历我发送给客户端的数组时,它一直告诉我它是未定义的。有人对我有解决方案吗?提前致谢!我的代码如下:
game.js(客户端):
var socket = io();
var canvas = document.getElementById('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var context = canvas.getContext('2d');
var movement = {
up: false,
down: false,
left: false,
right: false
};
var mouse = {
mouseX: undefined,
mouseY: undefined
};
document.addEventListener('keydown', function(event) {
switch (event.keyCode) {
case 65: // A
movement.left = true;
break;
case 87: // W
movement.up = true;
break;
case 68: // D
movement.right = true;
break;
case 83: // S
movement.down = true;
break;
}
});
document.addEventListener('keyup', function(event) {
switch (event.keyCode) {
case 65: // A
movement.left = false;
break;
case 87: // W
movement.up = false;
break;
case 68: // D
movement.right = false;
break;
case 83: // S
movement.down = false;
break;
}
});
document.addEventListener('click', function(event){
mouse.mouseX = event.clientX;
mouse.mouseY = event.clientY;
socket.emit('mousePos', mouse);
});
socket.emit('new player');
setInterval(function() {
socket.emit('movement', movement);
}, 1000 / 30);
socket.on('state', function(data) {
var bullets = data.p;
var players = data.b;
context.clearRect(0, 0, canvas.width, canvas.height);
for (var id in players) {
context.save();
var player = players[id];
var img = new Image();
img.src = 'https://opengameart.org/sites/default/files/spaceship.pod_.1.green_.png';
context.translate(player.x + player.width / 2, player.y + player.height / 2);
context.rotate(player.rotation * Math.PI/180);
context.drawImage(img, -player.width / 2, -player.height / 2, player.width, player.height);
context.fill();
context.restore();
}
for (var i=0; i<bullets.length; i++) {
bullet = bullets[i];
var bmg = new Image();
bmg.src= 'https://s1.piq.land/2013/02/24/K22HRK2BcpIwVYDuzwgpicei_400x400.png';
context.drawImage(bmg, bullet.x, bullet.y, bullet.width, bullet.height);
}
});
server.js(服务器端):
// Dependencies.
var express = require('express');
var http = require('http');
var path = require('path');
var socketIO = require('socket.io');
var app = express();
var server = http.Server(app);
var io = socketIO(server);
app.set('port', 5000);
app.use('/static', express.static(__dirname + '/static'));
// Routing
app.get('/', function(request, response) {
response.sendFile(path.join(__dirname, 'index.html'));
});
server.listen(5000, function() {
console.log('Starting server on port 5000');
});
var players = {};
var bullets = [];
function Bullet(x, y, angle){
this.x = x;
this.y = y;
this.width = 40;
this.height = 40;
this.ang = angle;
this.speed = 15;
}
io.on('connection', function(socket) {
socket.on('new player', function() {
players[socket.id] = {
x: 300,
y: 300,
rotation: 0,
width: 70,
height: 70,
speed: 15,
health:100
};
});
socket.on('disconnect', function(){
delete players[socket.id];
});
socket.on('movement', function(data) {
var player = players[socket.id] || {};
if (data.left) {
player.rotation-=2*Math.PI;
}
if (data.up) {
player.x -= player.speed * Math.cos((player.rotation+90) * Math.PI / 180);
player.y -= player.speed * Math.sin((player.rotation+90) * Math.PI / 180);
}
if (data.right) {
player.rotation+=2*Math.PI;
}
if (data.down) {
player.x += player.speed * Math.cos((player.rotation+90) * Math.PI / 180);
player.y += player.speed * Math.sin((player.rotation+90) * Math.PI / 180);
}
});
socket.on('mousePos', function (mouse) {
bullets.push(new Bullet(players[socket.id].x, players[socket.id].y, players[socket.id].rotation));
})
});
setInterval(function() {
for (var i=0; i<bullets.length; i++) {
bullet = bullets[i];
bullet.x += bullet.speed * Math.cos((bullet.rotation+90) * Math.PI/180);
bullet.x += bullet.speed * Math.sin((bullet.rotation+90) * Math.PI/180);
}
io.sockets.emit('state', {p:players, b:bullets});
}, 1000 / 30);
这是我在控制台中遇到的错误:
game.js:82 Uncaught TypeError: Cannot read property 'length' of undefined
at r.<anonymous> (game.js:82)
at r.emit (index.js:83)
at r.onevent (index.js:83)
at r.onpacket (index.js:83)
at r.<anonymous> (index.js:83)
at r.emit (index.js:83)
at r.ondecoded (index.js:83)
at a.<anonymous> (index.js:83)
at a.r.emit (index.js:83)
at a.add (index.js:83)
解决方案
你有客户端的代码向后:
你有:
var bullets = data.p;
var players = data.b;
但它应该是:
var bullets = data.b;
var players = data.p;
推荐阅读
- javascript - Javascript,如何显示下一个日期
- php - 重新加载php后找不到类
- php - 引导程序不适用于 URL 重写
- spring-boot - Spring Zuul Gateway Swagger-UI 适用于所有微服务
- c# - PubNub 上的 StackOverflowException
- javascript - Angular2+ 在视图/模板中调用函数
- google-app-engine - Google App Engine 不适用于 GoDaddy 注册的自定义域
- java - Int 值的用户输入的冒泡排序数组
- python - 使用python构建拓扑时映射错误
- python - 需要重复Flask表单,一个表单类的多个实例