1 registered members (M_D),
1,430
guests, and 3
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
flieg Gegner! FLIEG!
#356333
02/01/11 11:56
02/01/11 11:56
|
Joined: Feb 2010
Posts: 482 in deinem Kopf
Otter
OP
Senior Member
|
OP
Senior Member
Joined: Feb 2010
Posts: 482
in deinem Kopf
|
Hi guys!Mein heutiges Problem betrifft den flugwinkel von weggesprengten gegnern oder sonstwas. Das Bild ist denke ich ziehmlich selbsterklärend. Es gibt nur den x und z winkel zu berücksichtigen. Die gegner werden durch c_move mit speed_x und speed_z im "absdist"vector durchs level bewegt. Wie ermittle ich eine linie zwischen gegner und dem zentrum der explosion, die dann den winkel der flugbahn auf speed_x und speed_z überträgt? Sagt bescheit wenn ihr keine ahnung habt was ich da laber.OTTER
Be my UBB-Buddy, without any reason!
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Otter]
#356335
02/01/11 12:23
02/01/11 12:23
|
Joined: Aug 2002
Posts: 2,183 Germany, BaW�
Rondidon
Expert
|
Expert
Joined: Aug 2002
Posts: 2,183
Germany, BaW�
|
Die Zeichnung ist ja mal wieder cool. Bewundernswert, dass du immer so viel Energie in deine Erklärungen reinsteckst Also: Zur Erklärung Erstmal sorry dass ich das mit den Definitionen so verhauen habe. Ich hoffe man kann es trotzdem verstehen. Wenn nicht, einfach sagen. Delta x = Der X-Vektor des Objektes minus Der X-Vektor der Explosion Delta z = Der Z-Vektor des Objektes minus Der Z-Vektor der Explosion Damit hast du schon den Richtungsvektor. Jetzt fehlt noch die Geschwindigkeit. Das ist Fres. Fres bekommst du mit dem Satz des Pythagoras. (Hypothenuse zum Quadrat gleich Kathethe 1 zum quadrat plus Kathete 2 zum Quadrat). Edit: Die Endgeschwindigkeit wäre jetzt stärker, je weiter die Explosion entfernt ist. Löse es einfach so. Explosionsauswirkung = Explisonsstärke - Fres. Fres darf maximal so groß wie die Explosionsstärke sein, aber das kannst du im Code ja recht einfach umsetzen.Übertrage das in die c_move Funktion - und fertig. Lustig wären noch Abpraller am Boden danach. Dafür einfach Einfallwinkel = Ausfallwinkel-(Ausfallwinkel*0.5). Oder halt PhysX.
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Rondidon]
#356347
02/01/11 13:54
02/01/11 13:54
|
Joined: Aug 2007
Posts: 1,922 Schweiz
Widi
Serious User
|
Serious User
Joined: Aug 2007
Posts: 1,922
Schweiz
|
vec_diff ( VECTOR* vector, VECTOR* vector1, VECTOR* vector2); Setzt den vektor auf die Differenz von vector1 und vector2. Nach der Anweisung gibt Vector die Richtung von vector2 zu vector1 an. Parameter: vector - Differenz von vector1 und vector2 vector1 - Erster Vektor. Benutzen Sie nullvector, um vector auf das Negativum von vector2 zu setzen. vector2 - Zweiter Vektor Das sollte eigentlich reichen @Rondidon: Du hast dir auch Mühe mit deiner Zeichnung gegeben, aber an die Illustration von Otter reicht es leider nicht ganz heran
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Widi]
#356424
02/01/11 21:51
02/01/11 21:51
|
Joined: Feb 2010
Posts: 482 in deinem Kopf
Otter
OP
Senior Member
|
OP
Senior Member
Joined: Feb 2010
Posts: 482
in deinem Kopf
|
der erste vector von vec_diff, also die differenz zwischen 1 und 2 - ist das ergebnis ein abstand oder ein winkel? Ich blick da nicht ganz durch ...
action goomba() { ... ... goomba macht goombazeugs .... ... if(my.manner_of_death == 4) //// manner_of_death = art des todes { ????? } } wait(1); } ent_remove(me);
function goomba_react(){ switch (event_type) { case EVENT_SCAN: if(you.typ == EGG) //// wenn goomba von Eier-explosions-scan erfasst wird { my.leben = 0; my.manner_of_death = 4; ???? } ... ...
Das müsste eigentlich der ganze wichtige code für diese aktion sein oder?
Be my UBB-Buddy, without any reason!
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Otter]
#356427
02/01/11 23:04
02/01/11 23:04
|
Joined: Aug 2002
Posts: 2,183 Germany, BaW�
Rondidon
Expert
|
Expert
Joined: Aug 2002
Posts: 2,183
Germany, BaW�
|
Keine Garantie für Fehlerfreiheit, aber eigentlich sollte es so gehen. Getestet habe ich es nicht.
if(my.manner_of_death == 4) //// manner_of_death = art des todes
{
var richtungsvektor[3];
var geschwindigkeit;
var explosionsstaerke = 200; //maximale Stärke der Explosionsauswirkung. Gleichzeitig Radius der Explosionsauswirkung
var vektorenabstand = vec_dist(EGG.x,my.x); //Abstand zwischen Gegner (my) und explodierendem Ei (EGG) berechnen
if(vektorenabstand > explosionsstaerke) { vektorenabstand = explosionsstaerke} //Radius der Explosionseinwirkung beschränken
vec_diff(richtungsvektor,EGG.x,my.x) //Richtungsvektor berechnen durch Differenz zwischen Ei und Gegner
geschwindigkeit = 0.2*(explosionsstaerke - vektorenabstand); //Auswirkung der Explosion berechnen. Die 0.2 davor ist der Faktor wie stark sich die Explosion auswirken soll. Kannst du ändern.
vec_scale(richtungsvektor,geschwindigkeit); //Geschwindigkeit in den Richtungsvektor einrechnen
while(c_move(my,NULL,richtungsvektor,IGNORE_PASSABLE)>0) //Während Entity in der Luft ist bzw. kein Hindernis trifft (hier bin ich mir nicht ganz sicher, Musst du mal testen)
{
c_move(my,NULL,richtungsvektor,IGNORE_PASSABLE);
richtungsvektor[2] -= time_step; //Erdgravitation in die Flugbahn einrechnen.
wait(1);
}
//Ab hier berührt die Entity den Boden. Jetzt kannst du die Entity z.B. abprallen lassen. Aber probier erstmal das oben aus.
}
der erste vector von vec_diff, also die differenz zwischen 1 und 2 - ist das ergebnis ein abstand oder ein winkel? Ich blick da nicht ganz durch ...
Das ist ein Vektor. Pappenheimer erklärt das noch genauer. Schau mal in deinem Mathebuch oder Formelsammlung wenn du das noch /schon hast. In der Oberstufe Gymnasium macht man das ab der 12. soweit ich mich erinnern kann (BaWü)
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Otter]
#356431
02/01/11 23:17
02/01/11 23:17
|
Joined: Sep 2003
Posts: 5,900 Bielefeld, Germany
Pappenheimer
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 5,900
Bielefeld, Germany
|
der erste vector von vec_diff, also die differenz zwischen 1 und 2 - ist das ergebnis ein abstand oder ein winkel? Ich blick da nicht ganz durch ... vec_diff gibt die Richtung an, genau genommen, ist es eine Strecke im Raum, die Strecke zwischen 1 und 2. Das Ergebnis ist also ein Vector mit 3 Werten. vec_dist (!) gibt den Abstand wieder - das Ergebnis ist ein Wert (nicht 3 wie in einem Vector) Also: vec_diff(temp.x, my.x, you.x);//berechnet die Strecke zwischen my und you mit der Blickrichtung zu my vec_normalize(temp.x, speed);//Setzt die Streckenlänge auf den Wert von "speed" vec_add(my.x, temp.x);//Addiert die resultierende Strecke zur Position von my hinzu
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Pappenheimer]
#356758
02/03/11 18:46
02/03/11 18:46
|
Joined: Feb 2010
Posts: 482 in deinem Kopf
Otter
OP
Senior Member
|
OP
Senior Member
Joined: Feb 2010
Posts: 482
in deinem Kopf
|
Tud mir leid, das ich erst jetzt antworte. Die zeilen machen genau was ich will mit ausnahme der tatsache, dass der gegner auserhalb des scanbereichs sich nicht mehr weiterbewegt und in der luft hängt. Klar, ich hab den code ja auch in den Scan bereich hineingesetzt function goomba_react(){ switch (event_type) { case EVENT_SCAN: if(you.typ == EGG) //// wenn goomba von Eier-explosions-scan erfasst wird { my.leben = 0; my.manner_of_death = 4; vec_diff(temp.x, my.x, you.x); vec_normalize(temp.x, 20); vec_add(my.x, temp.x);} ... ... wenn ich es beim actor reinschreibe wird er immer wieder wiederholt, und sucht sich anscheinend irgendeinen you-pointer und wechselt mehrmals die richtung im flug. vec_add(); ist doch dazu da die ausgemessene strecke "abzufahren", oder? Wenn ich aber die beiden "Mess-Zeilen" vec_diff und vec_normalice nur einmal aufrufen lasse und vec_add in einem loop, sollte es doch funktionieren. Blöderweise übernimmt vec_add offensichtlich nicht den richtigen temp-wert. Muss ich einen anderen vector als temp dafür nehmen oder geh ich sowieso in die falsche richtung? Du hast dir auch Mühe mit deiner Zeichnung gegeben, aber an die Illustration von Otter reicht es leider nicht ganz heran Da bin ich "einsame spitze", nicht war jungs OTTER
Be my UBB-Buddy, without any reason!
|
|
|
Re: flieg Gegner! FLIEG!
[Re: Rondidon]
#356799
02/03/11 23:01
02/03/11 23:01
|
Joined: Sep 2003
Posts: 5,900 Bielefeld, Germany
Pappenheimer
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 5,900
Bielefeld, Germany
|
Du solltest das Ei besser den Zustand des Goomba ändern lassen und dann das Wegfliegen in den Zustand reinschreiben:
#define state skill1 // ein Skill Deiner Wahl #define geh_herum 1 #define flieg_weg 2 ....
dann in dem Event:
if(you.typ == EGG) // wenn goomba vom Eier-Explosions-Scan erfasst wird { my.state = flieg_weg; vec_set(temp.x, you.x);//kopiere die Position des Eis in den Temp-Vektor }
...
und in der Hauptfunktion des Goomba.
var speed = 0;//führe eine Variable für die Fluggeschwindigkeit ein
in die while-Schleife der Hauptfunktion:
if(my.state == flieg_weg) //// wenn goomba von Eier-explosions-scan erfasst wird { my.leben = 0; my.manner_of_death = 4; vec_diff(temp.x, my.x, temp.x); vec_normalize(temp.x, speed);//statt einer festen Zahl eine Variable, sodass du den Wert im Verlauf des Fluges ändern kannst vec_add(my.x, temp.x); { ...
|
|
|
Moderated by mk_1, Perro, rayp, Realspawn, Rei_Ayanami, rvL_eXile, Spirit, Superku, Tobias, TSG_Torsten, VeT
|