3 registered members (Akow, TipmyPip, tomaslolo),
788
guests, and 11
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: schau doch, ich steh neben dir!
[Re: Pappenheimer]
#310783
02/16/10 22:57
02/16/10 22:57
|
Joined: Jul 2009
Posts: 36
SomebodyNew
Newbie
|
Newbie
Joined: Jul 2009
Posts: 36
|
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 =)
|
|
|
Re: schau doch, ich steh neben dir!
[Re: SomebodyNew]
#310784
02/16/10 23:01
02/16/10 23:01
|
Joined: Nov 2007
Posts: 2,568 Germany, BW, Stuttgart
MasterQ32
Expert
|
Expert
Joined: Nov 2007
Posts: 2,568
Germany, BW, Stuttgart
|
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.
|
|
|
Re: schau doch, ich steh neben dir!
[Re: MasterQ32]
#310793
02/17/10 00:41
02/17/10 00:41
|
Joined: Sep 2003
Posts: 5,900 Bielefeld, Germany
Pappenheimer
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 5,900
Bielefeld, Germany
|
'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.
|
|
|
Re: schau doch, ich steh neben dir!
[Re: Pappenheimer]
#314660
03/09/10 22:22
03/09/10 22:22
|
Joined: Feb 2010
Posts: 482 in deinem Kopf
Otter
OP
Senior Member
|
OP
Senior Member
Joined: Feb 2010
Posts: 482
in deinem Kopf
|
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.
Be my UBB-Buddy, without any reason!
|
|
|
Re: schau doch, ich steh neben dir!
[Re: SomebodyNew]
#314663
03/09/10 22:39
03/09/10 22:39
|
Joined: Apr 2007
Posts: 3,751 Canada
WretchedSid
Expert
|
Expert
Joined: Apr 2007
Posts: 3,751
Canada
|
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)
- (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;
}
Shitlord by trade and passion. Graphics programmer at Laminar Research. I write blog posts at feresignum.com
|
|
|
Moderated by mk_1, Perro, rayp, Realspawn, Rei_Ayanami, rvL_eXile, Spirit, Superku, Tobias, TSG_Torsten, VeT
|