schau doch, ich steh neben dir!

Posted By: Otter

schau doch, ich steh neben dir! - 02/08/10 00:01

Hallo, hoffe das ihr mir helfen könnt. Ich würde nähmlich gerne wissen, wie ich es machen kann das eine entity immer auf die näheste andere (feindliche) entity in ihrem scanbereich schaut. Währe mir echt eine große hilfe.
Posted By: Fab4

Re: schau doch, ich steh neben dir! - 02/08/10 13:00

generell ist es schon einmal wichtig, dass deine figuren mit bones animiert werden. damit kannst du bewgungen kombinieren.
bones kannst du dann entweder über ein script steuern, oder du speicherst vorgefertigte kopfbewegungen vor und kombinierst sie mit der aktuellen bewegung (z.b. dem rennen)
Posted By: Slin

Re: schau doch, ich steh neben dir! - 02/08/10 13:59

WTF soll die Antwort denn o.O
Sinnloser geht es doch kaum...

Jedenfalls findest du, wenn du im Manual den Befehl "vec_to_angle" nachguckst ein Beispiel für das, was du suchst.Wenn du mit c_Scan arbeitest, setzt der Befehl ja you auf die nächste Entity, so dass du nurnoch zur you-Entity drehen musst.
Posted By: luckyxxl

Re: schau doch, ich steh neben dir! - 02/08/10 16:14

und wenn du nur feindliche entitites suchst setzt du bei den feindlichen entweder einen skill mit einem bestimmten wert oder ein flag damit das script erkennen kann ob die gefundene entity ein feind oder nur ein simples model (ich mein dekorationen oder so) ist
Posted By: atari98

Re: schau doch, ich steh neben dir! - 02/08/10 16:28

Originally Posted By: luckyxxl
und wenn du nur feindliche entitites suchst setzt du bei den feindlichen entweder einen skill mit einem bestimmten wert oder ein flag damit das script erkennen kann ob die gefundene entity ein feind oder nur ein simples model (ich mein dekorationen oder so) ist



feindliche entitites ?????
Posted By: luckyxxl

Re: schau doch, ich steh neben dir! - 02/08/10 16:42

ja otter hat ja gemeint er will nur die feindlichen entities finden aber wenn er dann statdessen z.B. ne munitionsbox scannt wär das nicht so praktisch...
Posted By: hopfel

Re: schau doch, ich steh neben dir! - 02/08/10 18:36

Quote:
generell ist es schon einmal wichtig, dass deine figuren mit bones animiert werden. damit kannst du bewgungen kombinieren.
bones kannst du dann entweder über ein script steuern, oder du speicherst vorgefertigte kopfbewegungen vor und kombinierst sie mit der aktuellen bewegung (z.b. dem rennen)


Ich glaube, er meinte damit den Teil der Frage, wo es darum geht, dass die Entity eine andere anschaut, ohne gleich den ganzen Körper zu bewegen, sondern nur z.b. der Kopf.
Der befehl dafür wäre ent_bonerotate laugh
Posted By: Otter

Re: schau doch, ich steh neben dir! - 02/08/10 19:58

Wow, ging ja fix mit den antworten...
nur schlauer bin ich noch nicht geworden.

Das sich eine entity zu einer anderen eines bestimmten typs dreht, das kann ich ja.
Aber das sie sich zu der nähesten(es sind mehrere feinde im scanbereich) dieses typs dreht übersteigt meinen verstand.
Ich hoffe ihr versteht was ich meine.

<Hopfel>: nette idee, das mit dem Kopf drehen, aber meine entitys sind maschinen und drehen sich nur im ganzen zu ihren zielen.
Posted By: Pappenheimer

Re: schau doch, ich steh neben dir! - 02/08/10 20:14

Das hat Slin im Grunde schon beantwortet, lies es im Handbuch nochmal genauer nach, immerhin ist c_scan eine der komplexeren Funktionen der Engine:
c_scan gibt den Pointer auf die _nächste_ - das heißt wirklich, die am nächsten zur Scan-Position stehende Entity - wieder.

