Starfield aus Delphi - Sterne ohne Zeichenbefehl

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Moin an alle Forumsschreiber,

ich habe vor ein paar Tagen wieder Lust bekommen etwas zu programmieren und bin dabei auf Lazarus bzw. Freepascal gestoßen.
Vorerfahrungen mit Turbo Pascal, Visual Basic, Delphi und Blitz 3D/Max sind vorhanden, allerdings erschlägt mich die Fülle an Optionen und Informationen bei Lazarus gerade etwas. Ansonsten aber tolles Programm!!!

Ich habe ein altes Programm rausgekramt (Starfield Simulation) und es als Delphi-Projekt in Lazarus importiert.
Es läuft soweit, allerdings haben Änderungen im Quelltext keinen Effekt auf das Programm (Farben, Timings etc).

Inzwischen ist sogar die Zeichenroutine (in Form von Canvas.Pixels(X,Y) ) auskommentiert bzw gelöscht, das Programm läuft aber munter weiter wie vorher???
Neu-Kompilierung hatte keinen Effekt, hier würde ich mich über den entscheidenen Hinweis sehr freuen.

Das Problem sitzt garantiert vor dem Bilschirm..... :-)

Danke und Mfg
Doc

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Michl »

Hallo und herzlich willkommen im Forum!

Bist Du sicher, dass das Projekt neu kompiliert wurde (Crtl + F9, kompiliert neu)? War die Änderung in einer zum Projekt gehörenden Unit (geöffnete Unit + Shift + F11 drücken -> fügt eine Unit zum Projekt hinzu), ersichtlich unter Menu Projekt -> Units... -> müsste dann dort aufgelistet sein.

Falls das nichts bringt, kannst Du ja mal ein neues Projekt erstellen und dort das Verhalten testen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Hi und danke für die schnelle Antwort!

Unter Projekt/Units habe ich eine Starfield.lpr und eine Starfield.pas mit dem eigentlichen Quelltext.
Neukompilieren mit CTRL-F9 bringt leider nix, gleiches Ergbnis.

Hier einfach mal der Code, vielleicht hilfts...
Der Zeichenbefehl fehlt, beim Programmstart sehe ich trotzdem Sterne.
Außerdem sind etliche Werte (Spd, MaxZ etc) vom Rumprobieren noch geändert, aber wie gesagt, es hat ohnehin nichts bewirkt.

Wo könnte Lazarus die alten Informationen herbekommen bzw. wieso startet er nicht die aktuelle Version?

Code: Alles auswählen

 
UNIT StarfieldUnit;
 
{$MODE Delphi}
 
INTERFACE
 
USES
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
CONST
  MaxSpd = 3;
  MaxZ = 1000;
 
TYPE
  TStar = RECORD
    x, y, z, spd: double;
    x2, y2: integer;
  END;
 
TYPE
 
  { TForm1 }
 
  TForm1 = CLASS(TForm)
    Timer1: TTimer;
    PROCEDURE FormCreate (Sender: TObject);
    PROCEDURE FormKeyDown (Sender: TObject; VAR Key: word; Shift: TShiftState);
    PROCEDURE Timer1Timer (Sender: TObject);
    PROCEDURE FormMouseWheelDown (Sender: TObject; Shift: TShiftState; MousePos: TPoint; VAR Handled: boolean);
    PROCEDURE FormMouseWheelUp (Sender: TObject; Shift: TShiftState; MousePos: TPoint; VAR Handled: boolean);
    PROCEDURE FormDblClick (Sender: TObject);
  private
    { Private declarations }
    s: ARRAY[1..50000] OF TStar;
  public
    { Public declarations }
  END;
 
VAR
  Form1: TForm1;
 
IMPLEMENTATION
 
{$R *.lfm}
 
VAR
  spd: double = 1;
  MaxStars: integer = 5000;
  Farbe: TColor;
  Entf: byte = 255;
  Breite, Hoehe: integer;
 
PROCEDURE TForm1.FormCreate (Sender: TObject);
VAR
  i: integer;
BEGIN
  randomize;
  Farbe := clBlack;
  Breite := Form1.Width;
  Hoehe := Form1.Height;
  FOR i := 1 TO MaxStars DO
  BEGIN
    s[i].z := random (MaxZ) + 1;
  END;
END;
 
PROCEDURE TForm1.Timer1Timer (Sender: TObject);
VAR
  i, anzahl: integer;
  StarCol: TColor;
  Teil: extended;
BEGIN
  FOR i := 1 TO Maxstars - 1 DO
  BEGIN
 
    s[i].z := s [i].z - s [i].spd;
    IF s [i].z < 0.01 THEN
    BEGIN
      s[i].x := random (Breite) - Breite div 2;
      s[i].y := random (Hoehe) - Hoehe div 2;
      s[i].z := random (MaxZ) + 1;
      s[i].spd := Spd;
    END;
 
    s[i].X2 := round (Entf * s [i].x / s [i].z + Breite / 2);
    s[i].Y2 := round (Entf * s [i].y / s [i].z + Hoehe / 2);
 
    StarCol := RGBToColor (255, 255, 255);
  END;
