this is my real first big attempt in months at trying to do somthing, spent a good few hours on this last night and i know its not the best. the steering is prety bad with a steering wheel were it turns realy fast and cant get a nice smooth motion and turning faster the more the wheel is turned which im updating tonight and theres some weird bug that makes a6 crash when i change from a higher gear into gear 0 "Neutral". other than that im prety proud and have a better understanding of scripting, watch out for me alot of code borrowed from elsewhere and credit will be given i just cant remember who but ill find out.

Replace newtons Vehicle_playground wdl with code below

modifications:
1. rear View mirror
2. simple gear system (maths needs tweaking)
3. engine sounds
4. braking sounds when at high speeds no sound at lower speeds
5. brake now does not reverse you must select reverse gear and use accelerator
6. simple steering wheel intigration (steering needs refined)
7. 1st person camera (cockpit cam)

Todo:
1. driver and passanger side mirrors
2. virtual steering wheel
3. better steering with steering wheel
4. better internal camera
5. better gear and speedo display
6. map gear change to shifters on steering wheel or buttons
Quote:



var video_mode=8;
var video_depth=32;

entity* p_vehicle;

include <sky.wdl>;
include <newton.wdl>;
include <newtonScript2.wdl>;
include <newtonVehicle.wdl>;

var d3d_alphadepth=32;
var d3d_anisotropy=4;
var clip_size=0;
var enginenoise;
var screech;
var Gtorque=0; // 0 - neutral
var gear_num;
var omega;
var resistance;
var steer;
var torque;
var throttle;
var steer_x;
string s_level=<vehicle_playground.wmb>;
string s_levelcls=<vehicle_playground.cls>;
string newtonLevel_cls=s_levelcls;

font Myfont, <ackfont.pcx>, 6,9; //The Font
sound engine_wav = <engine.wav>;
sound tire_screech = <tire_screech.wav>;
////////////////////////////////////////////////////////////////////////////////////////////
panel steeringwheel_display
{

pos_x = 640;
pos_y = 380;
layer = 10;
digits = 120,15,8,myfont,1,steer_x;
flags = overlay, refresh, visible;
}

panel gear_display
{

pos_x = 640;
pos_y = 370;
layer = 10;
digits = 120,15,8,myfont,1,gear_num;
flags = overlay, refresh, visible;
}

panel torque_display
{

pos_x = 640;
pos_y = 360;
layer = 10;
digits = 120,15,8,myfont,1,torque;
flags = overlay, refresh, visible;
}

panel speed_display
{

pos_x = 640;
pos_y = 350;
layer = 10;
digits = 120,15,8,myfont,1,omega;
flags = overlay, refresh, visible;
}

panel throttle_display
{

pos_x = 640;
pos_y = 340;
layer = 10;
digits = 120,15,8,myfont,1,throttle;
flags = overlay, refresh, visible;
}

view rear_view
{
layer = 1;
pos_x = 400;
pos_y = 0;
size_x = 400;
size_y = 100;
arc = 45;
aspect = 1;
offset_x = 0;
offset_y = 0;
ambient = 10;
fog = 10;
flags = visible;
}

function update_views()
{
rear_view.genius = my;
rear_view.arc = -80;
rear_view.x = my.x;
rear_view.y = my.y;
rear_view.z = my.z;
rear_view.pan = my.pan + 180;
rear_view.roll = -my.roll;
rear_view.tilt = -my.tilt +6;
}

starter move_camera()
{
// camera.arc=70;
camera.clip_near=20;
camera.clip_far=24000;

while(!p_vehicle){wait(1);}

while(1)
{
//trying proc late to see if it resovles camera lag
proc_late(); //havnt tested with this function yet
camera.x = p_vehicle.x - 10 * cos(p_vehicle.pan);
camera.y = p_vehicle.y - 10 * sin(p_vehicle.pan);
camera.z = p_vehicle.z + 18;
camera.pan = p_vehicle.pan;
camera.tilt = p_vehicle.tilt;
camera.roll = p_vehicle.roll;
wait(1);
}
}


function VehicleBeginEvent(vehicleConst)
{
var p;
p = 0;
}

// use this function to apply feeback to GS
// you could play a sound effect base on the max tyre slide value
// you could also play the engine sound, etc
function VehicleEndEvent(vehicleConst)
{
var p;
p = 0;
}


