Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Counter Strike in 2D (https://www.delphipraxis.net/31390-counter-strike-2d.html)

F.W. 8. Okt 2004 13:45


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:

-NIP- 8. Okt 2004 20:56

Re: Counter Strike in 2D
 
Für alle, die es noch nicht wussten:
Es gibt Counter-Strike 2D schon. Counter-Strike 2D
Ist sogar relativ lustig. Man kann es kostenlos herunterladen und mit Bots,
oder im Internet spielen. ;)

-NIP-

Neuni 8. Okt 2004 21:12

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?

F.W. 8. Okt 2004 21:50

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:

Für alle, die es noch nicht wussten:
Es gibt Counter-Strike 2D schon.
:arrow: Na und? Selbst ist der Delphiprogrammer!

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.

F.W. 8. Okt 2004 22:04

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.

MasterC 8. Okt 2004 22:49

Re: Counter Strike in 2D
 
CS2D ist doch schon alt, ich kenne den Entwickler DarkCorner aus dem BlitzForum auch schon lange.

www.cs2d.com und www.unrealsoftware.de sind die offiziellen Adressen.

supermuckl 8. Okt 2004 23:10

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

nailor 9. Okt 2004 16:38

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.

F.W. 10. Okt 2004 00:13

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!

Nicodius 10. Okt 2004 08:40

Re: Counter Strike in 2D
 
Zitat:

Zitat von F.W.
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!

wie oft hast du den da herumprobiert um auf diese Prozentzahl zu kommen :mrgreen:

F.W. 10. Okt 2004 12:17

Re: Counter Strike in 2D
 
Wahrscheinlichkeitsrechnung ist meine Schwachstelle :lol:

mimi 10. Okt 2004 12:39

Re: Counter Strike in 2D
 
du hast doch für die spieler die positions angaben.
jetzt machst du z.b. sowas
Delphi-Quellcode:
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;
so änlich würde ich das lösen*G*
evtl. müste man ein rechteck ziehen

nailor 10. Okt 2004 12:50

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.

alcaeus 10. Okt 2004 12:56

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:
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;
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.

Greetz
alcaeus

nailor 10. Okt 2004 23:23

Re: Counter Strike in 2D
 
hey, es gibt leute, die können diagonal weiter schauen, als geradeaus ;)

Ben1 11. Okt 2004 10:44

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:
http://space.arcor.de/nirw/

F.W. 11. Okt 2004 19:34

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:

Ich nehme jetzt einfach an, dass Player[0] der PC-Spieler ist, und der Rest KI-Spieler
Nein, es gibt keinen PC-Spiele, ich möchte vorerst nur probieren, vom Computer gesteuerte Personen (->"Bots") zu bewegen.
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:
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;
Welches Array muss ich abgehen?

Ben1 11. Okt 2004 20:23

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