otroligafredde
asked on
Very simple car-physics question
First I want to say. Dont be scared of the length of this question. Just take the code and paste it into a
a frame in flash and it´ll start running. Its just there to show you the problem.
I´m trying to make a simple flashgame with cars. I found this code snippet from an earlier post here on Experts-Exchange that works well for driving a movieclip around on the screen. But it lacks skidding when turning the car.
I suck at math, so I´m looking for help with calculating the new x and y values for the car each round.
I think this should be a simple calculation in just one line of code here, but as I said, IÂÂà ƒÂ‚´m really lousy at math. Its a few lines of code to read through, but its very straightforward, so IÂÂà ƒÂ‚´m sure you will have no problem understand it.
After the code example I show you what I added to make it skid. And it looks a little better, but It ´s not the right way to do it.
this.onEnterFrame = function() {
var StageWidth:Number = 600;
var StageHeight:Number = 600;
// This determines what these variables do
keyLeft = Key.isDown(Key.LEFT);
keyRight = Key.isDown(Key.RIGHT);
//the reason why these two are not capitilized any is because "keyUp" and"keyDown" are commands in flash
keyup = Key.isDown(Key.UP);
keydown = Key.isDown(Key.DOWN);
// By pushing on certain keys, you get acceleration and decceleration
if (keyup) {
this.tspeed += .25;
}
if (keydown) {
this.tspeed -= 1.5;
if (this.tspeed<-7.5) {
this.tspeed = -7.5;
}
}
// Friction from ground; this can be any small number so that the car doesn't keep going
// if a key isn't pressed
this.tspeed *= .92;
// Velocity Change
idealxvelocity = this.tspeed*Math.cos(this. angle*Math .PI/180);
idealyvelocity = this.tspeed*Math.sin(this. angle*Math .PI/180);
// By taking the difference between the current velocity and ideal velocity,
// you get the actual velocity
// When you apply the friction, you get the actual velocities.
this.xvelocity += ((idealxvelocity-this.xvel ocity)*thi s.tfrictio n);
this.yvelocity += ((idealyvelocity-this.yvel ocity)*thi s.tfrictio n);
// By adding the velocities, you can get the new x and y positions
this._x += this.xvelocity;
this._y += this.yvelocity;
// By pushing the Left and Right keys, the car steers in that direction
if (keyLeft || keyRight) {
this.steering += (keyRight-keyLeft);
} else {
// When you let go of the Left and Right keys, the car goes back to going straight
this.steering += ((this.steering<0)-(this.s teering>0) );
}
// You want to make sure that when you steer that it doesn't start turning faster and faster
if (this.steering<-5) {
this.steering = -5;
}
if (this.steering>5) {
this.steering = 5;
}
// Now you can make the car turn based on actual speed and turning angle
actualSpeed = Math.sqrt((this.xvelocity* this.xvelo city)+(thi s.yvelocit y*this.yve locity));
this.angle += (( (this.steering*.80)*actual Speed)*.15 );
trace("steering " + this.steering);
this._angle = (this.angle+360)%360-180;
// Hit outside
if (this._x>=StageWidth) {
trace("Hit Wall");
}
if (this._x<0) {
trace("Hit Wall");
}
//if (this.x<=10) {
//this.x = 10;
//}
if (this._y>=StageHeight) {
trace("Hit Wall");
}
if (this._y<0) {
trace("Hit Wall");
}
//if (this.y<=-10) {
//this.y = -10;
//}
// You need to update the angles from radians to degrees so that it can turn
this._rotation = this.angle+90;
this._x = this.x;
this._y = this.y;
};
this is what I added. I marked the rows I added with a few ***. This makes it skid a little when turning, but not very good.
if (keyLeft || keyRight) {
*** if(this.xvelocity > 0) this._x += 0.5; ***
*** if(this.xvelocity < 0) this._x -= 0.5; ***
this.steering += (keyRight-keyLeft);
} else {
// When you let go of the Left and Right keys, the car goes back to going straight
this.steering += ((this.steering<0)-(this.s teering>0) );
}
Thanks in advance
/Fredrik
a frame in flash and it´ll start running. Its just there to show you the problem.
I´m trying to make a simple flashgame with cars. I found this code snippet from an earlier post here on Experts-Exchange that works well for driving a movieclip around on the screen. But it lacks skidding when turning the car.
I suck at math, so I´m looking for help with calculating the new x and y values for the car each round.
I think this should be a simple calculation in just one line of code here, but as I said, IÂÂÃ
After the code example I show you what I added to make it skid. And it looks a little better, but ItÂÂ
this.onEnterFrame = function() {
var StageWidth:Number = 600;
var StageHeight:Number = 600;
// This determines what these variables do
keyLeft = Key.isDown(Key.LEFT);
keyRight = Key.isDown(Key.RIGHT);
//the reason why these two are not capitilized any is because "keyUp" and"keyDown" are commands in flash
keyup = Key.isDown(Key.UP);
keydown = Key.isDown(Key.DOWN);
// By pushing on certain keys, you get acceleration and decceleration
if (keyup) {
this.tspeed += .25;
}
if (keydown) {
this.tspeed -= 1.5;
if (this.tspeed<-7.5) {
this.tspeed = -7.5;
}
}
// Friction from ground; this can be any small number so that the car doesn't keep going
// if a key isn't pressed
this.tspeed *= .92;
// Velocity Change
idealxvelocity = this.tspeed*Math.cos(this.
idealyvelocity = this.tspeed*Math.sin(this.
// By taking the difference between the current velocity and ideal velocity,
// you get the actual velocity
// When you apply the friction, you get the actual velocities.
this.xvelocity += ((idealxvelocity-this.xvel
this.yvelocity += ((idealyvelocity-this.yvel
// By adding the velocities, you can get the new x and y positions
this._x += this.xvelocity;
this._y += this.yvelocity;
// By pushing the Left and Right keys, the car steers in that direction
if (keyLeft || keyRight) {
this.steering += (keyRight-keyLeft);
} else {
// When you let go of the Left and Right keys, the car goes back to going straight
this.steering += ((this.steering<0)-(this.s
}
// You want to make sure that when you steer that it doesn't start turning faster and faster
if (this.steering<-5) {
this.steering = -5;
}
if (this.steering>5) {
this.steering = 5;
}
// Now you can make the car turn based on actual speed and turning angle
actualSpeed = Math.sqrt((this.xvelocity*
this.angle += (( (this.steering*.80)*actual
trace("steering " + this.steering);
this._angle = (this.angle+360)%360-180;
// Hit outside
if (this._x>=StageWidth) {
trace("Hit Wall");
}
if (this._x<0) {
trace("Hit Wall");
}
//if (this.x<=10) {
//this.x = 10;
//}
if (this._y>=StageHeight) {
trace("Hit Wall");
}
if (this._y<0) {
trace("Hit Wall");
}
//if (this.y<=-10) {
//this.y = -10;
//}
// You need to update the angles from radians to degrees so that it can turn
this._rotation = this.angle+90;
this._x = this.x;
this._y = this.y;
};
this is what I added. I marked the rows I added with a few ***. This makes it skid a little when turning, but not very good.
if (keyLeft || keyRight) {
*** if(this.xvelocity > 0) this._x += 0.5; ***
*** if(this.xvelocity < 0) this._x -= 0.5; ***
this.steering += (keyRight-keyLeft);
} else {
// When you let go of the Left and Right keys, the car goes back to going straight
this.steering += ((this.steering<0)-(this.s
}
Thanks in advance
/Fredrik
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
great!!