// use the function to control the tyre handling
// basically this function apply torque to the tyre, and set the eteering angle.
function VehicleTireEvent(vehicleConst, tyreIndex)
{
// set the steer angle
steer = NewtonGetTyreSteerParam (vehicleConst, tyreIndex);
steer = steer + (my.carSteerTorque - steer) * 0.1;
NewtonSetTyreSteerParam (vehicleConst, tyreIndex, steer);

// coeficienty of friction contant for arcade type of game
// play with this to change the vihaviuor of the car
NewtonSetTyreLateralFrictionCoef (vehicleConst, tyreIndex, 0.7);
NewtonSetTyreLongituFrictionCoef (vehicleConst, tyreIndex, 0.8);

// if (you.is_PoweredWheel) {
torque = my.carEngineTorque;
if (torque != 0) {
resistance = my.car_maxToque * NewtonGetTyreRadius (vehicleConst, tyreIndex) / my.car_topSpeed;
} else {

if(throttle > 2) || (key_s)
{

resistance = 0.15 * NewtonGetTyreInertia (vehicleConst, tyreIndex);

if(omega>=35) // change this so that its sensitive to pedal, fully pressed for emergency stop
{
screech = ent_playsound (p_vehicle, tire_screech, 30);
}
}
else{
resistance = 0.002 * NewtonGetTyreInertia (vehicleConst, tyreIndex);
}

}

omega = NewtonGetTyreOmega (vehicleConst, tyreIndex);
torque = torque - resistance * omega;
NewtonSetTyreTorque (vehicleConst, tyreIndex, torque);
// }
}

function VehicleForceEvent(body)
{
// apply the gravity force
ApplyGravityForceEvent(body);

// vehicle are always active
NewtonSetBodyAutoActiveState (body, 0);
}


action NewtonVehicle
{
var car;
p_vehicle = my;
NewtonCreateVehicle (wood_material, VehicleTireEvent, VehicleBeginEvent, VehicleEndEvent);
dll_handle = newtonHandle;
car = NewtonGetBody (my);
NewtonSetBodyAutoActiveState (car, 0);
NewtonSetBodyActiveState (car, 1);
NewtonSetBodyForceAndTorque (car, VehicleForceEvent);

enginenoise = ent_playloop (p_vehicle, engine_wav, 30);

while (1) {

snd_tune (enginenoise, 50, omega + 30, 0);
my.carEngineTorque = 0.0;
my.carSteerTorque = 0.0;
throttle = joy_raw.y+2;

if(throttle < 0) && (gear_num > 0 )
{
my.carEngineTorque = -throttle; //minus because the pedals appear reversed relative to real pedals
}
else{
if(gear_num==-1) && (throttle < 0)
{
my.carEngineTorque = throttle;
}
}


steer_x = int(-joy_raw.x/10-0); //played with this, still same effect no matter how large

my.carSteerTorque = steer_x; //same as above (organized)

if(key_r)
{
gear_num = -1;
}

if(key_0)
{
Gtorque = 0;
my.car_topSpeed = 0;
gear_num = 0;

}

if(key_1)
{
Gtorque = 500;
gear_num=1;
my.car_topSpeed = 700;
}
if(key_2)
{
Gtorque = 500;
gear_num=2;
my.car_topSpeed = 800;
}
if(key_3)
{
Gtorque = 600;
gear_num=3;
my.car_topSpeed = 900;
}
if(key_4)
{
Gtorque = 700;
gear_num=4;
my.car_topSpeed = 1000;
}
if(key_5)
{
Gtorque = 800;
gear_num=5;
my.car_topSpeed = 1100;
}

//Keyboard Control
if(key_a)
{

my.carSteerTorque = 1.0;
}

if(key_d)
{
my.carSteerTorque = -1.0;
}
if(key_w)
{

if(gear_num==0)
{

snd_tune (enginenoise, 50, 200, 0); // tune the engine sound
}

if(gear_num == -1)
{
my.carEngineTorque = -my.car_maxToque * 0.5; //i wanted to keep reverse speed realy slow
}else{
my.carEngineTorque = Gtorque; //my.car_maxToque;
}


}
//key_s (brake/reverse changed to just brake under function VehicleTireEvent)

update_views();
wait(1);
}
}


function main()
{
mat_model.albedo=15;
wait(3);
level_load(s_level);
wait(1);

dll_handle=newtonHandle;
NewtonAddMap(s_level,0);
}






Last edited by andy_1984; 04/10/07 10:24.