Code funktioniert nicht wie er soll

Posted By: TheShooter

Code funktioniert nicht wie er soll - 05/18/12 15:05

Hi,
ich arbeite gerade an einem neuen Projekt, und erstelle gerade den Movementcode. Allerdings bleibt das Spielermodell in der Luft, fällt also nicht zu Boden. Hier meine Schwerkraftfunktion:

Code:
function schwerkraft()
{
	while(1){
	if (c_trace(my.x, vector(my.x,my.y,my.z-100000000), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) >0)
		distanz_zum_boden = my.z + vFuesse.z - target.z;
	else
		distanz_zum_boden = 0;
		
	if (distanz_zum_boden > 0)
		distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
	else
		fallgeschwindigkeit = 0;
		wait(1);
	}
	
}



Und hier mein ganzer Code, der dem Spielermodell zugewiesen ist:
Code:
var fallgeschwindigkeit = 0;
var distanz_zum_boden;
VECTOR vFuesse;
vec_for_min(vFuesse,me);

function kamera()
{
	while(1){
	camera.x = my.x;
	camera.y = my.y;
	camera.z = my.z;
	camera.pan = my.pan;
	wait(1);
	}
}

function schwerkraft()
{
	while(1){
	if (c_trace(my.x, vector(my.x,my.y,my.z-100000000), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) >0)
		distanz_zum_boden = my.z + vFuesse.z - target.z;
	else
		distanz_zum_boden = 0;
		
	if (distanz_zum_boden > 0)
		distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
	else
		fallgeschwindigkeit = 0;
		wait(1);
	}
	
}

function bewegen()
{
	while(1){
	my.pan += 2*(key_a-key_d)*time_step; 
	wait(1);
	}
	
}


action spieler()
{
	kamera();
	schwerkraft();
	bewegen();
}



Alles andere funktioniert, alles bis auf die "Schwerkraft".

Danke schonmal im Voraus,
TheShooter laugh
Posted By: PadMalcom

Re: Code funktioniert nicht wie er soll - 05/18/12 15:21

Du bewegst ja dein Modell auch nirgends mittels c_move laugh

Außerdem solltest du nicht so krass tracen, das geht auf die Performance. Check mal ob nicht eine Distanz von 1000 Quants reicht.
Posted By: TheShooter

Re: Code funktioniert nicht wie er soll - 05/18/12 15:38

Natürlich. grin Jetzt klappts, danke. laugh Die Quants beim tracen habe ich nur erhöht, da ich mir nicht sicher war, ob der trace auch wirklich am Boden ankommt.

Vielen Dank! laugh

€: Allerdings bewege ich mich jetzt viel zu schnell, aber ich kann keine Variablen verkleinern, um langsamer zu werden.

