![]() |
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! |
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. |
Re: Grundkonzept eines Spieles (Intervale)
Am besten erstellst eine Liste von events, die der Timer dann im onTimer durchläuft. Siehe
![]() |
Re: Grundkonzept eines Spieles (Intervale)
Hallo,
was ist ein Trigger? Danke! |
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:
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:
type
TBasis = class procedure Simulate; dynamic; end; TFirma = class(TBasis) procedure Simulate; override; end;
Delphi-Quellcode:
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.
for i:=0 to Liste.Count-1 do TBasis(Liste[i]).Simulate;
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. |
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! |
Re: Grundkonzept eines Spieles (Intervale)
ja, man nehme eine Liste (TList)
|
Re: Grundkonzept eines Spieles (Intervale)
Hallo,
okay also meine Klasse sieht im Moment so aus:
Delphi-Quellcode:
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?
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. Danke! |
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. |
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 18:48 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