Problem mit c_trace und c_move, bitte helfen

Posted By: Ascalon

Problem mit c_trace und c_move, bitte helfen - 03/22/13 21:48

Also ich habe folgenden Code, siehe unten. Wenn ich mit dem Terrain kollidiere, werde ich ein Stück zurückgeworfen und kann dann wieder weiterfahren. Geprüft wird das über c_move und dem trace_hit. So weit so gut. Verwende ich jetzt aber noch gleichzeitig ein c_trace, wie in meinem Bsp. um die Distanz zum Boden zu messen, bekomme ich Probleme mit meinem Code, da durch das c_trace ja ständig der Boden getroffen wird und somit meine Kollision über c_move zunichte macht. Vielleicht sehe ich aber das Problem vor lauter Bäumen nicht mehr. Kann mir jemand dabei bitte helfen ?

Code:
while(player) {
		//Rotationen des U-Bootes
		my.pan -= rotationSpeed * mouse_force.x * time_step;
		my.tilt -= rotationSpeed * mouse_force.y * time_step;
		my.tilt = clamp(my.tilt,-20,20);
		
		
		if(trace_hit) {
			collision = 1;
		}		
		
		if(collision == 1) {
			//U-Boot wird zurückgeschleudert
			vecSubmarineMoveSpeed.x = -accelerate(actualSpeedForward, 0,0.4);
			vecSubmarineMoveSpeed.y = -accelerate(actualSpeedSideward, 0,0.4);
			vecSubmarineMoveSpeed.z = -accelerate(actualSpeedUpDown, 0,0.4);
			
			if(vecSubmarineMoveSpeed.x >= 0 && vecSubmarineMoveSpeed.x <= 0 && vecSubmarineMoveSpeed.y >=0 && vecSubmarineMoveSpeed.y <= 0 && vecSubmarineMoveSpeed.z >=0 && vecSubmarineMoveSpeed.z <= 0 ) {
				collision = 0;
			}
		} else {
			vecSubmarineMoveSpeed.x = accelerate(actualSpeedForward, 0.8*(key_w-key_s),0.04);
			vecSubmarineMoveSpeed.y = accelerate(actualSpeedSideward,0.08*(key_a-key_d),0.04);
			vecSubmarineMoveSpeed.z = accelerate(actualSpeedUpDown,0.4*(key_e-key_c),0.04);
		}
			
		c_move(my,vecSubmarineMoveSpeed,nullvector,0);
		distToGround = c_trace(my.x,vector(my.x,my.y,my.z - 10000), IGNORE_ME);

                wait(1);
}

Posted By: fogman

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 01:47

Versuch mal das

if(trace_hit)
{
collision = 1;
}

direkt zwischen die c_move und die c_trace Anweisung zu setzen.

Edit: Das ist sowieso viel sicherer, da sich trace_hit mit jeder wait Anweisung ändern kann, beispielsweise durch andere Entities, die c_Anweisungen ausführen.
Posted By: Ascalon

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 08:15

Ok, das hat geklappt, vielen dank ! Heißt das jetzt aber, wenn irgend eine andere Entity durch c_move ein trace_hit auslöst, dass das auch meinen Player betrifft ? Kann man das trace_hit nicht der jeweiligen c_move ausführung zuordnen ?
Posted By: Error014

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 13:10

"trace_hit auslösen" ist etwas unglücklich formuliert. Stell dir das lieber als eine globale Variable vor, die jede Funktion gleich ändert:

trace_hit wird von jeder c_move und c_trace - Anweisung in deinem Code verändert, auch wenn diese in anderen Funktionen schlummern. Daher ist nach einer c_move bzw. c_trace-Anweisung der Wert von trace_hit nur solange richtig, bis die nächste c_move oder c_trace-Anweisung ausgeführt wird. Man sollte diese Variablen nach einem wait (oder anderen c_move, c_trace-Anweisung) also nicht mehr nutzen.

Du musst also entweder alles, was du mit dem Wert von trace_hit machen möchtest vor dem nächsten wait/c_move/c_trace erledigen (daher das if(trace_hit).. direkt hinter die c_move setzen), oder den Wert in einer Variablen zwischenspeichern (wie du dsa letzendlich mit "collision" machst).


Dafür bieten sich Entity-Skills oder lokale Variablen an.
Posted By: fogman

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 13:18

In Deinem Fall ist das nun kein Problem mehr, da Du die Variable "collision" setzt. Solange die von keiner anderen Entity geändert wird, bist Du auf der sicheren Seite. Besser wäre es, wie von Error014 angemerkt, wenn Du dafür einen skill benutzt.
Posted By: Ascalon

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 13:29

wie soll das mit dem skill genau aussehen ? was ist der unterschied, ob ich einen skill verwende oder eine variable ? weil der skillwert sich auf die jeweilige entity bezieht ?
Posted By: Error014

Re: Problem mit c_trace und c_move, bitte helfen - 03/23/13 13:50

Jede Entity hat von Haus aus 100 Skills - Variablen vom Typ "var". Außerdem hat sie noch ein paar andere Sachen, wie z.B. flags. Wenn du genauer wissen willst, was dich alles erwartet, schau doch mal in "atypes.h" nach - dort findest du die Definition der ENTITY-Struct (einfach nach "typedef struct ENTITY" suchen).

Da diese sowieso von der Engine für dich reserviert werden (ob du willst oder nicht), kannst du sie ja auch benutzen um den Speicher nicht zu verschwenden.

Du greifst auf die Dinger so zu:

Code:
my->skill1


in Lite-C kannst du auch my.skill1 schreiben, wenn du magst

(wobei my der Pointer ist, der auf die von dir gewünschte Entity zeigt - zB könntest du auch "player" verwenden).

Statt skill1 kannst du auch jede andere (ganze) Zahl bis 100 verwenden - Neat!

In deinem Fall kannst du also einfach "collision" durch einen (noch freien) Skill ersetzen (an den Pointer denken! Also zb collision durch player->skill20 ersetzen).
Welcher jetzt wirklich noch frei ist können wir ohne deinen Code zu sehen nicht wissen.
© 2024 lite-C Forums