Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX Frage für Spiel (https://www.delphipraxis.net/48576-delphix-frage-fuer-spiel.html)

tmode00 27. Jun 2005 16:02


DelphiX Frage für Spiel
 
Hi, bei der Entwicklung eines Spiels

siehe: Spiel- Thread

bin ich auf ein Problem gestoßen:

In Typ deklerations Bereich habe ich einen typ bauen deklariert:

Delphi-Quellcode:
Type
  Bauen = record
  Feld:Array[1..999] of byte;
  x:integer;
  y:integer;
  test:byte;
  arraylaufer:integer;
  end;
...dann habe ich vor dem Implementations- Bereich Variablen dieses Types deklariert:
Delphi-Quellcode:
var
  Lager:Bauen;
  Bau:Bauen;

implementation
...dann habe ich einen DxTimer und ein DxDraw Object, sowie eine DxImageList stationiert

...die Bilder für die ImageList habe ich im Bereich OnCreate (des Forms) zugewiesen um
Ladezeit zu sparen:

Delphi-Quellcode:
DXImageList1.Items[1].Picture.Bitmap.LoadFromFile('.\Bilder\Bauen\Lager.bmp');
...so, nun beinhaltet meine ImageList als erstes Objekt Lager.bmp

...In der OnTimer Przedur--->

procedure TSpielfenster.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
DxDraw1.surface.fill(0);
DXImageList.Items[1].Draw(DXDraw1.Surface,0,0,0);
DxDraw1.flip;

//Das Bild 1 an Position 0,0,[patternIndex] auf DXDraw1.surface zeichnen!

end;

Problem:
Ich möchte nun ein PopupMenü Machen, indem man z.B. Kollonisationsschiff anklicken kann und das dann ein -meinetwegen schon oben (onCreate) vorgeladenes- Bild genau wie Lager.bmp auf dem Surface angezeigt wird. Problem ist dass ich es ja nicht einfach in die Timer Routine einbinden kann, da es ja dann immer da währe! Wenn ich das versuche mit Variablen zu Umgehen (if a=1 then zeichne; a:=0; end;) da es dann nur Blinken würde weil der Videospeicher ja immerwieder geleert wird (oben). Ich brauche also dringend Rat!!

Ps. --> Bitte nicht an kleinigkeiten (wenn mal DxDraw1 oder DxDraw dasteht) hochziehen, ich denke ihr wisst was ich meine!

Tmode00

tmode00 5. Jul 2005 11:32

Re: DelphiX Frage für Spiel
 
Antwort wäre gut!

Aenogym 5. Jul 2005 11:50

Re: DelphiX Frage für Spiel
 
hi,

ich habe keine antwort auf dein problem, aber ich möchte dir einen guten tipp geben:
nutze möglichst wenig records und arrays und möglichst keine globalen variablen!

dein bauen-typ ist an sich schon unglücklich gewählt. ich habe vor einiger zeit mal angefangen, eine kleine echtzeitstrategiespiel-engine zu programmieren (wegen zeitmangel arbeite ich grad nicht dran).
ich schlage dir vor, dass du dir eine klassenstruktur aufbaust. dazu musst du erst einmal überlegen, aus welchen teilen dein spiel bestehen soll.


standardmäßig wären das:
  • Der eigentliche Spieler (Mensch bzw. CPU)
  • Die Objekte des Spielers:
    • Einheiten
    • Gebäude
  • Die Forschungsobjekte
  • Die Map

für jedes dieser teile entwickelst du am besten eine eigene klasse. das ganze sollte hierarchisch aufgebaut sein, d.h., die objekte-klasse enthält eine TList, welche referenzen zu den bislang gebauten gebäuden des spielers enthält. eine weitere liste enthält die einheiten, eine liste enthält alle forschungsobjekte usw.
die forschungsobjekte enthalten dann zB noch einen status, ob der spielers sie bereits erforscht hat. in die einheiten und gebäuden wird gespeichert, wie viele hitpoints sie noch haben und wieviele sie maximal haben können...

wenn du eine klare struktur hast, kannst du zB von den parent-klassen der gebäude neue klassen ableiten, die die einzelnen gebäude repräsentieren (also von TChurch über THouse bis THuntingLodge - das ist ja vollkommen dir überlassen). du musst den neuen klassen dann nur noch spezielle eigenschaften geben, da sie allgemeine informationen wie bauzeit oder hitpoints ja von der parent-klasse geerbt haben.

ach, und
Zitat:

Antwort wäre gut!
hört sich nicht ganz so nett an. jeder fragesteller möchte gern eine antwort. und mit einem netteren ton kommt man oft schneller an antworten ;)

viel erfolg,
aenogym

tmode00 5. Jul 2005 11:58

Re: DelphiX Frage für Spiel
 
