Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使精灵运动平稳,当它';我们朝着一个物体移动_Javascript_Html_Canvas_Sprite - Fatal编程技术网

Javascript 使精灵运动平稳,当它';我们朝着一个物体移动

Javascript 使精灵运动平稳,当它';我们朝着一个物体移动,javascript,html,canvas,sprite,Javascript,Html,Canvas,Sprite,我正在制作一个鱼精灵动画。当前,当我添加一块食物时,精灵动画将向前移动以吃它。但我无法让它平稳地游向食物。有时,精灵动画会上下移动,直到到达食物 以下是精灵动画如何向食物移动: Fish.prototype.chaseFood = function(index) { if (this.xPos > foodArray[index].x + foodWidth) { this.speedX = -1 * Math.abs(this.speedX); } els

我正在制作一个鱼精灵动画。当前,当我添加一块食物时,精灵动画将向前移动以吃它。但我无法让它平稳地游向食物。有时,精灵动画会上下移动,直到到达食物

以下是精灵动画如何向食物移动:

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);
    }
};
Fish.prototype.chaseFood=功能(索引){
如果(this.xPos>foodArray[index].x+foodWidth){
this.speedX=-1*Math.abs(this.speedX);
}else if(this.xPosfoodaray[index].y+foodHeight){
this.speedY=-1*Math.abs(this.speedY);
}else if(this.yPos

有没有办法让它游得更平稳,而不是朝着食物上下移动。

我会计算鱼和食物之间的角度,让鱼朝这个角度移动

以下是一些帮助器函数,可以帮助您继续:

function distanceBetweenPoints(a, b)
{
    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));
}

function angleBetweenPoints(a, b)
{
    return Math.atan2(b.y-a.y,b.x-a.x)*180/Math.PI;
}
用法:

var angle = angleBetweenPoints({ x: fish.x, y: fish.y }, { x: food.x, y: food.y });
然后,您可以执行以下操作:

fish.x += Math.sin(angle * Math.PI / 180) * 10;
fish.y += Math.cos(angle * Math.PI / 180) * 10;

我想你希望你的精灵从一组坐标(它的位置)直接移动到另一组坐标(食物的位置)。

如果你的x坐标是6个像素的差,y坐标是4个像素的差,那么当我们增加我们快乐的小鱼的x和y偏移量时,我们希望保持6:4的比例

在这种情况下,我们可以将程序更改为一次移动x 1个像素,然后一次移动y 4/6个像素,这样就可以沿着一条直接通向目标的路径前进。如果我们将y增加一个完整像素,它将直接到达目标下方,然后笔直向上。这将是一条间接的道路,看起来不太现实

事实上,我认为如果你使用1:1的比例,它会到达目标的左边,然后在旧版本中直接向右移动,但我认为你知道我的意思

我将尝试根据您的代码改编一个示例:

int fishSpeed = 2;
float xOffset = fishSpeed;
float yOffset = fishSpeed;
float xDis = abs(this.xPos-(foodArray[index].x + foodWidth));
float yDis = abs(this.yPos-(foodArray[index].y + foodWidth));
//each offset changes depending on how far it is from goal
xOffset = xOffset * (xDis / (xDis + yDis));
yOffset = yOffset * (yDis / (xDis + yDis));

