目前我正在研究鱼类动画。我的鱼精灵是动画的,能够在画布上自由移动。其次,我想添加食物来喂养画布上的鱼。但是目前我被卡住了,当它在画布上画画时,无法让鱼儿游向食物。
以下是我的鱼精灵随机移动的方式:
Fish.prototype.changeDirection = function () {
var me = this;
var speedXSign = Math.random() < 0.5 ? 1 : -1;
var speedYSign = Math.random() < 0.5 ? 1 : -1;
this.speedX = speedXSign * (1 + Math.random() * 1.6);
this.speedY = speedYSign * (1 + Math.random() * 1.6);
var time = 1000 + 2000*Math.random();
setTimeout(function() {me.changeDirection()}, time);
};
Fish.prototype.move = function () {
this.animIndex++;
if ( this.animIndex == animFrames.length) this.animIndex = 0;
this.xPos += this.speedX;
if ((this.xPos + this.frameWidth * this.frameScale / 1.8) >= canvas.width && this.speedX > 0 ||
(this.xPos - this.frameWidth * this.frameScale / 1.8) <= 0 && this.speedX <= 0) {
this.speedX = -this.speedX;
}
this.yPos += this.speedY;
if ((this.yPos + this.frameHeight * this.frameScale / 1.8) >= canvas.height && this.speedY > 0 ||
(this.yPos - this.frameHeight * this.frameScale / 1.8) <= 0 && this.speedY <= 0) {
this.speedY = -this.speedY;
}
};
现在,当我在画布上点击时,食物将会出现,并与X和Y偏移一起出现。
function addFood(foodArray){
var iiimage = new Image();
iiimage.src = 'Images/redFood.png';
for(var m = 0 ; m<foodArray.length;m++){
var x = foodArray[m].x;
var y = foodArray[m].y;
context.drawImage(iiimage,x,y,50,50);
}
}
function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
canvas.onmousedown = function(e){
foodX = getMousePos(canvas,e).x;
foodY = getMousePos(canvas,e).y;
food = {x:foodX,y:foodY};
foodArray.push(food);
console.log('('+foodX+','+foodY+')');
console.log(food);
console.log(foodArray.length);
}
是否有可能让鱼精灵改变它的方向到最近的食物,然后在鱼精灵与食物接触后再回到它的随机运动。
答案 0 :(得分:0)
这是我更新的fiddle,现在我将解释我所做的更改。
添加食物宽度和高度的变量:
...
var foodArray = [];
var foodWidth = 50;
var foodHeight = 50;
var food;
...
更新绘图功能以使用这些变量:
function addFood(foodArray) {
...
var x = foodArray[m].x;
var y = foodArray[m].y;
context.drawImage(iiimage, x, y, foodWidth, foodHeight);
...
}
添加功能以找到最近的食物:
Fish.prototype.closestFood = function () {
var closestFoodIndex = -1;
var shortestDistance = Infinity;
for (var i = 0; i < foodArray.length; i++) {
var distance = Math.max(Math.abs(this.xPos - foodArray[i].x), Math.abs(this.yPos - foodArray[i].y));
if (distance < shortestDistance) {
shortestDistance = distance;
closestFoodIndex = i;
}
}
return closestFoodIndex;
};
添加功能以改变对食物的指示:
Fish.prototype.chaseFood = function(index) {
if (this.xPos > foodArray[index].x + foodWidth) {
this.speedX = -1 * Math.abs(this.speedX);
} else if (this.xPos < foodArray[index].x) {
this.speedX = Math.abs(this.speedX);
}
if (this.yPos > foodArray[index].y + foodHeight) {
this.speedY = -1 * Math.abs(this.speedY);
} else if (this.yPos < foodArray[index].y) {
this.speedY = Math.abs(this.speedY);
}
};
添加变量以跟踪鱼在追逐食物的时间:
function Fish(xPos, yPos, speedX, speedY, imgFish, frameWidth, frameHeight) {
...
this.chasingFood = false;
...
}
添加一种功能,可以吃鱼下的任何食物:
Fish.prototype.eatFood = function() {
var foodX, foodY;
var halfWidth = this.frameWidth * this.frameScale / 2;
var halfHeight = this.frameHeight * this.frameScale / 2;
// Loop backward because we are removing elements.
for (var i = foodArray.length-1; i >= 0; i--) {
foodX = foodArray[i].x + foodWidth / 2;
foodY = foodArray[i].y + foodHeight / 2;
if (foodX > this.xPos - halfWidth &&
foodX < this.xPos + halfWidth &&
foodY > this.yPos - halfHeight&&
foodY < this.yPos + halfHeight)
{
foodArray.splice(i, 1);
}
}
};
更新移动功能,吃食物,寻找食物并追逐它:
Fish.prototype.move = function () {
...
this.eatFood();
var closestFoodIndex = this.closestFood();
if (closestFoodIndex >= 0) {
this.chasingFood = true;
this.chaseFood(closestFoodIndex);
} else {
this.chaseingFood = false;
}
...
};
更新改变方向功能,仅在不追逐食物时改变方向:
Fish.prototype.changeDirection = function () {
var me = this;
if (!this.chasingFood) {
var speedXSign = Math.random() < 0.5 ? 1 : -1;
var speedYSign = Math.random() < 0.5 ? 1 : -1;
this.speedX = speedXSign * (1 + Math.random() * 1.6);
this.speedY = speedYSign * (1 + Math.random() * 1.6);
}
var time = 1000 + 2000 * Math.random();
setTimeout(function () {
me.changeDirection();
}, time);
};
这只会使鱼改变x和y方向,而不是速度。可以修改chaseFood功能以使它们加速,或者可以直接进食(尽管这可能会使动画看起来很奇怪)。
如果您需要有关任何新代码的更多说明,请发表评论。