Code:
function bewegen()
{
	while(1){
		var distanz_vorne = 5*(key_w-key_s)*time_step;
		distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
		c_move(me,vector(distanz_vorne,0,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE);
		my.pan += 2*(key_a-key_d)*time_step; 
		wait(1);
	}
	
}



€: mhh, wenn ich die ersten sekunden falle, falle ich langsam. Nach ca. 3 Sekunden aber falle ich mit einem Affenzahn nach unten. Was habe ich falsch gemacht?
Posted By: PadMalcom

Re: Code funktioniert nicht wie er soll - 05/18/12 16:54

Geschwindigkeit: Verringere die Distanz mit der du dich bewegst (z.B. indem du den Faktor 5 durch eine 2 ersetzt).

Beschleunigung: Dass du schneller fällst hast du doch selber gecoded, mit der Funktion accelerate beschleunigst du deinen freien Fall. Sieht so aus als hättest du das Beispiel aus dem Manual abgetippt, dann solltest du auch mal die Kommentare lesen die dabeistehen wink
Posted By: TheShooter

Re: Code funktioniert nicht wie er soll - 05/18/12 16:58

Das habe ich natürlich schon versucht. Ich habe jetzt die Tracedistanz auf 1 gesetzt, und jetzt funktioniert alles wunderbar. Sehr komisch...
Posted By: PadMalcom

Re: Code funktioniert nicht wie er soll - 05/18/12 21:45

Sollte es nicht, die trace-distance hat damit absolut nichts zu tun.
Posted By: TheShooter

Re: Code funktioniert nicht wie er soll - 05/19/12 12:33

Das ist mir auch klar, nur weiß ich nicht wo das Problem liegen sollte. :S
Hier nochmal der komplette Code:

Code:
var fallgeschwindigkeit = 0;
var distanz_zum_boden;
VECTOR vFuesse;
vec_for_min(vFuesse,me);

function kamera()
{
	while(1){
		vec_set(camera.x,my.x);
		vec_set(camera.y,my.y);
		camera.z = my.z+45;
		camera.pan = my.pan;
		wait(1);
	}
}

function schwerkraft()
{
	while(1){
		if (c_trace(my.x, vector(my.x,my.y,my.z-1), IGNORE_ME | IGNORE_PASSABLE) >0)
		
			
			distanz_zum_boden = my.z + vFuesse.z - target.z;
		
		else
		
		distanz_zum_boden = 0;
		
		
		if (distanz_zum_boden > 0)
		
		
		distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
		c_move(my,nullvector,vector(0,0,-5), IGNORE_PASSABLE | GLIDE);
		
		//else
		//{
			//	fallgeschwindigkeit = 0;
		//}
		
		
		
		wait(1);
	}

}

function bewegen()
{
	while(1){
		if(distanz_zum_boden <1){
			
			var distanz_vorne = 15*(key_w-key_s)*time_step;
			var distanz_seite = 7*(key_a-key_d)*time_step;
			distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
			distanz_seite = sign(distanz_seite)*(abs(distanz_seite) + 0.5*fallgeschwindigkeit);
			c_move(me,vector(distanz_vorne,0,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
			c_move(me,vector(0,distanz_seite,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
			my.pan += 1.3*(-mickey.x)*time_step; 
			camera.tilt += 1.3*(-mickey.y)*time_step;
			
			
		}
		else
		{
			beep();
		}
		wait(1);
	}

}


action spieler()
{
	wait(3);
	set(me, INVISIBLE);
	kamera();
	schwerkraft();
	bewegen();
}


Posted By: GameScore

Re: Code funktioniert nicht wie er soll - 05/19/12 14:56

probier mal das,
ist von einem aus dem forum hier


Code:
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

VECTOR force;
VECTOR dist;
VECTOR absdist;
VECTOR speed_xyz;
VECTOR old_mypos;

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

var my_height;
var jump_time = 1;
var jump_height = 55;
var speed_z = 0;
var fall_damage = 0;
var bit_press[10];
var damage;

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

#define health skill1

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

SOUND* damage_snd = "damage_snd.wav";
SOUND* death_snd = "death_snd.wav";

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

function main()
{
	fps_max = 75;
	fps_lock = 1; // NEEDED FOR PROPER WORK
	level_load("1.WMB");
	wait(3);
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

function handle_camera()
{
	camera.arc = 90;
	vec_lerp(camera.x,camera.x,vector(my.x,my.y,my.z + 50),0.5);
	my.pan = camera.pan;
	camera.pan -= 10 * mouse_force.x * time_step;
	camera.tilt += 10 * mouse_force.y * time_step;
	camera.tilt = clamp(camera.tilt,-80,80);
}

function handle_jump()
{
	proc_kill(1); 
	jump_time = 1;
	while (jump_time > -1 && player.health > 0)
	{
		on_space = NULL;
		absdist.z = jump_height * time_step * jump_time;
		jump_time -= 0.2 * time_step;
		wait (1);
	}
	while (my_height > 10) {wait (1);}
	jump_time = 1;
}

function handle_movement()
{
	if(my_height <= 10)
	{
		if(jump_time == 1){on_space = handle_jump;}
		if(!key_shift)
		{
			force.x = 10 * (key_w - key_s) * time_step;
			accelerate(dist.x,force.x,0.5);
			force.y = 10 * (key_a - key_d) * time_step;
			accelerate(dist.y,force.y,0.5);
		}
		else
		{
			force.x = 10 * (key_w - key_s) * time_step;
			accelerate(dist.x,force.x,1);
			force.y = 10 * (key_a - key_d) * time_step;
			accelerate(dist.y,force.y,1);
		}
	}
}

function handle_gravity()
{
	my_height = c_trace(my.x,vector(my.x,my.y,my.z - 1000),IGNORE_ME|IGNORE_FLAG2|IGNORE_PASSABLE|USE_POLYGON|USE_BOX);
	if(my_height > 10)
	{
		accelerate(absdist.z,-10 * time_step,-0.1);
	}
	else
	{
		if(jump_time == 1)
		{
			absdist.z = -(my_height/1.2) + 5;
			absdist.z = clamp(absdist.z,-5,5);
			if((my_height + absdist.z) > 10){absdist.z = -my_height -10;}
		}
	}
	vec_set(old_mypos,my.x); // NEEDED FOR PROPER WORK
}

function handle_falldamage()
{
	vec_diff(speed_xyz,my.x,old_mypos);
	speed_z = abs(speed_xyz.z) * time_step;
	if(speed_z > 3.5) // PLAY WITH 3.5 TO CUSTOMIZE THE HEIGHT
	{
		fall_damage += speed_z * time_step;
	}
	if(speed_z <= 1 && fall_damage != 0 && my_height <= 10)
	{
		my.health -= fall_damage * 4 + random(4); // PLAY WITH 4 TO CUSTOMIZE DAMAGE
		damage = 1;
		fall_damage = 0;
	}
	if(damage == 1 && fall_damage == 0 && my_height <= 10)
	{
		if(bit_press[0] == 0 )
		{
			snd_play(damage_snd,100,0);
			bit_press[0]= 1;
		}
		damage = 0;
	}
	else
	{
		bit_press[0]= 0;
	}
}

function handle_death()
{
	snd_play(death_snd,100,0);
   while(1)
	{
		if(my_height <= 10){vec_set(dist,nullvector);}
		handle_gravity(); // GRAVITY
		c_move(my,dist,absdist,IGNORE_PASSABLE|GLIDE);
		camera.arc = 90;
		vec_lerp(camera.x,camera.x,vector(my.x,my.y,my.z),0.5);
		my.pan = camera.pan;
		camera.pan -= 10 * mouse_force.x * time_step;
		camera.tilt += 10 * mouse_force.y * time_step;
		camera.tilt = clamp(camera.tilt,-80,80);	   
		wait(1);
	}
}

action hero()
{
	player = my;
	set(my,INVISIBLE);
	my.health = 100; // SET PLAYERS HEALTH TO 100 
	while(my.health > 0)
	{
		handle_movement(); // MOVEMENT
		handle_gravity(); // GRAVITY
		c_move(my,dist,absdist,IGNORE_PASSABLE|GLIDE);
		handle_falldamage(); // FALL DAMAGE FUNCTION
		handle_camera(); // CAMERA
		wait(1);
	}
	handle_death();
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

PANEL* gui_ =
{
	digits(10,0,4,"Arial#24bi",1,player.skill1); 
	flags = SHOW;
}


Posted By: PadMalcom

Re: Code funktioniert nicht wie er soll - 05/19/12 15:03

Du rufst 2x c_move hintereinander auf, warum? Du könntest distanz_seite einfach ins erste move mit integrieren indem du die 0 im ersten vektor dadurch ersetzt.

Versuche immer zu verstehen was du da schreibst, durch einfaches Probieren kommt man in der Mathematik oft nicht sehr weit wink Das Beispiel aus dem Manual ist klasse, hangel dich mal daran entlang.
Posted By: TheShooter

Re: Code funktioniert nicht wie er soll - 05/19/12 15:29

Oh, das habe ich nicht bemerkt. Aber leider löst das noch immer nicht das trace-problem. Aber ich habe etwas komisches herausgefunden. Wenn ich die Tracereichweite auf z.B. -100 setze, so kann ich mich überhaupt nicht mehr bewegen/umsehen. Wenn ich allerdings im folgendem Code in der If-Clause "Distanz_zum_Boden" auf "<101" setze, funktioniert alles wieder.
Code:
if(distanz_zum_boden < 1){
			
			var distanz_vorne = 15*(key_w-key_s)*time_step;
			var distanz_seite = 7*(key_a-key_d)*time_step;
			distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
			distanz_seite = sign(distanz_seite)*(abs(distanz_seite) + 0.5*fallgeschwindigkeit);
			c_move(me,vector(distanz_vorne,distanz_seite,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
			my.pan += 1.3*(-mickey.x)*time_step; 
			camera.tilt += 1.3*(-mickey.y)*time_step;
			
			
		}



Nur leider bin ich zu beschränkt, um das Problem alleine zu lösen. Ich glaube ich verstehe nicht so ganz, wie Vektoren funktionieren.

Es scheint so, als wenn der trace irgendwie nicht den Boden treffen würde, und die höhe anhand der Tracedistanz setzen würde. Oder liege ich falsch?
Posted By: GameScore

Re: Code funktioniert nicht wie er soll - 05/19/12 19:42

ich habe jetzt mal deine schwerkraft funktion probiert
scheint soweit zu funktionieren

probier mal das hier



Code:
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

VECTOR force;
VECTOR dist;
VECTOR absdist;




//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

var my_height;
var jump_time = 1;
var jump_height = 55;
var speed_z = 0;



var fallgeschwindigkeit = 0;
var distanz_zum_boden;
VECTOR vFuesse;
vec_for_min(vFuesse,me);

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

#define health skill1


function main()
{
	fps_max = 75;
	fps_lock = 1; // NEEDED FOR PROPER WORK
	level_load("1.WMB");
	wait(3);
}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

function handle_camera()
{
	camera.arc = 90;
	vec_lerp(camera.x,camera.x,vector(my.x,my.y,my.z + 50),0.5);
	my.pan = camera.pan;
	camera.pan -= 10 * mouse_force.x * time_step;
	camera.tilt += 10 * mouse_force.y * time_step;
	camera.tilt = clamp(camera.tilt,-80,80);
}

function handle_jump()
{
	proc_kill(1); 
	jump_time = 1;
	while (jump_time > -1 && player.health > 0)
	{
		on_space = NULL;
		absdist.z = jump_height * time_step * jump_time;
		jump_time -= 0.2 * time_step;
		wait (1);
	}
	while (my_height > 10) {wait (1);}
	jump_time = 1;
}

function handle_movement()
{
	if(my_height <= 10)
	{
		if(jump_time == 1){on_space = handle_jump;}
		if(!key_shift)
		{
			force.x = 10 * (key_w - key_s) * time_step;
			accelerate(dist.x,force.x,0.5);
			force.y = 10 * (key_a - key_d) * time_step;
			accelerate(dist.y,force.y,0.5);
		}
		else
		{
			force.x = 10 * (key_w - key_s) * time_step;
			accelerate(dist.x,force.x,1);
			force.y = 10 * (key_a - key_d) * time_step;
			accelerate(dist.y,force.y,1);
		}
	}
}


function schwerkraft()
{
	
	if (c_trace(my.x, vector(my.x,my.y,my.z-1000), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) >0)
		distanz_zum_boden = my.z + vFuesse.z - target.z;
	else
		distanz_zum_boden = 0;
		
	if (distanz_zum_boden > 0)
		distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
	else
		fallgeschwindigkeit = 0;

	
}


action hero()
{
	player = my;
	set(my,INVISIBLE);
	my.health = 100; // SET PLAYERS HEALTH TO 100 
	while(my.health > 0)
	{
		handle_movement(); // MOVEMENT
		c_move(my,dist,absdist,IGNORE_PASSABLE|GLIDE);
		handle_camera(); // CAMERA
		schwerkraft();
		wait(1);
	}
	
}


© 2024 lite-C Forums