Entschuldigung für meinen Streng gewählten ton! Aber erstmal vielen vielen Dank, das bringt mich (denke ich) schon viel weiter. Wenn man solche anstöße bekommt, dann weis man auch wie man ambesten eine Lösung für solche Probleme bekommt.
Ich denke ich sollte alles nochmal streng überarbeiten, so von Grund auf
eben alles etwas in Richtung Klassen umstrukturieren. Mein Problem ist
nämlich, das ich am Anfang eigendlich immer recht gut voran komme und dann durch meinen ,,Spaghetticode" durcheinander komme! Fürweitere Hilfen und Konzepte, Anregungen....bin ich trotzdem sehr verbunden!

Ps.: Danke nochmal!

Aenogym 5. Jul 2005 12:17

Re: DelphiX Frage für Spiel
 
Zitat:

Zitat von tmode00
Entschuldigung für meinen Streng gewählten ton! Aber erstmal vielen vielen Dank, das bringt mich (denke ich) schon viel weiter. Wenn man solche anstöße bekommt, dann weis man auch wie man ambesten eine Lösung für solche Probleme bekommt.
Ich denke ich sollte alles nochmal streng überarbeiten, so von Grund auf
eben alles etwas in Richtung Klassen umstrukturieren. Mein Problem ist
nämlich, das ich am Anfang eigendlich immer recht gut voran komme und dann durch meinen ,,Spaghetticode" durcheinander komme! Fürweitere Hilfen und Konzepte, Anregungen....bin ich trotzdem sehr verbunden!

Ps.: Danke nochmal!

die selben probleme hat wohl jeder anfangs - nur nicht aufgeben ;)

sniper_w 5. Jul 2005 12:56

Re: DelphiX Frage für Spiel
 
Was heir Aenogym schon vorgeschlagen hat, ist zu unterstützen. Denn je weiter du dein Projekt entwickelst, desto schwirieger es sein wird, mit Records klar zu kommen. Also Objekten + Hierarchie = Erfolg ;).
Ich kann nur von glück reden, dass ich in meinem Projekt(BallonKiller) Objekten benutze.

Master_RC 10. Jul 2005 14:28

Re: DelphiX Frage für Spiel
 
hi leutz!

ich stehe zur zeit auf dem gleichen problem und habe auch diese antwort schon x mal bekommen, nur...

wie geht das mit den klassen?
kann mir da mal jemand ein biespiel geben?

also z.b. wenn man ein Grunditem hat und dann eben eine unterklasse, die meinetwegen die option "extraoption" bekommt, etc.

und wie frage ich dann ab, ob das *ding* dann auch diese eigenschaft hat, etc...

bitte euch um hilfe :cry:

tigerman33 30. Jul 2005 09:09

Re: DelphiX Frage für Spiel
 
Hi Master_RC

wenn ich dich richtig verstanden hab willst du halt wissen ob das *ding* (ich denk mal das soll wohl irgendwie ne Variable darstellen ja? :-D ) die Option besitzt.

Mit dem Schlüsselwort is kannst Du abchecken ob eine Variable von einem bestimmten Typ ist. Funktioniert aber nur mit Objekten.

Delphi-Quellcode:

type TGrundoption = class
       ...
     end;
     TExtraOption = class(TGrundoption)
       ...
     end;

function Test(Option: TGrundoption): boolean;
begin
  Result := (Option is TExtraoption);
end;
Die Funktion Test gibt jetzt true zurück wenn der übergebene Parameter vom Typ TExtraOption (oder einem Nachfahrtyp) ist.

Keep it up

DGL-luke 30. Jul 2005 09:34

Re: DelphiX Frage für Spiel
 
und der operator as macht dann dein TGrundobjekt zum Textraobjekt:

Delphi-Quellcode:
if (test(grundobjekt)) then
 (grundobjekt as Textraobjekt).extraoption := 'Extrawurst';
die Variante

Delphi-Quellcode:
TExtraObkejt(Grundobjekt).extraoption
existiert auch, arbeitet jedoch ohne Fehlerüberprüfung und wird deswegen nicht empfohlen.

Terminologisch heisst das Verfahren Typecast, das zweite wäre der "harte Typecast".

Die Muhkuh 30. Jul 2005 09:40

Re: DelphiX Frage für Spiel
 
Hi,

wenn du aber schon das schreibst

Delphi-Quellcode:
if (test(grundobjekt)) then
dann kannst du auch das drunter schreiben:

Delphi-Quellcode:
TExtraObkejt(Grundobjekt).extraoption
da du ja schon den Test gemacht hast.

mimi 31. Jul 2005 08:11

Re: DelphiX Frage für Spiel
 
