Sprinten mit Ausdauer - Denkfehler ?

Posted By: TheShooter

Sprinten mit Ausdauer - Denkfehler ? - 09/27/12 17:47

Hi Leute,
in mein Script hat sich ein Denkfehler eingeschlichen. Ich möchte, dass mein Spieler nicht mehr sprinten kann, sobald die Ausdauervariable auf null fällt. Dies sollte sich dann natürlich wieder generieren. Geh- und Sprintsounds sollten auch funktionieren.

Mein Code bisher:
Code:
void moveplayer()
{
	var speed_down;
	VECTOR vFeet;
	
	move_min_z = -1;
	
	while(1)
	{
		my.pan -= mouse_force.x *20 *time_step;
		camera.tilt += mouse_force.y *20 *time_step;
		camera.tilt = clamp(camera.tilt,-90,90);
		
		var dist_down;
		if (c_trace(my.x,vector(my.x,my.y,my.z-5000),IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) > 0)
		dist_down = my.z + vFeet.z - target.z;
		else
		dist_down = 0;
		if(dist_down > 0)
		dist_down = clamp(dist_down,0,accelerate(speed_down,2,0.1));
		else
		speed_down = 0;
		
		
		
		
		
		var dist_ahead = 1*(key_w-key_s)*time_step;
		var dist_side = 1*(key_a-key_d)*time_step;
		var dist_sprint = 2* (key_w && key_shift) *time_step;
		move_min_z = 500;
		c_move(me,vector(dist_ahead,dist_side,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE);
		c_move(me,vector(0,0,0),vector(0,0,-dist_down), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE);
		
		
		if(sprint_v > 2 && c_move(me,vector(dist_sprint,0,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE))
		{
			sprint_act = 1;
			sprint_v = sprint_v -0.7 *time_step;
		}
		else
		sprint_act = 0;
		
		if(sprint_act == 0)
		{
			sprint_v = clamp(sprint_v,0,100);
			sprint_v = sprint_v +0.3 *time_step;
		}
		
		wait(1);
	}
	
}

function walksound()
{
	while(1)
	{
		while(sprint_act == 0 && key_w || key_a || key_s || key_d )
		{
			snd_play(walk_leaves01_snd,100,50);
			wait(45);
			snd_play(walk_leaves02_snd,100,50);
			wait(35);
		}
		while(sprint_act == 1 && key_w && key_shift)
		{
			snd_play(walk_leaves01_snd,100,50);
			wait(22);
			snd_play(walk_leaves02_snd,100,50);
			wait(22);
		}
		wait(1);
	}
}



Ich habe wirklich schon alles versucht, jedoch komme ich auf keine Lösung.

MfG,
TheShooter

PS:
sprint_v ist zuständig für die Ausdauer
sprint_act dient als Schalter fürs Rennen/Nicht Rennen bei z.B. der Soundfunktion

Ich habe mal die Variablen während der Laufzeit anzeigen lassen, und sprint_v kommt nie unter 2 (wie auch), dabei springt sprint_act dauernd zwischen 0 und 1 hin und her.
Posted By: Ch40zzC0d3r

Re: Sprinten mit Ausdauer - Denkfehler ? - 09/27/12 19:33

Vielleicht solltest du energie nur aufladen wenn man nicht sprintet.
Posted By: TheShooter

Re: Sprinten mit Ausdauer - Denkfehler ? - 09/27/12 19:51

Mhh, mach ich doch, oder etwa nicht?

Code:
if(sprint_v > 2 && c_move(me,vector(dist_sprint,0,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE))
		{
			sprint_act = 1;
			sprint_v = sprint_v -0.7 *time_step;
		}
		else
		sprint_act = 0;
		
		if(sprint_act == 0)
		{
			sprint_v = clamp(sprint_v,0,100);
			sprint_v = sprint_v +0.3 *time_step;
		}



Wenn sprint_act null entspricht wird die Energie aufgeladen. (Siehe else)

Mach ich da was falsch? Zeigt mir ruhig meine Fehler auf. grin

Beste Grüße,
TheShooter
Posted By: Tempelbauer

Re: Sprinten mit Ausdauer - Denkfehler ? - 09/28/12 08:15

Hiermit sprintet er solange sprint_v > 2, danach läuft er normal weiter bis du shift wieder loslässt und er sich regeneriert. Ist es das was du willst?
Code:
if(sprint_v > 2 )
{
	if(c_move(me,vector(dist_sprint,0,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE) > 0)
	{
		sprint_act = 1;
		sprint_v = sprint_v -0.7 *time_step;
	}
	
}
else
	sprint_act = 0;

if(sprint_act == 0)
{
	sprint_v = clamp(sprint_v,0,100);
	sprint_v = sprint_v +0.3 *time_step;
}


Dass sprint_act hin und herspringt ist logisch:
runde 1 (sprint_act ist 0): sprint_v ist größer 2: du springst in die if und reduzierst sprint_v auf <= 2 und setzt sprint_act = 1. zweite if wird übersprungen weil sprint_act nicht 0 ist
runde 2 (sprint_act ist 1): sprint_v ist <= 2, damit geht er in die else und setzt sprint_act auf 0. er geht in die zweite if und erhöht sprint_v (nach 2 oder 3 durchläufen auf > 2)
und das spielt geht von vorne los.
zum checken of der spieler sprintet (für die soundausgabe) würde ich da lieber direkt sprint_v benutzen. da kannst du ja direkt sehen ob er sprinted oder nicht und musst keinen flag aktuell halten (was in deinem fall sowiso nicht geht, da er hin und herspringt)
Posted By: TheShooter

Re: Sprinten mit Ausdauer - Denkfehler ? - 10/03/12 12:53

Leider funktioniert dein Code nicht so, wie ich mir das vorstelle. Wenn ich mit z.B. 50 sprint_v aufhöre zu sprinten, regeneriert sich die Ausdauer nicht. Außerdem sprint sprint_act ebenfalls hin und her, wenn ich sprint_v = 2 erreicht habe.
ich stelle mir das so vor:

Ich kann solange sprinten, bis sprint_v auf null ist. Während des Sprintvorgangs wird sprint_act = 1 gesetzt, um später z.B. den Sound damit zu managen. Wenn die komplette Ausdauer verbraucht ist, sollte die Figur aufhören zu sprinten, und sprint_act = 0 sollte gesetzt werden. Wenn die Figur mit z.B. sprint_v = 50 aufhört zu sprinten, sollte sich die Ausdauer ebenfalls regenerieren.
Ich habe mich nocheinmal versucht:
Code:
//dist sprint ist der Sprintvektor
if(sprint_v > 1 && key_shift && key_w)
		{
			c_move(me,vector(dist_sprint,0,0),vector(0,0,0), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON | GLIDE);
			
			sprint_act = 1;
			sprint_v = sprint_v -0.7 *time_step;
		}
		else
		{
			sprint_act = 0;
			dist_sprint = 0;
			sprint_v = clamp(sprint_v,0,100);
			sprint_v = sprint_v +0.3 *time_step;
		}



Das scheint verzwickt zu sein, da das obige ebenfalls nicht richtig funktioniert. Die Regeneration funktioniert zwar, allerdings sprint sprint_act wieder wild umher wenn sprint_v = 1 erreicht ist. Was halt einen ziemlichen Performanceverlust mit sich bringt, da ja ständig sprint_act hin und her geändert wird, sprich, die Bewegung des Spielers gerät ins stocken. (Die FPS sagen allerdings was anderes, liegt wohl an time_step)

Viele Grüße, und einen schönen Tag Der Deutschen Einheit,
TheShooter
© 2024 lite-C Forums