///////////////////////////////////////////////////////////////
// earthball.c - physics example for lite-C pure mode
///////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////////////////////////////////////
// some global definitions
PANEL* pSplash = { bmap = "logo_800.jpg"; }
TEXT* tHelp = {
pos_x = 10; pos_y = 10;
font = "Arial#24bi";
flags = SHADOW;
string("Press [Space] to jump!");
}
ENTITY* eBall;
ENTITY* Pillar;
SOUND* sPong = "tap.wav";
VECTOR vSpeed, vAngularSpeed, vForce, vMove;
///////////////////////////////////////////////////////////////
// This is our event function for the ball impact.
function Plop()
{
// Play a ball impact sound.
ent_playsound(eBall,sPong,150);
}
function Music()
{
// Play a track.
media_loop("track1(2).mid",NULL,9001);
}
// Function for kicking the ball in camera direction.
function Jump()
{
// Create a local speed vector
VECTOR vJump;
// Use a horizontal and vertical speed to give the ball an upwards kick.
vJump.x = 0; vJump.y = 0; vJump.z = 300;
// Rotate it in camera direction.
// vec_rotate(vKick,camera.pan);
// Now apply the speed to the ball, and play a hit sound.
phent_addvelcentral(eBall,vJump);
Plop();
}
//Function for moving forwards
function Forwards()
{
VECTOR vJump;
vJump.x = 100; vJump.y = 0; vJump.z = 0;
phent_addvelcentral(eBall,vJump);
vForce.x = -7*(key_force.x); // pan angle
vec_accelerate(vMove,vSpeed,vForce,-30.5);
}
function Backwards()
{
VECTOR vJump;
vJump.x = -100; vJump.y = 0; vJump.z = 0;
phent_addvelcentral(eBall,vJump);
vForce.x = -7*(key_force.x); // pan angle
vec_accelerate(vMove,vSpeed,vForce,-30.5);
}
///////////////////////////////////////////////////////////////
// If a function is named "main", it's automatically started
function main()
{
// Activate 800x600 screen resolution and stencil shadows,
// and set the sound at full volume.
// Video_mode is a 'redefine' variable that has to be set
// before initializig the video device during the first wait().
video_mode = 7;
shadow_stencil = 1;
sound_vol = 100;
// Make the splash screen visible.
set(pSplash,VISIBLE);
// After a panel is set to VISIBLE, we have to wait 3 frames
// until we can really see it on the screen.
// The first frame paints it into the background buffer,
// two more frames are needed until the background buffer
// is flipped to the front in a triple buffer system.
wait(3);
// Before we can create level entities, a level must be loaded.
// We'll use the small terrain from the techdemo for a level.
// We have to wait one more engine frame to ensure that the level
// exists and is ready to be filled with level entities.
level_load("small.hmp");
// create a sky cube on layer 0
ent_createlayer("trippysky2.tga", SKY | DOME | DOME, 1);
ent_createlayer("red.tga", SKY | CUBE | VISIBLE, 0);
// Let's now create a ball at position (0,0,100).
// The vector function converts 3 floats to a temporary var vector
// for passing positions to engine functions.
eBall = ent_create("lamppost.mdl",vector(0,0,0),NULL);
// Set an entity flag to cast a dynamic shadow
set(eBall,SHADOW);
// Use one of the default materials for giving it a shiny look
eBall.material = mat_metal;
// Now let's set the ball's physical properties.
phent_settype(eBall,PH_RIGID,PH_BOX);
phent_setmass(eBall,1,PH_BOX);
phent_setfriction(eBall,100);
phent_setelasticity(eBall,0,0);
phent_setdamping(eBall,50,50);
// We add a small speed to give it a little sidewards kick.
phent_addvelcentral(eBall,vector(0,0,0));
// A ball game would be no fun without gravity.
ph_setgravity(vector(0,0,-500));
// Another event: if the ball hits something, a sound shall be played.
// We set the event function and the enable_friction mask for triggering
// the event at physics collisions. Note that the minimum speed -
// the third parameter of phent_setelasticity - determines the
// sensitivity of this event.
eBall.event = Plop;
// eBall.emask |= ENABLE_FRICTION;
// Remove the splash screen and display the text.
pan_remove(pSplash);
set(tHelp,VISIBLE);
// We want to kick the ball by hitting the [Space] key.
// Assign the 'Kick' function to the on_space event.
on_space = Jump;
on_w = Forwards;
on_s = Backwards;
// play the sound as if someone had kicked the ball into play
Music();
// During the main loop we're just moving the camera
while (1)
{
// For the camera movement we use the
// vec_accelerate() function. It accelerates a speed and
// is not dependent on the frame rate - so we don't need to
// limit the fps in this example. This code is equivalent
// to the built-in camera movement, but uses different keys.
vForce.x = -7*(key_force.x + mouse_force.x); // pan angle
vForce.y = 7*(key_force.y + mouse_force.y); // tilt angle
vForce.z = 0; // roll angle
vec_accelerate(vMove,vAngularSpeed,vForce,-0.067);
vec_accelerate(vMove,vAngularSpeed,vForce,0.567);
vec_add(camera.pan,vMove);
vForce.x = 3 * (key_w - key_s); // forward
vForce.y = 3 * (key_q - key_e); // sideward
vForce.z = 3 * (key_home - key_end); // upward
vec_accelerate(vMove,vSpeed,vForce,-30.5);
vec_accelerate(vMove,vSpeed,vForce,0.6);
vec_rotate(vMove,camera.pan);
vec_add(camera.x,vMove);
wait(1);
}
// We don't need to free our created entities, bitmaps and sounds.
// The engine does this automatically when closing.
}