Quote:
Returns:
Distance to closest object found, or 0 if no object was found.
Modifies:
you Pointer to the closest detected entity.
result Distance to the closest detected object.
target Position of the closest detected object.
bounce Direction to the closest detected camera position.
tex_color Color of the closest detected static light.

Posted By: Slin

Re: schau doch, ich steh neben dir! - 02/08/10 20:24

Einfache alternative ist mit ent_next und vec_dist zu arbeiten.
Posted By: Otter

Re: schau doch, ich steh neben dir! - 02/11/10 15:32

Hab jetzt herumexperimentiert und habs hingekriegt. ... also mehr oder weniger. Jetzt hab ich nähmlich ein neues problem und zwar:

meine entitys (nennen wir sie A-Panzer) finden jetzt das näheste feindliche entity (B-Panzer). Das problem ist nur das nicht immer B-Panzer das näheste ist und der A-Panzer deshalb gar nichts mehr macht, bis der B-Panzer wieder das näheste ist. Also hab ich beim Scan vom A-Panzer IGNORE_FLAG2 gesetzt und allen A-Panzern FLAG2 gegeben. Soweit so gut, aber was mach ich jetzt mit den B-Panzern? Es gibt nur IGNORE_FLAG2 und wen ich das bei dennen setzte ignoriert sich jeder gegenseitig und das währe ja noch langweiliger....

Ich denke ent_next könnte mein problem lösen, aber ich blick da nicht ganz durch. Hab ihr vielleicht ein beispiel für mich, das mir hiebei weiterhilft?

zum besseren verständnis hab ich hier meinen code für den A-Panzer reingetan. Das für den B-Panzer sieht gleich aus nur halt ohne FLAG2 zeilen und Skill10 = 1:
Click to reveal..
function team2()
{
var bullet_offset;
my.FLAG2 = on;
c_setminmax(me);
my.Skill10 = 2;
while (1)
{
c_scan(my.x, my.pan, vector(360, 180, 2000), IGNORE_ME | IGNORE_FLAG2 | SCAN_ENTS);
if (you.skill10 == 1)
{
if (vec_dist (my.x, you.x) < 1000)
{
vec_set (temp.x, you.x);
vec_sub (temp.x, my.x);
vec_to_angle (my.pan, temp);
bullet_offset.x = 100;
bullet_offset.y = 0;
bullet_offset.z = 0;
vec_rotate (bullet_offset, my.pan);
vec_add (bullet_offset.x, my.x);
ent_create (rocket_mdl, bullet_offset.x, shoot_move);
wait(-2);
}
}
else
{
you = ent_next(null);
}
wait(1);
}
}


hoffe auf baldige antwort. Bin schon ganz zittrig, will endlich weitermachen ...O_o
Posted By: MikeS

Re: schau doch, ich steh neben dir! - 02/11/10 17:47

hmm, was du machen könntest:

du könntest hingehen und in deinen code ne ent next you schleife einbauen, die, sobald du den scancode ausführst durch alle entities schaltet, und bei denen mit skill 10 == 1 (also gleichem skill 10 wie die scan ausführende entity) das flag 2 setzt. und nachdem der scan durchgeführt wurde,machst du das gleiche nochmal, entferrnst aber den flag 2 wieder. damit kann sowohl panzer gruppe a als auch panzer gruppe b sich selber beim scann ignorieren.

vielleicht hilfts dir weiter.

ne entsprechende ent next you schleife steht im manuel.

gruß

Mike
Posted By: Otter

Re: schau doch, ich steh neben dir! - 02/14/10 22:06

Sorry das ich nochmal deswegen frage, aber ich blick nicht ganz durch mit dem ent_next.
Im Manuel-beispiel wird jedes objekt im level der reihe nach durchgegangen und auf invisible geschaltet,
aber wie kann ich von einem objekt auf das nächste im scanbereich umschalten und so prüfen ob es die richtige skill hat?

Ein kleines beispiel würde mir wirklich weiterhelfen.
Danke schonmal im vorraus.
Posted By: Pappenheimer

