Gamestudio Links
Zorro Links
Newest Posts
Gaussian Crash Error
by TipmyPip. 07/21/24 11:54
Zorro Trader GPT
by TipmyPip. 07/20/24 06:46
Delaying Exit Order
by AndrewAMD. 07/17/24 11:38
Lapsa's very own thread
by rki. 07/14/24 16:39
LINUX Debian & Zorro problems
by juergen_wue. 07/13/24 07:15
Placing Order during Market Close
by jcl. 07/12/24 13:57
New Zorro version 2.62
by jcl. 07/12/24 13:56
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
3 registered members (ozgur, AndrewAMD, TipmyPip), 982 guests, and 6 spiders.
Key: Admin, Global Mod, Mod
Newest Members
rramsey, Erasand, Cristoig2001, Mino, squik
19064 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Gravity #488298
07/09/24 10:06
07/09/24 10:06
Joined: Jun 2018
Posts: 34
B
bbn1982 Offline OP
Newbie
bbn1982  Offline OP
Newbie
B

Joined: Jun 2018
Posts: 34

// GRAVITY //

action gravity_test
{
var temp002[3];temp002.z -=1000000; trace_var001 = trace(my.x,temp002);ent_move(temp002,target);
}

Re: Gravity [Re: bbn1982] #488302
07/09/24 23:07
07/09/24 23:07
Joined: Jul 2008
Posts: 2,108
Germany
rayp Offline

X
rayp  Offline

X

Joined: Jul 2008
Posts: 2,108
Germany
I would recommend something like this (when it comes to movement and gravity):
Code
// --------------------------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------------------------
// good working/well tested gravity script with basic player movement controller - free to use
// supports walking up (for example on steps)
// rayp 2024      ...credits are always nice
//
// needs: player.mdl (best is to use a simple "box" model for collision), test.wmb map file
// usage: run this script
// --------------------------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------------------------

// --------------------------------------------------------------------------------------------------------------------
// --- some var's and def's we want to use
// --------------------------------------------------------------------------------------------------------------------
//SOUND* snd_land  = "hitfloor.wav";
var player_movement_speed = 5;   // speed of player's movement
var mouse_speed = 1;             // speed for camera rotation
var std_cam_height = 17;         // eye height of the camera
#define myheight skill99         // used by apply_gravity function = distance to ground from c_trace
#define distZ skill98            // used by apply_gravity function = Z movement for c_move in the ent-move-controller
//#define falling skill97
//#define footstep skill96
//#define step_sndconcrete 100
#define group_player 1           // for c_ignore groups



// --------------------------------------------------------------------------------------------------------------------
// --- the simple (and well) gravity part (with example for floor-texture-footstep-detection)
// --------------------------------------------------------------------------------------------------------------------
void apply_gravity (ENTITY* ent){   
   if (!ent) return;
   VECTOR temp_pos;
   vec_set    (temp_pos, vector(0, 0, -1000)); // 1000 should be enough for most levels
   vec_rotate (temp_pos, ent.pan);
   vec_add    (temp_pos, ent.x);
   c_ignore (group_player, 0);
   trace_mode = IGNORE_ME | IGNORE_PASSABLE | USE_BOX | IGNORE_SPRITES;// | SCAN_TEXTURE;	
   ent.myheight  = c_trace (vector(ent.x,ent.y,ent.z), temp_pos, trace_mode);			
   //DEBUG_VAR (ent.myheight, 300);	
   // -----------------------------------------------------------------------------------------------------------------
   // --- footstep example depending on floor texture, needs SCAN_TEXTURE in trace_mode above
   /*
   if (HIT_TARGET){
      if (hit.texname){
   	 //draw_text (hit.texname, 10,200,vector(255,0,0));
         if(str_cmpi(hit.texname,"#default") || str_cmpi(hit.texname,"concrete")){
  	    ent.footstep = step_sndconcrete;
	 }
      }
   }
   */
   // --- footstep surface detection end, rest of gravity part below
   // -----------------------------------------------------------------------------------------------------------------
   if (ent.myheight > 2 || ent.myheight == 0){ 	   		
      accelerate(ent.distZ, -3 * time_step, -1);						
      //if (ent.myheight > 15) ent.falling = 1;  // in the air!	   
   }
   else{
      ent.distZ = 0; 	
      /*if (ent.falling){ // in the air ? play land sound
         ent.falling = 0;
	 snd_play (snd_land, 50, 0);		   	
      }*/	   					
   }	
}



