flieg Gegner! FLIEG!

Posted By: Otter

flieg Gegner! FLIEG! - 02/01/11 11:56

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
Posted By: Rondidon

Re: flieg Gegner! FLIEG! - 02/01/11 12:23

Die Zeichnung ist ja mal wieder cool. Bewundernswert, dass du immer so viel Energie in deine Erklärungen reinsteckst laugh 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.

Posted By: Widi

Re: flieg Gegner! FLIEG! - 02/01/11 13:54

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 wink
@Rondidon: Du hast dir auch Mühe mit deiner Zeichnung gegeben, aber an die Illustration von Otter reicht es leider nicht ganz heran wink
Posted By: Otter

Re: flieg Gegner! FLIEG! - 02/01/11 21:51

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?
Posted By: Rondidon

Re: flieg Gegner! FLIEG! - 02/01/11 23:04

Keine Garantie für Fehlerfreiheit, aber eigentlich sollte es so gehen. Getestet habe ich es nicht.

Code:
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.
}



Quote:

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ü)
Posted By: Pappenheimer

Re: flieg Gegner! FLIEG! - 02/01/11 23:17

Originally Posted By: Otter
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
Posted By: Otter

Re: flieg Gegner! FLIEG! - 02/03/11 18:46

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?

Quote:
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 wink

OTTER
Posted By: Superku

Re: flieg Gegner! FLIEG! - 02/03/11 18:51

Deine ersten beiden orangen Code-Zeilen sind schon korrekt, nur musst du diese einmalig bei der Ei-Explosion ausführen und nicht auf my.x addieren (3. Zeile), sondern auf einen Speed-(Skill-)Vektor, dann sieht es viel schicker aus und die Figur bewegt sich auch weiterhin außerhalb des Scan-Radius'.
In deiner jeweiligen Entity-While musst du nun nur noch die Geschwindigkeitswerte reduzieren (und Schwerkraft simulieren).
Posted By: Rondidon

Re: flieg Gegner! FLIEG! - 02/03/11 18:51

Lies mal meinen Programmcode. Den kannst du eigentlich 1:1 übernehmen wenn ich keinen Fehler gemacht habe. Ich hab da auch Gravitation eingebaut (an den zahlen musst du noch ein wenig rumspielen).

Allerdings hab ich den Engine-eigenen Scan-bereich nicht genutzt. Die Reichweite ist mathematisch gelößt. Du musst im Prinzip nur deine "Explosionsstaerke" eintragen (Recihweite in Quants) und das wars. Je weiter weg von der Explosion, desto weniger Einfluss hat es auf deine Gegner.
Kann allerdings sein, dass sich das mit deinem bisherigen System beißt. Einfach mal ausprobieren.
Posted By: Pappenheimer

Re: flieg Gegner! FLIEG! - 02/03/11 23:01

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);
{
...
Posted By: Otter

Re: flieg Gegner! FLIEG! - 02/04/11 10:56

@Rondidon: bei deinem Code kommen fehler wie "x is not a member of BOOL" oder syntax error. Aber ich werd mir noch anschauen, wie genau du das gemacht hast.

Okay, ich hab den code so übernommen wie ihr ihn mir geschrieben habt (zumindest die 3 zeilen). Der gegner wurde immer wieder nach links gezogen, egal von woaus ich in beschoss.
Hab sogar eine dummy function geschrieben die völlig frei von jedem störenden einfluss ist. Gleiches Problem!
Allerdings hab ich den temp vector der die richtung angibt durch einen neuen ersetzt und plötzlich klappt es.
Achja, und ich hab vec_add als einzige zeile wiederholen lassen.

Click to reveal..

action dummy()
{
VECTOR fly_direction;
var speed = 10;
c_setminmax (me);
my.emask = ENABLE_SCAN;
my.event = dummy_react;
my.leben = 1;
while(1)
{
if(my.leben <= 0)
{
vec_diff(fly_direction.x, my.x, temp.x);
vec_normalize(fly_direction.x, speed);
while(1)
{
vec_add(my.x, fly_direction.x);
wait(1);
}
}
wait(1);
}
}

function dummy_react()
{
if(your.typ == EGG)
{
my.leben = 0;
vec_set(temp.x, you.x);
}
}


Sagt nicht, ich hätte vergessen "speed" runterzuzählen!
Darum werd ich mich jetzt kümmern.

Danke fürs erste
OTTER
Posted By: Pappenheimer

Re: flieg Gegner! FLIEG! - 02/04/11 16:01

Entschuldige, temp für eine Variable zu nehmen, deren Wert dann kontinuierlich von einer Funktion weiterverwendet wird, war natürlich blöd von mir.
© 2024 lite-C Forums