Dzień dobry, na wstępie chciałem zaznaczyć, że nie jestem jakimś extra specjalistą w dziedzinie programowania, ale w celach
rekreacyjnych postanowiłem sobie nieco odświeżyć obiektowego pascala (nie ruszałem programowania od 11 lat) i zacząłem sobie dziś tworzyć klasę pod pseudo RPG'a w delphi XE8.
Podstawowe dane w pliku klasy (game.pas) umieściłem w rekordzie ze względu na czytelność kodu, a w przyszłości (kto wie) sporą ilość danych do przetworzenia.
Program testowy kompiluje się bez problemów, tylko problem pojawia się przy próbie odczytu zmiennych umieszczonych w rekordzie. Już podaję przykład kodu:
Z pliku game.pas (który jest rozszerzeniem głównej formatki i przechowuje funkcje i procedury typowo pod RPG'a)
type TPlayer = packed record
var Health : integer;
var Mana : integer;
var Level : byte;
var currentExp : integer;
var ExpToNextLv : integer;
var Gold : integer;
var Attack : byte;
var MagicAtk : byte;
var Defence : byte;
var MagicDef : byte;
var Agility : byte;
var Luck : byte;
var HeroName : string;
var HeroClass : string;
var HeroDesc : string;
end;
Kiedy deklaruję ten rekord w głównej formatce (gameMain.pas) w ten sposób:
var Player : TPlayer; //Rekord z game.pas
To przy próbie odczytu
Label1.Caption := Format('[Lv. %d] %s (%d / %d) (%s)', [Player.Level, Player.HeroName, Player.currentExp, Player.ExpToNextLv, Player.pctView ]);
wszystkie wartości zwracają wartość 0 (zero) - a zmienne w rekordzie zmieniają wartości - za wyjątkiem funkcji player.pctView, która liczy procent zdobytego expa.
Natomiast po utworzeniu publicznych zmiennych w klasie i ustawianiu im wartości rekordów ich odczyt jest już poprawny, moje pytanie brzmi, co zepsułem w swojej klasie?
Załączam plik klasy do przejżenia, a tak wygląda sytuacja w kodzie głównej formatki:
unit gameMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, JvTimer, Vcl.ComCtrls,
JvBaseDlg, JvProgressDialog, JvExComCtrls, JvProgressBar, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
ProgressBar: TJvProgressBar;
Button1: TButton;
JvTimer1: TJvTimer;
procedure InitApplication(Sender: TObject);
procedure JvTimer1Timer(Sender: TObject);
private
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses game;
var
GameClass : TGame; //Klasa game
Player : TPlayer; //Rekord TPlayer
{$R *.dfm}
procedure TForm1.InitApplication(Sender: TObject);
begin
GameClass := TGame.Create;
GameClass.Reset;
end;
procedure TForm1.JvTimer1Timer(Sender: TObject);
begin
GameClass.AddExp(1,1.2);
ProgressBar.Max := GameClass.ExpToNextLv;
ProgressBar.Position := GameClass.currentExp;
Label1.Caption := Format('[Lv. %d] %s (%d / %d) (%s)', [GameClass.Level, GameClass.HeroName, GameClass.currentExp, GameClass.ExpToNextLv, GameClass.pctView ]);
end;
end.
I w tej formie wszystko działa, ale jak GameClass zamienię na player, to już wartości są zerowe, mimo, iż dane w rekordzie się zmieniają.