Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# Very simple car-physics question

Posted on 2007-11-15
Medium Priority
1,001 Views
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.xvelocity)*this.tfriction);
this.yvelocity += ((idealyvelocity-this.yvelocity)*this.tfriction);
// 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.steering>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.xvelocity)+(this.yvelocity*this.yvelocity));
this.angle += (( (this.steering*.80)*actualSpeed)*.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.steering>0));
}

/Fredrik
0
Question by:otroligafredde
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 84

Accepted Solution

ozo earned 2000 total points
ID: 20296912
maybe try something like

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.xvelocity)*this.tfriction);
this.yvelocity += ((idealyvelocity-this.yvelocity)*this.tfriction);

deltax = this.xvelocity - this._xvelocity;
deltay = this.yvelocity - this._yvelocity;

deltav = Math.sqrt((deltax*deltax)+(deltay*deltay));

skid = skidv/(skidv+deltav);

this.xvelocity = this._xvelocity + skid*deltax;
this.yvelocity = this._yvelocity + skid*deltay;

// 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.steering>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.xvelocity)+(this.yvelocity*this.yvelocity));
this.angle += (( (this.steering*.80)*actualSpeed)*.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._xvelocity = this.xvelocity;
this._yvelocity = this.yvelocity;

}
0

LVL 3

Author Closing Comment

ID: 31409507
Thanks

great!!
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have found that much of my time doing support ends up being a constant repetition of the same steps to different people.  Early on I stated using web pages with Frequently Asked Questions (FAQs) to alleviate most of the burden.  Sometimes this jus…
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
The viewer will learn how to implement Singleton Design Pattern in Java.
The goal of the tutorial is to teach the user how to use the auto adjust feature and what the different options do. When your video is not working right you can choose the auto adjust feature to help choose your settings.
###### Suggested Courses
Course of the Month11 days, 12 hours left to enroll