Javascript 如何使汽车在道路上行驶
我正在用javascript开发一个动画,其中一辆汽车朝着一个人移动并拾取,但目前我只是沿着对角线方向行驶,而不是沿着下面代码的人Javascript 如何使汽车在道路上行驶,javascript,jquery,html,canvas,Javascript,Jquery,Html,Canvas,我正在用javascript开发一个动画,其中一辆汽车朝着一个人移动并拾取,但目前我只是沿着对角线方向行驶,而不是沿着下面代码的人 Car.prototype.main = function() { var angle = angleBetweenTwoPoints(this.target.position, this.position); var cos = Math.cos(degreeToRadian(angle)) * -1; var sin = Ma
Car.prototype.main = function() {
var angle = angleBetweenTwoPoints(this.target.position, this.position);
var cos = Math.cos(degreeToRadian(angle)) * -1;
var sin = Math.sin(degreeToRadian(angle));
var _this = _super.call(this) || this;
this.angle = angle;
this.position.x += cos * this.speed;
this.position.y -= sin * this.speed;
if (distance(this.position, this.target.position) < 10 && this.image == GameImage.getImage("hero") ) {
this.target.position.x = Math.random() * mainCanvas.width;
this.target.position.y = Math.random() * mainCanvas.height;
this.hitCount++;
console.log(hitCount);
ctx.fillText("points : " + hitCount, 32, 32);
this.changeImage = true;
_this.speed = 3;
this.changeImageTime = Date.now() + 600; //0.5 sec from now.
this.image = (this.image == GameImage.getImage("hero"))? GameImage.getImage("hero_other") : GameImage.getImage("hero");
}
if(this.changeImage){
if(Date.now() > this.changeImageTime){
this.changeImage = false;
_this.speed = 9;
this.image = (this.image == GameImage.getImage("hero_other"))? GameImage.getImage("hero") : GameImage.getImage("hero_other");
}
}
};
return Car;
}(Actor));
Car.prototype.main=函数(){
变量角度=两点之间的角度(this.target.position,this.position);
var cos=数学cos(度弧度(角度))*-1;
var sin=数学sin(度弧度(角度));
var _this=_super.call(this)| this;
这个角度=角度;
this.position.x+=cos*this.speed;
this.position.y-=sin*this.speed;
if(距离(this.position,this.target.position)<10&&this.image==GameImage.getImage(“英雄”)){
this.target.position.x=Math.random()*maincavus.width;
this.target.position.y=Math.random()*maincavas.height;
这个.hitCount++;
控制台日志(命中率);
ctx.fillText(“点数:”+hitCount,32,32);
this.changeImage=true;
_这个速度=3;
this.changeMageTime=Date.now()+600;//0.5秒后。
this.image=(this.image==GameImage.getImage(“英雄”)?GameImage.getImage(“英雄”):GameImage.getImage(“英雄”);
}
if(this.changeImage){
if(Date.now()>this.changeMageTime){
this.changeImage=false;
_这个速度=9;
this.image=(this.image==GameImage.getImage(“hero_other”)?GameImage.getImage(“hero”):GameImage.getImage(“hero_other”);
}
}
};
返回车;
}(演员);
但是我想沿着一条路径走。当你点击图像时,我也创建了一些网格,它记录在控制台上,它是哪一个网格。但是我无法在路径中移动汽车。为了完全理解动画,我在
如有任何帮助,请排队等候。
对于航路点路径跟踪,您使用一种称为队列的数组类型。顾名思义,队列包含需要使用的项目,特别是它们需要按照到达的顺序使用。队列上的第一个对象是输出的第一个对象(除非按入队列)
在javascript中,使用数组很容易实现队列
const path = {
points : [],
currentPos : null,
dist : 0,
totalDistMoved : 0,
atEnd : false,
addPoint(x,y) {
if(this.currentPos === null){
this.currentPos = { x :0,y : 0};
this.dist = 0;
this.totalDistMoved = 0;
}
this.points.push({x,y}) ;
},
moveAlong(dist){
if(dist > 0){
if(this.points.length > 1){
var x = this.points[1].x - this.points[0].x;
var y = this.points[1].y - this.points[0].y;
var len = Math.sqrt(x*x+y*y) ;
if(len - this.dist < dist){
this.points.shift();
dist -= (len - this.dist);
this.totalDistMoved += (len - this.dist);
this.dist = 0;
this.moveAlong(dist);
return;
}
const frac = this.dist + dist / len;
this.currentPos.x = this.points[0].x + x * frac;
this.currentPos.y = this.points[0].y + y * frac;
this.dist += dist;
this.totalDistMoved += dist;
}else{
this.currentPos.x = this.points[0].x;
this.currentPos.y = this.points[0].y;
this.dist = 0;
this.atEnd = true;
}
}
}
}
然后,为动画的每一步获得一段距离
path.moveAlong(10); // move ten pixels
并使用当前位置
ctx.drawImage(car,path.currentPos.x,path.currentPos.y);
你知道你已经走到了路的尽头
if(path.atEnd) {
// you have arrived
}
任何时候,你都知道自己已经走了多远
path.totalDistMoved
这适用于仅向前播放的动画。它将忽略负距离,因为当您通过这些点时,它们会被丢弃
如果您希望重用路径对象,或者如果正在添加航路点,则需要进行一些修改
一个简单的例子。
物体以恒定的速度前进。单击页面以添加更多航路点
const ctx=canvas.getContext(“2d”);
requestAnimationFrame(主循环);
函数主循环(时间){
gTime=!gTime?时间:gTime;
fTime=时间-gTime;
gTime=时间;
if(canvas.width!==innerWidth | | canvas.height!==innerHeight){
canvas.width=内部宽度;
canvas.height=内部高度;
}否则{
setTransform(1,0,0,1,0,0);
clearRect(0,0,canvas.width,canvas.height);
}
如果(鼠标按钮){
如果(!点){
点={x:0,y:0};
路径.添加点(点);
}
point.x=mouse.x;
point.y=mouse.y;
}否则{
如果(点){point=null}
}
ctx.beginPath();
var i=0;
而(i0){
如果(this.points.length>1){
var x=this.points[1].x-this.points[0].x;
var y=this.points[1].y-this.points[0].y;
var len=数学sqrt(x*x+y*y);
如果(len-this.distAlong path.totalDistMoved