// ---------------------------------------------------------------------------------------------------------------------
// --- a simple and basic player controller with gravity (first person cam)
// ---------------------------------------------------------------------------------------------------------------------
action Test_Player(){
   VECTOR player_dist;   // movement vector used for XY, for Z we use my.distZ calculated in apply_gravity
   // ------------------------------------------------------------------------------------------------------------------
   // --- collision box
   // ------------------------------------------------------------------------------------------------------------------
   wait (1);   
   my.eflags &= ~FAT;
   my.eflags &= ~NARROW;
   vec_set (my.min_x, vector(-12,-12,-17)); 
   vec_set (my.max_x, vector(12,12,25));	
   // ------------------------------------------------------------------------------------------------------------------
   my.group = group_player;
   while (me){ // dont use while(1), this would crash on, for example, level switch when the entity is lost
      // ---------------------------------------------------------------------------------------------------------------
      // --- use WASD to move
      // ---------------------------------------------------------------------------------------------------------------
      //if (key_shift) player_movement_speed = 10;
      //else player_movement_speed = 5;
      player_dist.x = (key_w-key_s)*time_step*player_movement_speed;
      player_dist.y = (key_a-key_d)*time_step*player_movement_speed;	
      // ---------------------------------------------------------------------------------------------------------------
      // --- handle camera rotation and movement
      // ---------------------------------------------------------------------------------------------------------------
      camera.pan   -= mickey.x*time_step*mouse_speed;   	
      camera.tilt  -= mickey.y*time_step*mouse_speed;   	   	
      camera.tilt   = clamp (camera.tilt, -80, 80);         	
      camera.x      = my.x; // or vec_set (camera.x, my.x) instead of setting X and Y
      camera.y      = my.y;
      camera.z      = my.z + std_cam_height;
      // ---------------------------------------------------------------------------------------------------------------
      // --- prepare our XY movement vector now
      // ---------------------------------------------------------------------------------------------------------------
      vec_rotate (player_dist, vector (camera.pan,0,0));
      // ---------------------------------------------------------------------------------------------------------------
      // --- calculate the gravity / Z movement for ME (into my.distZ)
      // ---------------------------------------------------------------------------------------------------------------
      apply_gravity (me);
      // ---------------------------------------------------------------------------------------------------------------
      // --- finally move the player (best performance because only one c_move call is used for XYZ)
      // ---------------------------------------------------------------------------------------------------------------
      c_ignore (group_player, 0);
      c_move (me, nullvector, vector (player_dist.x, player_dist.y, my.distZ), GLIDE|IGNORE_ME|IGNORE_PASSABLE);
      // ---------------------------------------------------------------------------------------------------------------
      wait (1);
   }
}



// ---------------------------------------------------------------------------------------------------------------------
// --- the main function
// ---------------------------------------------------------------------------------------------------------------------
void main(){
   level_load ("test.wmb");
   ent_create ("player.mdl", vector (0,0,50), Test_Player);
}

// ---------------------------------------------------------------------------------------------------------------------
// --- end
// ---------------------------------------------------------------------------------------------------------------------


Acknex umgibt uns...zwischen Dir, mir, dem Stein dort...
"Hey Griswold ... where u gonna put a tree that big ?"
1998 i married my loved wife ... Sheeva from Mortal Kombat, not Evil-Lyn as might have been expected
rayp.flags |= UNTOUCHABLE;

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1