Re: schau doch, ich steh neben dir! - 02/14/10 22:59

Ich würde nicht ent_next und c_scan in Kombination verwenden, das verkompliziert die Sache unnötig.

Ich bin mir nicht ganz sicher, ob ich Dich richtig verstanden habe, aber damit der naheste Gegner neu gewählt wird, weil z.B. mittlerweile ein anderer Gegner viel näher gekommen ist als der andere musst Du nur nochmal den Scan ausführen, damit der nunmehr naheste Gegner ausgewählt wird.
Posted By: Otter

Re: schau doch, ich steh neben dir! - 02/15/10 01:27

wirf einen blick auf die oberste post auf dieser seite, da steht ziemlich genau was mein problem ist.
Im endeffekt sollen die panzer nur die nähesten feindlichen panzer im scan anschauen und verbündete ignorieren
(auf feindlicherseite das gleiche)
, das währe alles. smirk
Posted By: Pappenheimer

Re: schau doch, ich steh neben dir! - 02/15/10 02:39

Entschuldige, dass ich nicht jedesmal wieder den ganzen Thread durchlese oder Dein Problem neben den anderen Sachen mit denen ich mich sonst noch beschäftige komplett präsent habe.

Und nichtsdestotrotz gilt weiterhin mein Ratschlag, nicht c_scan und ent_next miteinander zu kombinieren, das eine hilft Dir beim anderen nicht weiter.

Entschuldige auch, dass ich Dein Code-Beispiel nicht genau genug angeschaut hatte, denn dann hätte ich Dir sagen können, dass Du ent_next nicht einmal wirklich angewendet hast.

Und entschuldige, dass ich nicht mehr in Erinnerung hatte, dass ich dir nicht den Vorschlag gepostet hatte, jeder Entity eine ID in einem bestimmten Skill zuzuweisen, sondern das in diesem Thread getan hatte, wo Du gern nochmal nachlesen kannst, wie man mit ent_next und Identitäten von Entities arbeitet:

http://www.opserver.de/ubb7/ubbthreads.php?ubb=showflat&Main=38109&Number=309622#Post309622


Posted By: MikeS

Re: schau doch, ich steh neben dir! - 02/15/10 11:05

Ok, das mit ent next wurde von mir angebracht, damit du dein flag 2 setzten und wieder entfernen kannst, damit du den c_scan für beide gruppen von fahrzeugen nutzen kannst.

also z.b.so: (dummy code)

function scan nearest enemy

you = entnext(null)

while (1)

if (you.skillxx == my.skillxx)
your.flag2 = on;
you = entnext(you)
wait(1)

SCANCODE FÜR C_SCAN

while (1)

if (you.skillxx == my.skillxx)
your.flag2 = off;
you = entnext(you)
wait(1)


die while bedingung must noch selber festlegen, damit das nicht ständig läuft,

die idee dahinter ist jetzt folgende:

rufe die funktion auf, setzte auf allen entities, die meine freunde sind den flag 2,

führe den scan aus, der flag 2 ignoriert,

entferne den flag 2 von allen befreundeten entities, damit der gegner diesen scan auch ausführen kann.

Hoffe das hilft dir

Gruß

MIke
Posted By: Pappenheimer

Re: schau doch, ich steh neben dir! - 02/15/10 21:34

Korrigier mich, wenn ich falsch liege, aber mit "you = ent_next(you);" rufst Du die Entity auf, die in der Liste der Engine steht, unabhängig davon, ob sie im Scanbereich liegt oder nicht, und damit hast Du das Scannen bereits überflüssig gemacht. Dann ist sparender, wenn Du direkt die Liste der Entities durchgehst, und immer, wenn er die Id des Gegners hat (z.B: die Roten haben die Id 1 und die Blauen die Id 2), dann vergleichst Du den Abstand.