if(this.xPos > foodArray[index].x) this.xPos+=xOffset;
if(this.yPos > foodArray[index].y) this.yPos+=yOffset;
if(this.xPos < foodArray[index].x) this.xPos-=xOffset;
if(this.yPos < foodArray[index].y) this.yPos-=yOffset;
int-fishSpeed=2;
浮动xOffset=打捞速度;
浮动yOffset=鱼速;
float xDis=abs(this.xPos-(foodArray[index].x+foodWidth));
float yDis=abs(this.yPos-(foodArray[index].y+foodWidth));
//每个偏移量根据距离目标的距离而变化
xOffset=xOffset*(xDis/(xDis+yDis));
yOffset=yOffset*(yDis/(xDis+yDis));
如果(this.xPos>foodArray[index].x)this.xPos+=xOffset;
如果(this.yPos>foodArray[index].y)this.yPos+=yOffset;
如果(this.xPos
很抱歉,我无法使用您的示例使其生效。我不知道它是否会有帮助,但这里有一个完整的.htm文件,其中有一个兔子wabbit,由鼠标控制,另一个wabbit直接跟踪。wabbit将直接实现其目标。该文件需要在同一目录下处理.js

<!DOCTYPE html>
<html>
<body bgcolor="lightblue"   style="margin:0;">
<center>
<script src="processing.js"></script>
<script type="application/processing">

void setup(){
    size(screen.width*.9,screen.height*.9);
    blueWabbit = new wabbit(600,600,105);
    pinkWabbit = new wabbit(100,100,100);
    blueWabbit.blue = 255;
    blueWabbit.red = 128;
    blueWabbit.green = 128;

    wabbitSpeed = 5;
    }

void draw() { 

    float xOffset = wabbitSpeed;
    float yOffset = wabbitSpeed;
    float xDis = abs(pinkWabbit.xpos-blueWabbit.xpos);
    float yDis = abs(pinkWabbit.ypos-blueWabbit.ypos);
    xOffset = xOffset * (xDis / (xDis + yDis));
    yOffset = yOffset * (yDis / (xDis + yDis));

    if(pinkWabbit.xpos > blueWabbit.xpos) blueWabbit.xpos+=xOffset;
    if(pinkWabbit.ypos > blueWabbit.ypos) blueWabbit.ypos+=yOffset;
    if(pinkWabbit.xpos < blueWabbit.xpos) blueWabbit.xpos-=xOffset;
    if(pinkWabbit.ypos < blueWabbit.ypos) blueWabbit.ypos-=yOffset;

    if (xDis+yDis<wabbitSpeed){
        for(int a =0;a<20; a++)babyWabbit();
    }
    else background(0,0,0,0);

    pinkWabbit.show();
    blueWabbit.show();
    pinkWabbit.xpos = mouseX;
    pinkWabbit.ypos = mouseY;


    /*
    fill(0);
    text("blue x = "+(int)blueWabbit.xpos,10,10);
    text("blue y = "+(int)blueWabbit.ypos,10,20);
    text("pink x = "+pinkWabbit.xpos,10,30);
    text("pink y = "+pinkWabbit.ypos,10,40);
    text("xOffset = "+xOffset,10,50);
    text("yOffset = "+yOffset,10,60);
    text("xDis = "+(int)xDis,10,70);
    text("yDis = "+(int)yDis,10,80);
    */
    } 


class wabbit { 
    //declare the properties that will be used as variables for the object
    float xpos, ypos, diameter; 
    int red, blue, green;
    //define the parameters for the creation of a new class
    wabbit (float x, float y, float wSize) {  
        xpos = x;
        ypos = y; 
        diameter = wSize;
        //radius = .5 * diameter;
        //make it pink if user did not define colors
        if (!(0>red>256)) red = 255;
        if (!(0>green>256))green = 200;
        if (!(0>blue>256)) blue = 200;
        } 
  void show() { 
    noStroke();
    for(a = diameter; a > 0; a-=5){
        fill(red-a,green-a,blue-a);
        //belly and head
        ellipse(xpos, ypos, a, a); 
        ellipse(xpos, ypos-diameter*.7, a*.7,a*.7);
        //feets
        ellipse(xpos-.2*diameter, ypos+diameter*.4, a*.4,a*.4);
        ellipse(xpos+.2*diameter, ypos+diameter*.4, a*.4,a*.4);
        //ears
        ellipse(xpos-.2*diameter, ypos-diameter, a*.2,a*.8);
        ellipse(xpos+.2*diameter, ypos-diameter, a*.2,a*.8);
        }
  } 
}

void babyWabbit(){
 noStroke();
var red=random(1,255);
var green=random(1,255);
var blue=random(1,255);
var xpos=random(1,width);
var ypos=random(1,height);
var diameter = random(20,80);
    for(var a = diameter; a > 0; a-=5){
        fill(red-a,green-a,blue-a);
        //belly and head
        ellipse(xpos, ypos, a, a); 
        ellipse(xpos, ypos-diameter*.7, a*.7,a*.7);
        //feets
        ellipse(xpos-.2*diameter, ypos+diameter*.4, a*.4,a*.4);
        ellipse(xpos+.2*diameter, ypos+diameter*.4, a*.4,a*.4);
        //ears
        ellipse(xpos-.2*diameter, ypos-diameter, a*.2,a*.8);
        ellipse(xpos+.2*diameter, ypos-diameter, a*.2,a*.8);
        }
}

</script><canvas></canvas> 
</body>
</html>

无效设置(){
尺寸(屏幕宽度*.9,屏幕高度*.9);
blueWabbit=新wabbit(600105);
pinkWabbit=新wabbit(100100);
blueWabbit.blue=255;
blueWabbit.red=128;
blueWabbit.green=128;
wabbitSpeed=5;
}
void draw(){
浮动xOffset=瓦比速度;
浮动yOffset=wabbitSpeed;
float xDis=abs(pinkWabbit.xpos blueWabbit.xpos);
浮动yDis=abs(pinkWabbit.ypos blueWabbit.ypos);
xOffset=xOffset*(xDis/(xDis+yDis));
yOffset=yOffset*(yDis/(xDis+yDis));
如果(pinkWabbit.xpos>blueWabbit.xpos)blueWabbit.xpos+=xOffset;
如果(pinkWabbit.ypos>blueWabbit.ypos)blueWabbit.ypos+=yOffset;
如果(pinkWabbit.xpos绿色>256))绿色=200;
如果(!(0>蓝色>256))蓝色=200;
} 
void show(){
仰泳();
对于(a=直径;a>0;a-=5){
填充物(红色a、绿色a、蓝色a);
//腹部和头部
椭圆(XPO、YPO、a、a);
椭圆(xpos,YPO直径*.7,a*.7,a*.7);
//费尔茨
椭圆(xpos-.2*直径,ypos+直径*.4,a*.4,a*.4);
椭圆(xpos+.2*直径,ypos+直径*.4,a*.4,a*.4);
//耳朵
椭圆(xpos-.2*直径,ypos直径,a*.2,a*.8);
椭圆(xpos+.2*直径,ypos直径,a*.2,a*.8);
}
} 
}
void babyWabbit(){
仰泳();
var red=随机(1255);
绿色变量=随机(1255);
var blue=随机(1255);
var xpos=随机(1,宽度);
var ypos=随机(1,高度);
变量直径=随机(20,80);
对于(变量a=直径;a>0;a-=5){
填充物(红色a、绿色a、蓝色a);
//腹部和头部
椭圆(XPO、YPO、a、a);
椭圆(xpos,YPO直径*.7,a*.7,a*.7);
//费尔茨
椭圆(xpos-.2*直径,ypos+直径*.4,a*.4,a*.4);
椭圆(xpos+.2*直径,ypos+直径*.4,a*.4,a*.4);
//耳朵
椭圆(xpos-.2*直径,ypos直径,a*.2,a*.8);
椭圆(xpos+.2*直径,ypos直径,a*.2,a*.8);
}
}

问题是您总是以1或-1移动。如果你的精灵必须向右移动10个单位,向下移动5个单位,那么它应该向右移动,x的移动速率是y的两倍。我将首先计算精灵点和对象点之间的直线斜率,并使用变量来决定向.speedX和.speedY添加什么。