END;
 
PROCEDURE TForm1.FormMouseWheelDown (Sender: TObject; Shift: TShiftState; MousePos: TPoint; VAR Handled: boolean);
BEGIN
  IF spd > 0 THEN
    spd := spd - 0.5;
  Caption := 'Form1 ' + FloatToStr (spd);
END;
 
PROCEDURE TForm1.FormMouseWheelUp (Sender: TObject; Shift: TShiftState; MousePos: TPoint; VAR Handled: boolean);
BEGIN
  spd := spd + 0.5;
  Caption := 'Form1 ' + FloatToStr (spd);
END;
 
PROCEDURE TForm1.FormDblClick (Sender: TObject);
BEGIN
  IF Farbe = clblack THEN
  BEGIN
    Farbe := clwhite;
    MaxStars := 10000;
    spd := 14;
  END
  ELSE IF farbe = clwhite THEN
  BEGIN
    Farbe := clblack;
    Form1.Color := clyellow;
    Form1.Color := clblack;
    MaxStars := 5000;
    spd := 1;
  END;
END;
 
 
END.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Michl »

Hast Du mal nachgesehen, ob die Unit "StarfieldUnit" unter den Units des Projekts zu finden ist (siehe vorheriger Post)?! Falls nein, dann wird diese nicht neu kompiliert, sondern StarfieldUnit.ppu bzw. StarfieldUnit.o genutzt!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Sorry, ich habe mich mißverständlich ausgedrückt...
Unter Projekt/Units ist natürlich die StarfieldUnit.pas und eine starfield.lpr vorhanden.

Im Quelltexteditor habe ich zwei offene Tabs mit den o.g. Dateien.

Ich habe leider keinen Plan, wo das Problem liegen könnte.
Eine Einstellung in Lazarus, ein Fehler beim Import, eine Compilereinstellung,.....
Dateianhänge
Starfield.zip
(1.49 KiB) 92-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Michl »

Ich habe mir eben die zip runtergeladen. Kannst Du das Projekt nochmal komplett (ohne executable), nicht nur die Unit zippen und nochmals hochladen?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von soerensen3 »

Unter Run gibts auch noch die Option Cleanup Build Files (Mein Lazarus ist anscheinend auf Englisch). Dann werden alle Build Files gelöscht, also alle vorkompilierten Dateien. Manchmal ist das bei mir auch so, dass er scheinbar nicht neu kompiliert. Weiß auch nicht woran genau dass liegt. Wenn die Dateien auf einem Netzlaufwerk oder über einen symlink eingebunden sind gibt es auch oft Probleme.
Wenn du im Editor bist und den Tab für deine Unit ausgewählt hast steht unter dem Quelltext auch nochmal der genaue Pfad zu deiner Datei. Den kannst du auch mal überprüfen.
Als letzte Möglichkeit gibt es auch noch die Möglichkeit bei den Projekteinstellungen einzustellen, dass er sagt welche Dateien er verwendet. Müsste falls das andere nichts bringt nochmal nachgucken wie die Option heißt (-vt vielleicht?).

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

So, der Pfad wars, vielen herzlichen Dank!

Die Programmdatei (lpr?) befand sich in C:\Temp und hat natürlich dort auch nach der StarfieldUnit.pas gesucht.
Die leider nie geändert wurde...

Ich habe sie jetzt noch einmal im gleichen Verzeichnis wie die .pas gespeichert und jetzt habe ich einen schwarzen (malt nicht) und großen (Windowstate Max) Schirm :-)

Weiter geht's, danke!!

Gibt es Tutorials oder weitere EInträge, die sich mit Projektverwaltung unter Lazarus beschäftigen?
Welche Dateien in einem Projekt wo sind, Bedeutung der Endungen (LPI, LPS, O, PPU etc.) welche Verzeichnisse, welche Units wo, welcher Tab im Quelltexteditor was speichert,...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Michl »

drdoctor hat geschrieben:Bedeutung der Endungen (LPI, LPS, O, PPU etc.)
http://wiki.freepascal.org/Lazarus_Faq/de#Welche_Bedeutung_haben_die_verschiedenen_von_Lazarus_verwendeten_Dateierweiterungen.3F

Ansonsten ist das Wiki eine recht gute Unterstützung, eine Seite direkt zur Projektverwaltung fällt mir jetzt nicht sofort ein.
Hilfreich ist evtl. noch http://wiki.freepascal.org/Lazarus_IDE_Tools/de oder http://wiki.freepascal.org/Lazarus_Documentation/de#IDE

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Mit Projektverwaltung meinte ich solche Sachen wie die Endungen etc.
Über das Wiki bin ich schon gestolpert, wusste nur nicht wo ich suchen soll.

