![]() |
Counter Strike in 2D
Hallo!
Ich arbeite zur Zeit gerade an einem "Spiel" mit DelphiX. Naja, Spiel ist übertrieben, man kann vorerst nur zusehen. Bis jetzt gibt es 2 Teams, rot und blau. Die Ansicht ist wie in CS, wenn man die Runde "vorzeitig beendet hat". Da kann man auch in einer Ansicht von oben draufschauen. Das Spielfeld hat erstmal eine feste Göße: 800x600. Und ist leer, bis auf die reingesetzten Spieler. Die bewegen sich auch schon ganz gut (Sind TImageSpriteEx). Ich bin zuzeit am überlegen, wie ich die Erkennung umsetzte, d.h. wenn ein Spieler einem anderen über den Weg läuft, soll er ihn evtl. als Feind erkennen, und zwar nicht nur, wenn sie 50 Pixel von einander entfernt stehen. Wie könnte ich das lösen? :drunken: |
Re: Counter Strike in 2D
Für alle, die es noch nicht wussten:
Es gibt Counter-Strike 2D schon. ![]() Ist sogar relativ lustig. Man kann es kostenlos herunterladen und mit Bots, oder im Internet spielen. ;) -NIP- |
Re: Counter Strike in 2D
Also ich versteh die Frage nicht ganz. Soll er den Feind nur dann als Feind erkennen wenn er in einem Radius von 50px in seiner Nähe ist oder was?
|
Re: Counter Strike in 2D
Nee, alle Spieler stammen dem Typ TCSPlayer ab. Dieser hat die Eigenschaft Team, in dem steht, ob Rot oder Blau (T oder CT).
Das Prob ist, wie ich eine Abfrage machen kann, die überprüft, ob sich vor ihm ein TCSPlayer befindet und wenn der dann ein anderes Team ist, dann solls krachen. Zitat:
Wenns danach gänge, könnten wir uns alle begraben lassen, was gibts heutzutage noch nicht? (Ich will jetzt KEINE Antworten haben!!!) Wenn keine Vorschläge kommen, werde ichs wahrscheinlich mit einer GetSpriteAt() abfrage machen, die dann, sagen wir mal, vielleicht 200-500 Pixel vor ihm im Schritt von 20-30 Pixeln abtastet. Bis jetzt soll er ja (und tut er auch schon) auch nur in 4 Richtungen laufen können. |
Re: Counter Strike in 2D
Hab mir CS2D mal eben runtergeladen, ist interessant.
Für mich zählt, dass ich die Technik mal benutzt habe! An so was komme ich in 10 Jahren noch nicht. |
Re: Counter Strike in 2D
CS2D ist doch schon alt, ich kenne den Entwickler DarkCorner aus dem BlitzForum auch schon lange.
![]() ![]() |
Re: Counter Strike in 2D
hab jetzt net geguckt obs das ist.. aber es gibt auchnoch "Soldat" von polnischen codern ( auch mit delphi )
das ist auch CS 2D |
Re: Counter Strike in 2D
zur Frage: teste nicht, ob vor ihm ein spieler ist, sondern ob ein spieler vor ihm ist ;)
d.h. checke nicht, die gegen durch, und schau ob da ein spieler ist, sondern nimm alle spieler und checke wie weit die vom aktuellen spieler weg sind, und eventuell noch in welche richtung. |
Re: Counter Strike in 2D
Hab bisher eine Procedure geschrieben, die in die Richtung Angle alles "vor" ihm checkt, allerdings scheint das zu ca. 0,000000001 % zu funktionieren, bin also für alles offen!
@nailor: Gibts da irgendwo eine Array Eigenschaft oder ähnliches, womit ich das machen kann? Danke schonmal! |
Re: Counter Strike in 2D
Zitat:
|
Re: Counter Strike in 2D
Wahrscheinlichkeitsrechnung ist meine Schwachstelle :lol:
|
Re: Counter Strike in 2D
du hast doch für die spieler die positions angaben.
jetzt machst du z.b. sowas
Delphi-Quellcode:
so änlich würde ich das lösen*G*
function GetFeindlichGegener:Integer;
begin for i:=0 to Gegener.count-1 do begin if (Gegener[i].x - player.x <= 200) and (Gegener[i].y - player.y <= 200) then begin if Genger[i].feindlich = True then begin result:=i; break; end; end; end; end; evtl. müste man ein rechteck ziehen |
Re: Counter Strike in 2D
nö gibts nicht. array mit for-schleife durchgehen und relative position bestimmen. fertig aus.
hab mimis post noch nicht gesehen gehabt, aber so ungefähr könnte es gehen. |
Re: Counter Strike in 2D
Hi mimi,
es wär aber besser, Gegner im Umkreis von z.B. 500 Pixel zu finden: Ich nehme jetzt einfach an, dass Player[0] der PC-Spieler ist, und der Rest KI-Spieler.
Delphi-Quellcode:
Hier werden nur Spieler überprüft, die nicht im Team des PC-Spielers sind. Die if-Abfrage berechnet den Abstand zwischen den Spielern, und vergleicht ihn mit dem maximalen Abstand (Umkreis). Dieser muss quadriert werden, außer du willst die Wurzel des linken Teils des Vergleichs ziehen. Hier fehlt allerdings noch eine Überprüfung, ob ein Objekt im Weg ist. Das wird schon etwas komplizierter.
for i := 1 to Players.Count-1 do
begin if Players[0].Team <> Players[i].Team then begin if Sqr(Players[0].Position.X-Players[i].Position.X)+Sqr(Players[0].Position.Y-Players[i].Position.Y) > Sqr(Umkreis) then //Gegner markieren end; end; Greetz alcaeus |
Re: Counter Strike in 2D
hey, es gibt leute, die können diagonal weiter schauen, als geradeaus ;)
|
Re: Counter Strike in 2D
Ich habe einst (vor vielen Jahren) mal ein ähnliches Spiel mit DelphiX gemacht.
Und bin dabei noch einen Schritt weiter gegangen indem ich versuchte hören und sehen in 2D umzusetzen. Jeder kann nur Truppen in einen bestimmten Sichtfeld sehen, es sei denn sie sind sehr laut dann wurden sie halb durchsichtig gezeichnet. Die Freund-Feind Erkennung lief so das alle Objekte in einem gewissen Umkreis gesucht wurden. Dann erfolgte die Prüfung ob sie im Sichtfeld lagen, falls nicht ob sie hörbar sind. Sollten sie sichtbar sein wurden zusätzlich noch alle anderen Objekte auf ihren Abstand zur Verbindungslinie zwischen eigenen Spieler und dem Feind/Freund überprüft. War dieser Abstand kleiner als die Größe des Objektes - Größe des Freund/Feindes dann wurde er verdeckt (klingt ganz schön kniffelig :wink: ) Ob das Gegenüber dann auch tatsächlich identifiziert werden konnte wurde dann ganz simpel über den Abstand bestimmt. Für alle die sich eines meiner Machwerke mal reinziehen möchten: ![]() |
Re: Counter Strike in 2D
@Ben1: Hab mir dein Spiel noch nicht angesehen, hört sich aber logisch an, auch von den anderen.
Das Prob. ist, ich weiß nicht was ich mit der for-Schleife durchgehen soll. Ich hab mal was versucht, hat aber nicht geklappt:
Delphi-Quellcode:
for I := 0 to DXSpriteEngine.Engine.Items.Count-1
Zitat:
Alle Spieler gehören der Klasse TCSPlayer an. Sie werden nur am Team (TTeam = (TeamCT, TeamT)) unterschieden. (Und sie haben ein blaues bzw. rotes Sprite, das wird anhand von Team zugewiesen). Erstellen TUE ich sie folgender Maßen:
Delphi-Quellcode:
Welches Array muss ich abgehen?
var
NewTeam: TTeam; constructor TCSPlayer.Create(AOwner: TSprite); begin inherited; HP := 100; if Team = TeamCT then begin Image := Game.Pics.Items.Find('Blau'); //Game ist mein Haupt-Formular Width := Game.Pics.Items.Find('Blau').Width; Height := Game.Pics.Items.Find('Blau').Height; X := Random(Game.DXWelt.Width div 3); Y := Random(Game.DXWelt.Height-Height); end else begin Image := Game.Pics.Items.Find('Rot'); Width := Game.Pics.Items.Find('Rot').Width; Height := Game.Pics.Items.Find('Rot').Height; X := Game.DXWelt.Width-Width-Random(Game.DXWelt.Width div 3); Y := Random(Game.DXWelt.Height-Height); end; end; procedure StartGame(ACTCount, ATCount: Integer); var I: integer; begin for I := 1 to ACTCount do begin NewTeam := TeamCT; with TCSPlayer.Create(Game.DXEngine.Engine) do begin end; end; for I := 1 to ATCount do begin NewTeam := TeamT; with TCSPlayer.Create(Game.DXEngine.Engine) do begin end; end; end; |
Re: Counter Strike in 2D
Ich hatte meine Daten unabhängig von DelphiX organisiert. In einer Liste bzw. in vielen Listen. Die Karte war Quadranten eingeteilt von denen jeder einer Liste mit Objekten enthielt die sich dort befanden. Zusätzlich war jedes Objekt noch in einer zweiten Liste registriert die sämtliche Spielobjekte enthielt. Ich brauchte also nur berechnen welche Quadranten betroffen waren und deren Objektlisten durchgehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz