Nicht korrekter Angriff(reihenfolge) [3D]
Übersicht

![]() |
DottakopfBetreff: Nicht korrekter Angriff(reihenfolge) [3D] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Guten Abend zusammen !
Ich hab da so ein Problemchen mit ner Angriffsfunktion von mir. Ich weis auch schon im groben wie es zu lösen ist, doch des dem bb zu vermitteln ist ne andere Sache. Ok so schauts kurzgefasst aus: Ich kann mit nem player "Soldaten" erschaffen welche mir auch im "Def_modus" kontinuirlich folgen. Sobald ich in den "Angriffs_modi" wechsle stürzen sich diese auf diewerse Feinde in der Umgebung und deleten diese bei Kontakt auch. Das Problem : Wenn gerade mal mehr Gegener auf einem Haufen stehen können sich meine "Soldaten" nicht entscheiden wen sie zuerst angreifen sollen und machen ne kleine Kaffepause genau in der Mitte des Gegnerischen Haufens. Das ist aber nicht das Ziel ^^. Sie sollen ja Objekt(Soldat) für Objekt abarbeiten. Ich glaube auch zu wissen woran das liegt: Jeder Soldat hat eine Art "Angrifsradius" er liegt zwischen 1 und 70. Sobalt ich den Befehl zum Angriff gebe pointet er auf alle Objekte innerhalb seines Radiuses und düst auf sie zu. Und genau dan passiert es, er merkt das da ja 2 Gegner sind und versucht dann dumm wie er ist(ok ich hab ihn erschaffen... ) beide gleichzeitig zu deleten ! Das geht aber nicht also bleibt er genau in der Mitte stehen.... Die Frage: Wie sage ich dem Soldaten das er erst den einen, dann den anderen Gegner deleten bzw. "anPointen" soll ? (P.S: Ich hoffe die Beschreibung war nicht allzu lang ![]() So sieht meine momentane ATK funktion aus : (~edit~: Ohman sind da Zeilenumbrüche, sry) Code: [AUSKLAPPEN] Function DEF_ant() For info.ant = Each ant If ATK_mode = False Then PointEntity info\ant_entity,player,0 If EntityDistance(info\ant_entity,player) >2 And ATK_mode = False Then MoveEntity info\ant_entity,0,0,0.8 Next End Function ;--------------------------------------------------------------------------------------------- Function ATK_ant() For info.ant = Each ant For info2.enemy = Each enemy ;Wenn Angriffs modi = true dan auf Enemy pointen If ATK_mode = True Then PointEntity info\ant_entity,info2\eny_entity,0 If EntityDistance(info\ant_entity,info2\eny_entity) >1 And EntityDistance(info\ant_entity,info2\eny_entity) <70 And ATK_mode = True Then MoveEntity info\ant_entity,0,0,0.8 ;bei Kollision löschen If EntityCollided(info2\eny_entity,TYPE_ANT) Then FreeEntity info2\eny_entity Delete info2.enemy End If Next Next End Function Ich hoffe Ihr könnt mir da weiterhelfen und danke euch auch schoneinmal im vorraus für eure Mühe !! MFG Dottakopf |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm, vielleicht hilft dir es:
1. Möglichkeit: Jeder deiner Soldaten greifen nur die an, die sich am nähesten zu sich selbst oder dir (bleibt dir überlassen) befinden, und greifen auch nur diesen erstmal an. 2. Möglichkeit: Jeder deiner Soldaten hat ja jetzt bereits eine art Auftragsvariable (also das, was er grad zu tun hat zB dir folgen etc..), wenn man noch eine weitere Spezifikationsvariable einbaut die sagt: Wenn Auftrag 'angreifen' dann suchen Gegner suchen und diesen in die Spezifikation packen. Später wird die Spazifikation abgearbeitet, welches hier zB das deleten eines bestimmten Gegners ist. In deinem Fall pointet dein Soldat alle Gegner an, die sich inerhalb des Radius 1 bis 70 befinden. Das heisst, dein Sodat dreht sich zu einem hin, bewegt sich ein schritt, dann bewegt er sich zum anderen und begt sich wieder ein schritt. Folge: Dein Soldat bewegt sich zwischen zwei Gegnern und tut anscheinen garnichst, und sehen kannst du es nicht, weil UpdateWorld + Flip zwischen beiden Aktionen nicht ausgeführt wurde. |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm ..
Möglichkeit 1 die du mir angeboten hast würde ich gerne benutzen und das hatte ich auf vor, doch wie schaffe ich es, dass sobald ein Soldat einen gegner erfasst hat, damit aufhört sich einen neuen Feind zu suchen. Ich arbeite ja mit Poinentity und ich kann ja ned einfach sagen : stop ~point gegener~ / Deleten ausführen. (oder doch?) Und wie frage ich am besten die entfernung zwischen Gegener und Soldat innerhalb des Angriffradiusses ab? Wäre dieser Gedanke dazu richtig: If ATK_modi = true und innerhalb Radius und ...(ja ähh wie frage ich etz die kürzeste distance soldat/feind ab ) .....then Gibts da vielleicht nen extra Befehl ?? (des mit dem Kaffekränzchen war a wengle übertrieben, die schnappen sich die typen scho aber manchmal wollen die halt ned ^^.) mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Möglichkeit 1, schliesst nicht aus, dass ein Soldat sich während eines Angrifs sich ein neuen aussucht. Daher habe ich auch die 2. Möglichkeit in Betracht gegeben.
Die Möglichkeit 1 hätte aber nicht das Problem, welches du bereits geschildert hast. Ein Soldat würde - wenn überhaupt - sich nur einmal vielleicht zweimal umentscheiden, bis der entgültige Kampf statt findet. Welches der nächste Gegner kannst du doch am einfachsten mit EntityDistance machen. zB If EntityDistance(a,b)<gespeicherte Distanz zu einem anderem Gegner Then gespeicherte Distanz zu einem anderem Gegner=EntityDistance(a,b) |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja genau sowas meinte ich auch. Des Rätsels lösung ist wie du sagtest :
If EntityDistance(a,b)<gespeicherte Distanz zu einem anderem Gegner Doch wie Spreche ich den Jeweiligen gegener an? Den sobald ich sage: Wenn Abstand Soldat,Feind < als Abstand anderer Feinde Dann... Geht er ja wieder von allen Feinden aus(info2.enemy= ech enemy). Und berechnet von Allen die Entfernung. ![]() ![]() Then gespeicherte Distanz zu einem anderem Gegner=EntityDistance(a,b) Ich bemühe micht Sehr, bin aber noch net so fit! mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe ich irgendwie nicht geschafft, es in Worte zu fassen, so kommt der Code: [AUSKLAPPEN] Graphics 400,100,0,2
SetBuffer BackBuffer() Dim entf(4) schwelle=70 While Not KeyHit(1) For q=0 To 4 ;Entfernungen setzen entf(q)=Rand(0,400) ;Entfernungen Anzeigen Rect 0,q*8,entf(q),8,1 Next ;Auf Angriff save=schwelle For q=0 To 4 If entf(q)<schwelle If entf(q)<save save=entf(q) posi=q End If End If Next Color 255,0,0 Rect schwelle,0,1,50,1 If save=schwelle Text 0,60,"Nichts Ausgewählt" Else Text 0,60,"Ausgewählt: "+posi Rect 0,posi*8,entf(posi),8,1 End If Color 255,255,255 Flip Delay 2000 Cls Wend End Hoffe das es dir hilft. |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo das hilft mir ! Danke ![]() Das Problem ist dass ich noch nie mit Arrys gearbeitet habe, aber ich weis wie sie funktionieren! Ich studier den code etz mal ne zeitlang und versuch den mal in meinem Progi umzusetzten. Wenn s nicht klappt oder ich was ned check frag ich nochmal nach. Also sag ich erstmal danke für deine Hilfe !! (P.S.: Schickes Beispiel proggi !) mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das mit Array ist nur als Beispiel gedacht, das geht natürlich auch mit Types etc... Ich hatte nur keine Lust das ganze mit Types zu machen. Es soll ja nur als 'Gedankenstütze' diehnen, nichts weiter. | ||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Im großen und ganzen verstehe ich dieses Beispiel. Nur eine stelle wurmt mich:
Code: [AUSKLAPPEN] save=schwelle For q=0 To 4 If entf(q)<schwelle And entf(q) <save Then save=entf(q) posi = q end if Ich hab da ein "and " miteingebaut" (fands für mich übersichtlicher). Es wird Save der gleiche Wert wie Schwelle zugewiesen (also 70) In der Folgenden Abfrage wird dan doch eigentlich 2mal die gleiche abfrage gemacht !?(einmal <schwelle, einmal <save) und dan wird Save = Entf. zugewiesen. Aber warum ??? Boa ich seh da die Logik nicht^^ ![]() |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Übersicht bleibt jedem selbst überlassen. Ich mache zwei If-Abfragen, weil dann BB immer nur dann die nächste Abfrage 'berechnet' wenn die erste bereits zutrifft. Mit And werden immer beide durchgenommen, und das nimmt ein klein wenig mehr Rechenaufwand mit sich. Auch wenn es für die meisten Sachen unerheblich ist.
Zu der Frage: In dieser Abfrage ist ein kleines Paradox drine, welches ausgehebelt werden muß. Du willst, dass deine Soldaten nur Gegner angreifen die sich innerhalb eines bestimmten Radius befinden und dann noch am nächsten zu sich selbst stehen. Andererseits willst du nicht das sie angreifen, wenn niemand innerhalb des Radius ist. Daher muß - für die Abfrage - save zunächst ein übergroßer Wert zugewiesen werden, ansonsten ginge es auch mit zahllosen weiteren Variablen. Ich bevorzuge allerdings das Anwenden von wenigen Variablen. Die aufgeführte Möglichkeit wird save=schwelle gegeben, so kann am Ende überprüft werden - If save=schwelle Then nicht gefunden -. Daher kann eine Entfernung die mehr als die Schwelle ist nicht angegriffen werden. Alternative währe: save=999999 ... If save=999999 Then nichts gefunden Das währe aber eine echte Notlösung. Ansonsten schlecht zu erklären. Wenn du mit Types besser zurecht kommst, so ist eine Konventierung ins Type vielleicht besser für dich... |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ui ui kein leichter Fall. Aber ich sehe du gibst dir echt große mühe mir zu helfen und des ist eigentlich schonmal n rießen lob wert! ![]() Aber ich denke ich bin vielleicht noch nicht erfahren genug für solch eine Berechnung. Ich konnte das Angriffsproblem lösen, indem ich auch meinen Feinden eine Art "Angriffsradus" zugeteilt habe. Da sich jetzt beide innerhalb einer distance entgegenkommen, sieht es jetzt nicht nur besser aus, es funzt auch recht gut und zuverlässig. Aber drumrum werde ich wohl nie kommen da ich des früher oder später eh mal brauchen werde. Ich werd des etz mal als Abgehackt sehen und mich dem nächsten Problem stellen! (die jeweilige dmG und HP verteilung). Also danke nochmal !! mfg Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group