Vielen Dank für die Links, eure Hilfe und das nette Willkommen!

Doc

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Hallo nochmal,

ich habe das Programm inzwischen etwas geändert und würde die Sterne gerne als Objekte erzeugen und in einer Schleife durchlaufen lassen.
Leider funktioniert das Ganze noch nicht so, wie ich es mir vorstelle.
Offenbar wird die "SterneInit" Schleife nicht n-mal (NumStars) durchlaufen und die s.Objekte erzeugt.
Mir ist auch noch nicht ganz klar, ob ich die Create Anweisung jedesmal aufrufen muß oder nur einmal zu Beginn, um die Verknüpfung mit dem Type TStar zu erzeugen.

Über einen Hinweis wäre ich sehr dankbar, die ganzen Infos und Wikis verstehe ich nicht wirklich, zumal hier auch jeweils nur einzelne Objekte erzeugt werden...

(die Buttons im Formular dienen erstmal nur als Test, ob die Prozeduren überhaupt aufgerufen werden)

Danke und mfg
Doc
Dateianhänge
Starfield.zip
(69.52 KiB) 80-mal heruntergeladen

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Komoluna »

Hallo drdoctor,

Wenn du mehrere Objekte vom selben Typ erstellen und verwalten möchtest, bietet sich ein Array an.

Momentan hast du eine Variable vom Typ TStar, diese überschreibst du jedoch bei jedem Aufruf von NeuerStern.

mit einem Array sähe die Variablendeklaration so aus:

Code: Alles auswählen

s: array of TStar;


deine forschleife bei SterneInit müsste dann so aussehen:

Code: Alles auswählen

 
SetLength(s, NumStars);
for i:=0 to NumStars-1 do //Das array geht von 0 bis 499
begin
  s[i]:=TStar.Create//Neue Instanz wird erzeugt und in das "i"te Element des Arrays eingefügt
  s[i].NeuerStern//Stern initialisieren
end;


in sämtlichen prozeduren von TStarmüsstest du dann in jeder Zeile das "s." und das s:=TStar.Create vollständig rausnehmen, da s ja das array ist, keine Instanz von TStar.

(Falls etwas unklar sein sollte einfach fragen)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

drdoctor
Beiträge: 8
Registriert: Do 20. Nov 2014, 19:09

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von drdoctor »

Hallo Komoluna,

danke für deine Antwort!

Ein Array hatte ich ja vorher schon (siehe weiter oben).
Ich hätte erwartet, daß mit jedem Schleifendurchlauf ein neues Objekt s vom Typ TStar erzeugt wird und die Nummerierung bzw. die Möglichkeit, den einzelnen Stern anzusprechen, intern im Hintergrund erledigt wird (ohne Array).

Gedacht war, die Sterne die aus dem Bildschirm fliegen mit Destroy zu entfernen und woanders einen neuen zu erzeugen.

Vielleicht habe ich auch einen kompletten Denkfehler und ohne Array geht das gar nicht.... :-)

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von Komoluna »

Nein, ohne array wird das was du vorhast sehr schwer...

Denn damit sich der Stern bewegt muss ja die Methode Bewegen aufgerufen werden. Ohne eine Variable, deren Methode aufgerufen werden kann wird das jedoch schwierig.
Ich glaube Array ist das beste für deine Anwendung. alles andere wäre Overkill...

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Starfield aus Delphi - Sterne ohne Zeichenbefehl

Beitrag von soerensen3 »

Ohne jetzt in den Quelltext geguckt zu haben: In dem Fall würde sich vielleicht auch eine verkettete Liste anbieten. Dann musst du nicht die ganzen nachfolgenden Elemente verschieben.
Jedes Element enthält einen Zeiger auf das nachfolgende Element. Beim Zeichnen gehst du einfach die Kette von Elementen durch. Wenn ein Stern entfernt werden soll, änderst du den Zeiger vom Vorhergehenden Element auf den der danach kommt und gibst das Element frei (mit Free oder Destroy). Zusätzlich kannst du auch einen Counter haben der anzeigt wieviele Elemente du hast, aber das wird nicht zwangsläufig benötigt.
Ein Zeiger muss in dem Fall nicht zwangsläufig vom Typ Pointer sein. Du kannst auch einfach ein Feld vom Typ TStar haben (Kann sein dass du dann eine forward deklaration machen musst wenn du innerhalb von TStar ein TStar Feld deklarierst, bin mir da gerade nicht sicher: Vor TStar einfach folgendes schreiben: TStar = class;).
Gruß Johannes

Antworten