Den Vergleich des Abstandes nimmst Du über eine Variable vor, die Du jeweils am Anfang jedes Durchgangs auf einen hohen Wert setzt. Wenn Du dann über ent_next einen Gegner gefunden hast, vergleichst Du seinen Abstand zu dem hohen abstand. Wenn er niedriger ist, wird der Abstand in die Variable kopiert und ist von nun an der Richtwert. Von dem gefundenen Gegner speicherst Du den Handle in einem Skill Deiner Entity.
Dann gehst in der Liste weiter, triffst Du wieder auf einen Gegner, vergleichst Du wieder dessen Abstand mit dem in der Variablen gespeicherten Wert, ist er niedriger, dann ersetzt Du den im Skill gespeicherten Handle durch den Handle dieses Gegners und so weiter.
Das findet in der Schleife "while(you != NULL)" statt.
Wird you == NULL, wird die Schleife verlassen.
Und im Skill ist der Handle des Gegners mit dem geringsten Abstand übrig geblieben,den Du nun über ptr_for_handle "ins Visier nehmen" kannst.
Posted By: episch

Re: schau doch, ich steh neben dir! - 02/16/10 17:20

Code:
function PanzerBGefunden;()
{
	if(event_type == EVENT_SCAN)
	{	
		if(you.panzerBPointer == NULL)
		{
	
		if(you.skill10  == 1)
		{
		you.panzerBPointer = handle(me);
		}
		} else
		{
		if(you.skill10 == 1 && you.PanzerBPointer != 0)
{
ENTITY *PanzerB = ptr_for_handle(you.PanzerBPointer);       
if(vec_dist(my.x,you.x) < vec_dist(panzerB.x,you.x)) 
{
you.PanzerBPointer = handle(me);
							

}		
}
}
}			


action go_panzerB()
{
	set (my,POLYGON);
	my.emask |= ENABLE_SCAN;
        my.event = PanzerBGefunden;


}

action go_panzerA()
{
my.PanzerBPointer = 0;
while(1)
{
c_scan(my.x,my.pan,vector(360,0,1000),IGNORE_ME|IGNORE_PASSABLE|SCAN_ENTS);
if(my.PanzerBPointer != 0)
{
ENTITY feindlicherPanzer = ptr_for_handle(my.PanzerBPointer);
und dan kanste hier die vec_for_angle anweisungen reinpacken
}
}
}



hier ist der code für PanzerB. der Panzer übergibt an den you Pointer,also der SCANENDE panzer seinen Pointer.und speicher den Pointer in einem skill. in diesem Fall
den skill PanzerBPointer, den du in deiner header datei oder sonst wo mit #define PanzerBPointer skill[xx] definiert hast.dan kanst du dan die distanz auch ganz bequem auslesen und den Panzer drehen.

das gleiche kanst du jetzt au mit dem PanzerA machen.

ich hoffe ich konnte die so helfen.
ich hoffe jetzt einfach mal das ich nix mit den klammern verpeilt habe.;)
Posted By: Otter

Re: schau doch, ich steh neben dir! - 02/16/10 20:14

Danke für die vielen hilfreichen antworten! wink
Ich werde jetzt einige zeit brauchen bis ich das alles richtig verstanden hab (hab noch viel zu lernen). frown
Falls noch jemand hilfreiche scripte oder tutorials kennt, soll er sich melden.
Danke nochmals

gruß
Die Otter
Posted By: SomebodyNew

Re: schau doch, ich steh neben dir! - 02/16/10 22:57

Quote:
mit "you = ent_next(you);" rufst Du die Entity auf, die in der Liste der Engine steht, unabhängig davon, ob sie im Scanbereich liegt oder nicht, und damit hast Du das Scannen bereits überflüssig gemacht. Dann ist sparender, wenn Du direkt die Liste der Entities durchgehst, und immer, wenn er die Id des Gegners hat (z.B: die Roten haben die Id 1 und die Blauen die Id 2), dann vergleichst Du den Abstand.

Diese Herangehensweise habe ich öfters im Forum gesehen. Jedes Mal denke ich mir, braucht das nicht enorm viel Rechenpower???
Mal angenommen es würden 500 Entities im Level rumstehen.
Sagen wir 30 davon sind "potentielle Ziele"
Und das Level geht von -50.000 bis +50.000 Quants.

