Nicht korrekter Angriff(reihenfolge) [3D]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Nicht korrekter Angriff(reihenfolge) [3D]

BeitragDo, Jan 18, 2007 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed )

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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 18, 2007 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 18, 2007 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jan 18, 2007 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 19, 2007 10:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Embarassed Und könntest du mir kurz erklären was damit bezweckt/gemacht wird ?: Embarassed
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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 19, 2007 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 19, 2007 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo das hilft mir ! Danke Surprised
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!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 19, 2007 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 19, 2007 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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^^ Embarassed
Rechtschreibfehler gelten der allgemeinen Belustigung!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jan 19, 2007 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ü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

BeitragFr, Jan 19, 2007 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Very Happy

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!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group