|
Problem mit c_trace und c_move, bitte helfen
#420306
03/22/13 21:48
03/22/13 21:48
|
Joined: Apr 2005
Posts: 274 austria
Ascalon
OP
Member
|
OP
Member
Joined: Apr 2005
Posts: 274
austria
|
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 ?
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);
}
|
|
|
Re: Problem mit c_trace und c_move, bitte helfen
[Re: Ascalon]
#420309
03/23/13 01:47
03/23/13 01:47
|
Joined: Apr 2005
Posts: 4,506 Germany
fogman
Expert
|
Expert
Joined: Apr 2005
Posts: 4,506
Germany
|
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.
Last edited by fogman; 03/23/13 01:49.
no science involved
|
|
|
Re: Problem mit c_trace und c_move, bitte helfen
[Re: Ascalon]
#420321
03/23/13 13:10
03/23/13 13:10
|
Joined: Jul 2002
Posts: 3,208 Germany
Error014
Expert
|
Expert
Joined: Jul 2002
Posts: 3,208
Germany
|
"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.
Perhaps this post will get me points for originality at least.
Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!
|
|
|
Re: Problem mit c_trace und c_move, bitte helfen
[Re: Error014]
#420322
03/23/13 13:18
03/23/13 13:18
|
Joined: Apr 2005
Posts: 4,506 Germany
fogman
Expert
|
Expert
Joined: Apr 2005
Posts: 4,506
Germany
|
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.
no science involved
|
|
|
Re: Problem mit c_trace und c_move, bitte helfen
[Re: Ascalon]
#420325
03/23/13 13:50
03/23/13 13:50
|
Joined: Jul 2002
Posts: 3,208 Germany
Error014
Expert
|
Expert
Joined: Jul 2002
Posts: 3,208
Germany
|
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: 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.
Last edited by Error014; 03/23/13 15:17. Reason: clarified wording
Perhaps this post will get me points for originality at least.
Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!
|
|
|
|