Dann müsste der Rechner 500 If-Abfragen prüfen.
Und 30 mal x2-x1, y2-y1, z2-z1 für im Schnitt 5stellige Dezimal-Zahlen rechnen.
Sowie gegebenenfalls die "neue nächste entity" abspeichern (was ja bis zu 30 mal der Fall sein kann).

Und das ganze laufend für jeden(!) Panzer der im Level rumsteht.

Ich habe schon ein schlechtes Gewissen, jeden Frame die Position des Mauszeigers abzugreifen...

Harmloser Anfänger bittet um Aufklärung =)
Posted By: MasterQ32

Re: schau doch, ich steh neben dir! - 02/16/10 23:01

ein Scan muss genau dasselbe machen:
schaue, welche von deinen Objekten im Scanbereich liegt
also, Winkelberechnungen, usw...

dein Mauszeiger braucht vllt. eine halbe Millisekunde(max.) zur Positionsberechnung, da der Prozessor nur mal kurz nen Speicherbereich kopieren muss.
daher dürfte die ent_next-funktion schneller sein.
Posted By: Pappenheimer

Re: schau doch, ich steh neben dir! - 02/17/10 00:41

'ent_next' musst Du ja nicht jedes Frame aufrufen.
Und wenn die Menge der Entities zu groß ist, machst halt nur einmal so einen Aufruf, um die Handles der Gegner in einer Liste zu speichern, um dann regelmäßig die Liste der Handles durchzugehen und zu überprüfen, welcher der Gegner zur Zeit am nächsten ist.
Und wenn Du tausende von Gegnern hättest, dann machst du halt eine Liste, in die Du immer mal wieder die Gegner aufnimmst, die in einem bestimmten Umkreis sind.
Posted By: Otter

Re: schau doch, ich steh neben dir! - 03/09/10 22:22

RÄTSEL GELÖST:

So für alle dies interessiert, hier der vereinfachte code, der zwei oder mehr "parteien" sich gegenseitig anblicken lässt. Es wird immer nur der nächstliegende "gegner" anvisiert.

function team1()
{
my.skill10 = 1;
while (1)
{
closest_dist = 100000;
you = ent_next(NULL);
while(you != NULL)
{
if((vec_dist(my.x, you.x) < closest_dist)&&(you.skill10 == 2))
{
closest_dist = vec_dist(my.x, you.x);
my.skill4 = handle(you);
you = ptr_for_handle (my.skill4);
vec_set (temp.x, you.x);
vec_sub (temp.x, my.x);
vec_to_angle (my.pan, temp);
}
you = ent_next(you);
}
wait(1);
}
}

Der code stammt von Pappenheimer, dem ich hiermit nochmal danken will. wink
Posted By: WretchedSid

Re: schau doch, ich steh neben dir! - 03/09/10 22:39

Originally Posted By: SomebodyNew
Diese Herangehensweise habe ich öfters im Forum gesehen. Jedes Mal denke ich mir, braucht das nicht enorm viel Rechenpower???
Mal angenommen es würden 500 Entities im Level rumstehen.
Sagen wir 30 davon sind "potentielle Ziele"
Und das Level geht von -50.000 bis +50.000 Quants.

Dann müsste der Rechner 500 If-Abfragen prüfen.
Und 30 mal x2-x1, y2-y1, z2-z1 für im Schnitt 5stellige Dezimal-Zahlen rechnen.
Sowie gegebenenfalls die "neue nächste entity" abspeichern (was ja bis zu 30 mal der Fall sein kann).


Nein, die Funktion geht durch den Array von Entities den die Engine hat. Das ganze sieht ungefähr so aus (aus meiner Engine)
Code:
- (vdTMXLayer *)nextLayer:(vdTMXLayer *)_layer {
	if(contLayer > 0)
	{
		if(!_layer)
			return container[0];
		
		for(int i=0; i<contLayer; i++)
		{
			if(container[i] == _layer)
			{
				if(i < contLayer-1)
				{
					return container[i+1];
				} else {
					return NULL;
				}
			}
		}
	}
	return NULL;
}


© 2024 lite-C Forums