das würde ich auch gerne wissen: wie entwickelne ich eine gute klassen strucktur für ein z.b. Aufbauspiel ?
ich dachte mir das so:
es gibt einmal eine klasse
- Map
- minimap
- Player
- Objekte(Häuser, Bäume, Pflanzen, Tiere, Menschen und soweiter)
problem ist halt nur, wie sieht die klasse aus die das alles verwahlten soll ??

tigerman33 31. Jul 2005 09:45

Re: DelphiX Frage für Spiel
 
Also die vier Sachen wirst du vermutlich nicht mit einer gemeinsamen Vorfahrklasse abbacken können (höchstens vielleicht Map und Minimap). Frag dich immer, welche deiner Sachen gemeinsame Eigenschaften und Verhaltensweisen haben. Im allgemeinen merkst du das auch spätestens beim Coden: Wenn du den gleichen Code in drei verschiedenen Klassen schreiben musst, spätestens dann solltest du dir mal Gedanken über Vererbung machen... :gruebel:

Wo du schon eher auf einen Nenner kommst sind deine "Objekte" (Bäume etc.). Ich spinntisiere jetzt einfach mal ein bisschen:

Delphi-Quellcode:
type TSpielobjekt = class
     private
       FPosition: TPoint;
     public
       constructor Create; virtual;
       destructor Destroy; virtual;
       property Position: TPoint read FPosition write FPosition;
       ... // Was halt ALLE Spielobjekte sonst noch gemeinsam haben sollen
     end;
     TVegetation = class(TSpielobjekt)
       // Hier alles was speziell Bäume und Pflanzen betrifft. Was weiß ich, ob die gerade blühen oder so halt
     end;
     TBewegliches = class(TSpielobjekt)
     private
     public
       procedure Move(Richtung: TPoint; Staerke: integer); virtual;
     end;

// So und jetzt die Endklassen ableiten:
     TBaum = class(TVegetation)
       // Alles was ganz speziell NUR den Baum betrifft
     end;
     TTier = class(TBewegliches)
       // Alles was ganz speziell NUR die Tiere betrifft, z.B. Raubtier: boolean
     end;
So ist natürlich ein bisschen Overkill so wie es da jetzt steht. Aber hat ja auch keinen Anspruch auf Vollständigkeit. Das lässt sich sehr einfach warten und handhaben und außerdem problemlos erweitern. Zum Beispiel eine von TSpielobjekt abgeleitete Klasse TGebaeude.

Hoffe das hilft.

Master_RC 6. Aug 2005 13:17

Re: DelphiX Frage für Spiel
 
ich möcht jetzt nicht nochmal reinplatzen, aber...
gibt es hier irgendwo ein tuto für solche klassen?
hab schon längere zeit gegoogelt und so, aber natürlich nur solche tutos, die die klassen voraussetzen... :(

tigerman33 6. Aug 2005 13:41

Re: DelphiX Frage für Spiel
 
In der Delphi-Hilfe müsste eigentlich ein Kapitel über Klassen, Vererbung und objekt-orientiertes Programmieren allgemein stehen. Ist ein bisschen viel um das jetzt hier zu erklären. :)

mimi 6. Aug 2005 18:26

Re: DelphiX Frage für Spiel
 
Wie klassen defniert werden weiß ich ja, nur wie die aufgabaut werden sollten.
@tigerman33
soweit bin ich mal bei mein ShipGame gekommen, das Problem ist ja auch: ich möchte mehre obj von diesen Obj Typen haben mehr als 1 Baum... das beste währe natürlich: eine klasse die sich nur um ein Obj kümmert und eine zweite die alle obj. verwahlten kann in einer Obj List, aber wie ?

In der Delphi hilfe wird zwar beschrieben wie Klassen denfiert werden eigenschafnte vererbungen und soweiter aber nicht wie eine klasse am besten aufgebaut sein sollte.

tigerman33 7. Aug 2005 08:23

Re: DelphiX Frage für Spiel
 
Zitat:

eine klasse die sich nur um ein Obj kümmert und eine zweite die alle obj. verwahlten kann in einer Obj List, aber wie ?
Da hast du dir die Antwort doch schon selber gegeben, oder? Wenn dir das von Delphi mitgelieferte nicht ausreicht, leitest du dir halt noch eine neue Klasse ab und veränderst/erweiterst die. Wo ist das Problem?

(Soll heißen: Stell deine Frage ein bisschen genauer... :) )

mimi 7. Aug 2005 11:17

Re: DelphiX Frage für Spiel
 
ok: also die frage ist:
Wie könnte so eine Verwaltungsklasse mit hilfer der TobjList aussehen ?
hatte schon mehrmals angefangen und bin gescheitert. Oder bei einer MenuKlasse.
z.z. schreibe ich ein Mainmenu(eigenes nicht abgeleitet) mit hilfe PowerDraw und dort habe ich das problm mit untermenus.... aber ich glaube die Frage war eine andre....


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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-2025 by Thomas Breitkreuz