Angriffsverhalten und Überlappen verhindern

Anfängerfragen zum Programmieren mit PureBasic.
Darkblade
Beiträge: 12
Registriert: 20.09.2006 18:40
Wohnort: Heilinghausen
Kontaktdaten:

Angriffsverhalten und Überlappen verhindern

Beitrag 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?
Hab die 4.2 Version
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Darkblade
Beiträge: 12
Registriert: 20.09.2006 18:40
Wohnort: Heilinghausen
Kontaktdaten:

Beitrag von Darkblade »

Zu 1. Gut und wie kann ich einen Sichtradius erstellen?

Zu 2. KAnnst du das etwas genauer erläutern, verstehe nur Bahnhof.
Hab die 4.2 Version
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag 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
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Darkblade
Beiträge: 12
Registriert: 20.09.2006 18:40
Wohnort: Heilinghausen
Kontaktdaten:

Beitrag von Darkblade »

Ok.
Danke hab jetzt verstanden.

MfG
Ben
Hab die 4.2 Version
TomTom
Beiträge: 130
Registriert: 18.10.2006 18:47

Beitrag 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
Pure Basic 4.0
Darkblade
Beiträge: 12
Registriert: 20.09.2006 18:40
Wohnort: Heilinghausen
Kontaktdaten:

Beitrag 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?
Hab die 4.2 Version
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten