Seite 1 von 1
Angriffsverhalten und Überlappen verhindern
Verfasst: 23.04.2007 18:00
von Darkblade
Hi Leute
Ich hab folgende Probleme:
1. Ich möchte dass die gegner in meinem Spiel mich nur angreifen wenn ich in ihrem Sichtradius bin sonst nicht und mich verfolgen wenn ich einmal im Radius war.
2. Wie kann man das "Durchgehen" durch Sprites verhindern?
Verfasst: 23.04.2007 18:06
von Kaeru Gaman
das ist alles ne frage wie du es berechnest, was für ne technik dahinter steckt.
1. wenn der player im sichtradius des gegners auftaucht, setzt du ein flag,
dass der gegner sich im angriffsmodus befindet.
solange angriffsmodus an ist, bewegst du den gegner auf den player zu,
am besten auf die position, wo der player zuletzt im sichtbereich war,
oder du musst ne lsite anlegen, dass der gegner den "spuren" des players folgt.
sollte der gegner bemerken, wenn der player haken schlägt,
obwohl er nicht im sichtbereich ist, wäre das arg unrealistisch.
2. du sollest generell die virtualle position von objekten verrechnen,
also, wo sie sich in der welt befinden, und nicht, wo sie auf dem screen dargestellt werden.
wenn du das ordentlich machst, kannst du auch verhindern, dass zwei objekte den selben raum einnehmen.
Verfasst: 24.04.2007 14:07
von Darkblade
Zu 1. Gut und wie kann ich einen Sichtradius erstellen?
Zu 2. KAnnst du das etwas genauer erläutern, verstehe nur Bahnhof.
Verfasst: 24.04.2007 14:13
von Kaeru Gaman
1. du musst die koordinaten der objekte vergleichen.
2. die objekte bekommen koordinaten, wo auf der welt sie sich befinden,
und anhand dieser koordinaten werden sie auch bewegt.
bei den bewegungen kann dann geprüft werden, ob andere objekte im weg sind.
...es müsste doch eigentlich ein zwei brauchbare game-tutorials geben...
Verfasst: 24.04.2007 14:16
von RaVeN99
Zu 1.:
Du ermittelst einfach den abstand zwischen Player und Gegner, wenn der hinreichend klein ist (das legst natürlich du fest), befindet sich der Player schonmal im sichtbereich.
Wenn du für jeden Gegner noch die Blickrichtung speicherst, und ein Sichtfeld von Beispielsweise 170° festlegst, kannste auch noch errechnen ob der Player gesehen wird.
Wär ja doof wenn der Gegner den Player sieht obwohl er ihm abgewandt ist
Zu 2.:
Kollisionserkennung heißt das Zauberwort

(Hierzu kannste auch sicher mal googlen wenn du weder Kaerus noch meine Ausführungen verstehst, musst halt das passende für 2D raussuchen)
Im 2D Bereich eigtl. relativ einfach zu bewerkstelligen. Klappt rechnerisch gut und wird auch schnell verarbeitet. Musste halt mit den SpriteKoordinaten und denen vom Player arbeiten.
Theoretisch liefert PB auch ne Kollisionserkennung mit - die iss allerdings langsam, praktisch nicht zu gebrauchen für n game, da zu viel Rechenleistung verbrezelt wird.
Greetz
RaVeN
Verfasst: 24.04.2007 14:18
von Darkblade
Ok.
Danke hab jetzt verstanden.
MfG
Ben
Verfasst: 25.04.2007 22:42
von TomTom
ich weiß ja nicht was du da machst (2d oder 3d) also mit in sicht kommen meinst du einen bestimmen abstand oder einen winkel in dem du gelangt bist.... also der sichtwinkel
Verfasst: 07.05.2007 14:22
von Darkblade
Hab nachgeschaut usw. versteh es auch aber der code klappt nicht fürs Angriffsverhalten (Gegner sollen auf mich zukommen und dann versuchen anzugreifen). kann mal jemand nen Beispielcode posten?
Verfasst: 07.05.2007 14:36
von STARGÅTE
ein CODE wie ein BOT zu dir Läuft ist hier :
http://www.purebasic.fr/german/viewtopi ... 256#139256
Wenn du noch noch ein Paar abstandskontrollen mit einbaust:
Code: Alles auswählen
Procedure.f Abstand(x1, y1, x2, y2)
r.f = Sqr(Pow(x1-x2,2)+Pow(y1-y2,2))
ProcedureReturn r
EndProcedure
dann kannst du auch verhindern dan ein Bot dich Angreift wenn Abstand > 1000 ist und das der Bot nicht in dich rein läuft Abstand < 100 ist. zB
Verfasst: 07.05.2007 22:01
von Kaeru Gaman
aus performancegründen würde ich eher so ein konstrukt vorschlagen:
Code: Alles auswählen
Procedure InDistance(x1.l,y1.l,x2.l,y2.l,dist.l)
If (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) < dist*dist
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
hier wird weder die Pow- noch die Sqr-Funktion benutzt, sondern nur eine einfache multiplikation.
das sollte die geschwindigkeit wesentlich erhöhen.
PS:
so ein einfaches konstrukt kann man dann (ab PB4) auch als Macro implementieren:
Code: Alles auswählen
Macro InDistance(x1.l,y1.l,x2.l,y2.l,dist.l)
(((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) < dist*dist ) Or #False )
EndMacro
beides, Macro und Proc, liefert #True, wenn die distanz unterschritten wird.