Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Grundkonzept eines Spieles (Intervale) (https://www.delphipraxis.net/90497-grundkonzept-eines-spieles-intervale.html)

Dragon27 18. Apr 2007 15:15


Grundkonzept eines Spieles (Intervale)
 
Hallo,

habe folgendes logik Problem:

Ich möchte eine einfache Wirtschaftssimulation OHNE Grafik schreiben also simple mit Buttons etc... So nun gibt es hier eine Menge Ereignisse die sich immer und immer wiederholen....

Sagen wir als Beispiel die Produktion... Es wird ja immer und immer wieder nach einer gewissen Zeit etwas Produziert also Produkte +1.....

So nur wie setze ich das am Besten um, denn ein Spiel hat ja 100te solcher Ereignisse und 100 Timer verwendne oder sagen wir 50 wenn Ereignisse nebeneinander laufen sind wohl doch nicht die beste Lösung...

Wie würdet Ihr das machen?

Danke!

Schaedel 18. Apr 2007 15:20

Re: Grundkonzept eines Spieles (Intervale)
 
Ich würde das ganze mit einer Datenbank verknüpfen und ein paar Trigger dazu schreiben.
Eine andere Lösung fällt mir gerade nicht ein.

Apollonius 18. Apr 2007 15:40

Re: Grundkonzept eines Spieles (Intervale)
 
Am besten erstellst eine Liste von events, die der Timer dann im onTimer durchläuft. Siehe Hier im Forum suchenevents in einer Liste

Dragon27 18. Apr 2007 15:53

Re: Grundkonzept eines Spieles (Intervale)
 
Hallo,

was ist ein Trigger?

Danke!

SirTwist 18. Apr 2007 23:14

Re: Grundkonzept eines Spieles (Intervale)
 
Ich würde das so machen:

Alles, was irgendwie regelmäßig bearbeitet wird, wird als eine Klasse definiert, die von einer Basisklasse abgeleitet ist:

Delphi-Quellcode:
type
  TBasis = class
    procedure Simulate; dynamic;
  end;

  TFirma = class(TBasis)
    procedure Simulate; override;
  end;
Natürlich brauchen Deine Klassen noch Konstruktoren, Destruktoren und weißderGeierwas dazu. Aber Du kannst nun alles, was abgearbeitet werden muss, in einer TList speichern und mit einem einzigen TimerEvent abarbeiten:

Delphi-Quellcode:
  for i:=0 to Liste.Count-1 do TBasis(Liste[i]).Simulate;
Bei einer TFirma würdest Du in Simulate halt etwas produzieren (und in einer Klassenvariablen AnzGueter abspeichern), aber nur, wenn vorher in einem verbundenen TStahlwerk genügend Rohmaterial hergestellt wurde usw usf.

Ist die Idee dahinter halbwegs klargeworden?

Zur Verfeinerung könnte man der Simulate-Routine noch einen Parameter mitgeben: die Anzahl Millisekunden, die seit dem letzten Aufruf vergangen sind. Dann würde halt die Produktionsmenge in Abhängigkeit von den Millisekunden berechnet werden.

Dragon27 19. Apr 2007 10:17

Re: Grundkonzept eines Spieles (Intervale)
 
Hallo,

danke für die Idee mit den Klassen! Hilft mir sehr weiter....

Nun habe ich noch ein Problem:

Ich würde gerne die Klassen als Array machen, da es Tiere sind und es davon mehrere gibt. Aber das Tier soll auch sterben können
also wird ja der Destructor aufgerufen. Nun habe ich aber bei einem Array das Problem, dass dann z.B. 1 2 und 3 belegt sind ... 4 stirbt
und 5 6 sind belegt.

Gibt es da eine saubere Lösung?

Danke!

Gruber_Hans_12345 19. Apr 2007 10:22

Re: Grundkonzept eines Spieles (Intervale)
 
ja, man nehme eine Liste (TList)

Dragon27 19. Apr 2007 10:28

Re: Grundkonzept eines Spieles (Intervale)
 
Hallo,

okay also meine Klasse sieht im Moment so aus:

Delphi-Quellcode:
unit UClassTier;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;



type
  TTier = class
  private
    FName: string;
    FAlter:Integer;
    FMaxAlter:Integer;
   Procedure SetName(Name:String);
  public
    property Name: string read FName write SetName;
    Function SetAlterUp():Boolean;   //Gibt bei True Tod zurück
  end;

implementation



Procedure TTier.SetName(Name:String);
begin
if Length(Name)< 3 then begin
MessageDlg('Leider hast du einen zu kurzen Namen gewählt! Bitte probiere es nochmal!',mterror,[mbok],0);
end else begin
FName:=Name;
end;
end;


Function TTier.SetAlterUp():Boolean;
begin
FAlter:=FAlter+1;
if FMaxAlter=FAlter then begin
MessageDlg(FName+' ist nun schon über '+inttostr(FAlter)+' Jahre alt und wird jetzt sterben!',mterror,[mbok],0);
//Hier sollte das Tier sterben.......
Result:=true;
end else Result:=false;

end;


end.
So nun sollte praktisch die Klasse sich bei SetAlterUp zerstören (weil ja Tod) aber dann steht das doch noch immer in der Liste, oder?

Danke!

QuickAndDirty 19. Apr 2007 10:29

Re: Grundkonzept eines Spieles (Intervale)
 
Oder du rückst das Array auf.
Es kommt drauf an wenn du die liste öfter durchläufst als du teile daruas löschst ist ein
Array meist schneller. Wenn du dagegen öfter einfügst und löschst solltest du eine Liste nehmen.
Wenn du wenige Elemente in der Liste hast brauchst du ebenfalls kein Array.

Gruber_Hans_12345 19. Apr 2007 10:34

Re: Grundkonzept eines Spieles (Intervale)
 
ich würde sagen, der vorteil von einer TList in punkte übersichtlichkeit und so überwiegt dem vorteil, das man eventuell dort oder da ein paar cpu ticks einsparen kann.

aus der Liste kannst du das Elemente ganz einfach entfernen mit
Liste.Delete(Index);
oder Liste.Remove(totesTier);

kannst ja jedem Tier auch noch speichern, zu welcher Liste es gehört, und dann mit
self.Parent.Remove(self) das Tier aus der Liste entfernen (freigeben mußt du es trotzdem noch)

aber das kommt dann drauf an, von wo du SetAlterUp aufrufst ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz