月別アーカイブ: 2014年5月

スコアマネージャー


unit untScore;

interface

uses
  System.Classes,
  System.SysUtils,
  System.Generics.Collections,
  System.IOUtils,
  System.Types,
  FMX.Dialogs,
  System.UITypes;

type
  TScoreRecord = class
  private
    function getIsCorrect: boolean;

  const
    DELIMITER_CHAR = ',';

  public
    DateTime: TDateTime;
    SessionIndex: Integer;
    YomifudaSerial: Integer;
    TorifudaSerial: Integer;
    ResponceTime: Single;

    constructor Create();
    destructor Destroy; override;

    procedure DecodedString(aCodedString: String);
    function EncodeString(): String;

    property IsCorrect: boolean read getIsCorrect;
  end;

type
  TScoreList = class
  private

  public
    Items: TList<TScoreRecord>;

    constructor Create();
    destructor Destroy; override;

    procedure Init();
    procedure Load(aPathFileName: String);
    procedure Save(aPathFileName: String);

    procedure Add(aDateTime: TDateTime;
                  aSessionIndex: Integer;
                  aYomifudaSerial: Integer;
                  aTorifudaSerial: Integer;
                  aResponceTime: Single);


  end;

type
  TScoreManager = class
  const
    INITIAL_PLAYER_NAME = 'ゲスト';

  private
    FScoreRootPathName: String;

  public
    constructor Create(aScoreRootPathName: String);
    destructor Destroy; override;

    procedure PlayerList(vStringList: TStringList);
    procedure AddPlayer(aPlayerName: String);
    procedure DeletePlayer(aPlayerName: String);
    function IsPlayerExists(aPlayerName: String): Boolean;

  end;

var
  ScoreManager: TScoreManager;

const
  ON_SKIP    = -1;
  ON_TIMEOUT = -2;


implementation



// 要 System.IOUtils  System.Types
procedure fileListOfFolder(aFolderName: string; vFileList: TStringList);
var
  SearchPattern: string;
  Option: TSearchOption;
  FileNames: TStringDynArray;
  FileName: string;
begin
  // ファイル名に一致する検索パターン
  SearchPattern := '*.*';

  // ディレクトリの列挙モード
  Option := TSearchOption.soTopDirectoryOnly; // トップレベル列挙モード
  // Option := TSearchOption.soAllDirectories; // 再帰列挙モード

  //指定のディレクトリ内のファイルのリスト
  FileNames := TDirectory.GetFiles(aFolderName, SearchPattern, Option);
  vFileList.Clear;
  for FileName in FileNames do
    vFileList.Add(TPath.GetFileName(FileName));
end;





{ TScoreRecord }

constructor TScoreRecord.Create;
begin

end;

destructor TScoreRecord.Destroy;
begin

  inherited;
end;

procedure TScoreRecord.DecodedString(aCodedString: String);
var
  i: Integer;
  tmpFieldStringList: TStringList;
begin

  tmpFieldStringList := TStringList.Create;
  tmpFieldStringList.Delimiter := DELIMITER_CHAR;
  tmpFieldStringList.DelimitedText := aCodedString;

  Self.DateTime       := StrToDateTime(tmpFieldStringList[0]);
  Self.SessionIndex   := StrToInt     (tmpFieldStringList[1]);
  Self.YomifudaSerial := StrToInt     (tmpFieldStringList[2]);
  Self.TorifudaSerial := StrToInt     (tmpFieldStringList[3]);
  Self.ResponceTime   := StrToFloat   (tmpFieldStringList[4]);

  tmpFieldStringList.Free;
end;

function TScoreRecord.EncodeString: String;
var
  tmpFieldStringList: TStringList;
  tmpResult: string;
begin

  tmpFieldStringList := TStringList.Create;
  tmpFieldStringList.Delimiter := DELIMITER_CHAR;

  tmpFieldStringList.Add(DateTimeToStr(Self.DateTime));
  tmpFieldStringList.Add(IntToStr     (Self.SessionIndex));
  tmpFieldStringList.Add(IntToStr     (Self.YomifudaSerial));
  tmpFieldStringList.Add(IntToStr     (Self.TorifudaSerial));
  tmpFieldStringList.Add(FloatToStr   (Self.ResponceTime));

  tmpResult := tmpFieldStringList.DelimitedText;

  tmpFieldStringList.Free;

  Result := tmpResult;
end;

function TScoreRecord.getIsCorrect: boolean;
begin

end;

{ TScoreList }


constructor TScoreList.Create;
begin
  Items := TList<TScoreRecord>.Create;
  Init();
end;

destructor TScoreList.Destroy;
begin
  Init();
  Items.Free;
  inherited;
end;

procedure TScoreList.Init;
var
  i: Integer;
begin
  for i := 0 to Items.Count - 1 do
    Items[i].Free;
  Items.Clear;
end;

procedure TScoreList.Add(aDateTime: TDateTime;
                         aSessionIndex: Integer;
                         aYomifudaSerial,
                         aTorifudaSerial: Integer;
                         aResponceTime: Single);
var
  tmpScoreRecord: TScoreRecord;
begin
  tmpScoreRecord := TScoreRecord.Create;
  tmpScoreRecord.DateTime       := aDateTime;
  tmpScoreRecord.SessionIndex   := aSessionIndex;
  tmpScoreRecord.YomifudaSerial := aYomifudaSerial;
  tmpScoreRecord.TorifudaSerial := aTorifudaSerial;
  tmpScoreRecord.ResponceTime   := aResponceTime;

  Items.Add(tmpScoreRecord);
end;



procedure TScoreList.Load(aPathFileName: String);
var
  i: Integer;
  tmpRecordStringList: TStringList;
  tmpScoreRecord: TScoreRecord;
begin

  Self.Init();
  if FileExists(aPathFileName) then
  begin
    tmpRecordStringList := TStringList.Create;
    tmpRecordStringList.LoadFromFile(aPathFileName);

    for i := 0 to tmpRecordStringList.Count - 1 do
    begin
      tmpScoreRecord := TScoreRecord.Create();
      tmpScoreRecord.DecodedString(tmpRecordStringList[i]);
      Items.Add(tmpScoreRecord);
    end;
    tmpRecordStringList.Free;
  end;

end;

procedure TScoreList.Save(aPathFileName: String);
var
  i: Integer;
  tmpRecordStringList: TStringList;
begin

  tmpRecordStringList := TStringList.Create;
  tmpRecordStringList.Clear;
  for i := 0 to Self.Items.Count - 1 do
    tmpRecordStringList.Add(Self.Items[i].EncodeString);

  tmpRecordStringList.SaveToFile(aPathFileName);

  tmpRecordStringList.Free;
end;





{ TScoreManager }


constructor TScoreManager.Create(aScoreRootPathName: String);
begin
  FScoreRootPathName := aScoreRootPathName;

  ForceDirectories(aScoreRootPathName);
  if not IsPlayerExists(INITIAL_PLAYER_NAME) then AddPlayer(INITIAL_PLAYER_NAME);

end;

destructor TScoreManager.Destroy;
begin

  inherited;
end;

function TScoreManager.IsPlayerExists(aPlayerName: String): Boolean;
var
  tmpPathFileName: String;
begin
  tmpPathFileName := FScoreRootPathName + aPlayerName + '.txt';
  Result := TFile.Exists(tmpPathFileName);
end;

procedure TScoreManager.AddPlayer(aPlayerName: String);
var
  tmpPathFileName: String;
  tmpStringList: TStringList;
begin
  tmpPathFileName := FScoreRootPathName + aPlayerName + '.txt';
  tmpStringList := TStringList.Create;
  tmpStringList.Clear;
  tmpStringList.SaveToFile(tmpPathFileName);
  tmpStringList.Free;
end;

procedure TScoreManager.DeletePlayer(aPlayerName: String);
var
  tmpPathFileNameOld: String;
  tmpPathFileNameNew: String;
begin
  if aPlayerName = INITIAL_PLAYER_NAME then
  begin
    MessageDlg('このプレイヤーは削除できません。', TMsgDlgType.mtConfirmation,  [TMsgDlgBtn.mbOk], 0);
    Exit;
  end;
  tmpPathFileNameOld := FScoreRootPathName + aPlayerName + '.txt';
  tmpPathFileNameNew := FScoreRootPathName + aPlayerName + '.dum';
  RenameFile(tmpPathFileNameOld, tmpPathFileNameNew)
end;

procedure TScoreManager.PlayerList(vStringList: TStringList);
var
  i: Integer;
  tmpStringList: TStringList;
begin

  tmpStringList:= TStringList.Create;
  fileListOfFolder(FScoreRootPathName, tmpStringList);

  vStringList.Clear;
  for i := 0 to tmpStringList.Count - 1 do
    if ExtractFileExt(tmpStringList[i]) = '.txt' then
      vStringList.add(ChangeFileExt(ExtractFileName(tmpStringList[i]),''));

  tmpStringList.Free;

end;

end.

ファイルシステム関数

System.SysUtils.AnsiCompareFileName 現在のロケールに基づいてファイル名を比較します。
System.SysUtils.AnsiLowerCaseFileName ファイル名を小文字に変換します。
System.IOUtils.TPath.ChangeExtension 指定されたパスで示されるファイルまたはディレクトリの拡張子を変更します。
System.SysUtils.ChangeFileExt ファイル名の拡張子を変更します。
System.SysUtils.ChangeFilePath ファイル名のパスを変更します。
System.IOUtils.TPath.Combine 2 つのパス文字列を結合します。
System.IOUtils.TPath.DriveExists 指定されたパスで使用されているドライブ文字が実際に存在するかどうかを確かめます。
System.SysUtils.ExcludeTrailingBackslash 末尾の区切り記号を削除したパス名を返します。
System.SysUtils.ExcludeTrailingPathDelimiter 末尾の区切り記号を削除したパス名を返します。
System.SysUtils.ExpandFileName 相対ファイル名の完全パス名を返します。
System.SysUtils.ExpandFileNameCase 大文字と小文字を区別するファイル システム上の相対ファイル名の完全パス名を返します。
System.SysUtils.ExpandUNCFileName 適切な場合、UNC 形式のファイル名の完全パスを返します。
System.SysUtils.ExtractFileDir ファイル名からドライブ部分とディレクトリ部分を抜き出します。
System.SysUtils.ExtractFileDrive ファイル名のドライブ部分を返します。
System.SysUtils.ExtractFileExt ファイル名の拡張子部分を返します。
System.SysUtils.ExtractFileName ファイル名の名前部分と拡張子部分を抽出します。
System.SysUtils.ExtractFilePath ファイル名のドライブ部分とディレクトリ部分を返します。
System.SysUtils.ExtractRelativePath 特定のベース ディレクトリからの相対パス名を返します。
System.SysUtils.ExtractShortPathName ファイル名を短い 8.3 形式に変換します。
System.IOUtils.TPath.GetAttributes ファイルまたはディレクトリ属性を返します。
System.IOUtils.TPath.GetDirectoryName ファイル名のドライブ部分とディレクトリ部分を抽出します。
System.IOUtils.TPath.GetExtendedPrefix 指定されたパスの拡張プレフィックス タイプを返します。
System.IOUtils.TPath.GetExtension ファイル名の拡張子部分を抽出します。
System.IOUtils.TPath.GetFileName ファイル名の名前部分と拡張子部分を抽出します。
System.IOUtils.TPath.GetFileNameWithoutExtension ファイル名の名前部分(拡張子を除く)を抽出します。
System.IOUtils.TPath.GetFullPath 指定されたパスの絶対パスを返します。
System.IOUtils.TPath.GetGUIDFileName 一意なファイル名として使用できる新しい GUID を生成します。
System.IOUtils.TPath.GetHomePath ユーザーのホーム パスを返します。
System.IOUtils.TPath.GetRandomFileName ランダムなファイル名を新たに生成します。
System.IOUtils.TPath.GetTempFileName 一意な一時ファイルを生成します。
System.IOUtils.TPath.GetTempPath システムの一時ディレクトリへのパスを返します。
System.IOUtils.TPath.HasExtension 指定されたファイル名に拡張子部分があるかどうかを確かめます。
System.IOUtils.TPath.HasValidFileNameChars 指定されたファイル名が使用可能な文字だけで構成されているかどうかを確かめます。
System.IOUtils.TPath.HasValidPathChars 指定されたパス文字列が使用可能な文字だけで構成されているかどうかを確かめます。
System.SysUtils.IncludeTrailingBackslash パス名の末尾が必ず区切り記号になるようにします。
System.SysUtils.IncludeTrailingPathDelimiter パス名の末尾が必ず区切り記号になるようにします。
System.IOUtils.TPath.IsDriveRooted 指定されたパスがドライブ文字で始まる絶対パスかどうかを確かめます。
System.IOUtils.TPath.IsExtendedPrefixed 指定されたパスに拡張プレフィックスが含まれているかどうかを確かめます。
System.SysUtils.IsPathDelimiter 文字列内の指定位置にあるバイト データがパス区切り記号かどうかを示します。
System.IOUtils.TPath.IsPathRooted 指定されたパスが相対パスか絶対パスかを確かめます。
System.IOUtils.TPath.IsUNCPath 指定されたパスが UNC(Universal Naming Convention:汎用命名規則)形式かどうかを確かめます。
System.IOUtils.TPath.IsUNCRooted 指定されたパスが UNCルート形式かどうかを確かめます(UNC は、汎用命名規則(Universal Naming Convention)を表す)。
System.IOUtils.TPath.IsValidFileNameChar 指定された文字がファイル名で使用可能かどうかを確かめます。
System.IOUtils.TPath.IsValidPathChar 指定された文字がパス文字列で使用可能かどうかを確かめます。
Vcl.FileCtrl.MinimizeName 指定された長さ制限の中に描画できるように、完全修飾パス名を短縮します。
System.SysUtils.SameFileName 現在のロケールに基づいてファイル名を比較します。
System.IOUtils.TPath.SetAttributes ファイルまたはディレクトリ属性を設定します。
System.IOUtils.TFile.CreateSymLink シンボリック リンクを作成します。「System.SysUtils.TSymLinkRec」を参照。

 

CopyFromBitmap, DrawBitmap がうまくいなないので

CopyFromBitmap, DrawBitmap がうまくいなないので、とりあえずの苦肉の策




procedure TBoard.DrawAllTiles;
var
  i, j, k: Integer;
  tmpTileListIndex: Integer;
  tmpBitmap: TBitmap;
  tmpPatternName: String;
  tmpTileBitmap: TBitmap;
  tmpSelectedBitmap: TBitmap;
  tmpRect: TRect;
begin
  tmpBitmap := TBitmap.Create(BoardWidth, BoardHeight);
  tmpBitmap.Clear($0);
  tmpBitmap.Canvas.BeginScene;

  for k := GameController.TileManager.Grid3D.ZMin to GameController.TileManager.Grid3D.ZMax do
    for i := GameController.TileManager.Grid3D.XMin to GameController.TileManager.Grid3D.XMax do
      for j := GameController.TileManager.Grid3D.YMin to GameController.TileManager.Grid3D.YMax do
      begin
        tmpTileListIndex := GameController.TileManager.Grid3D[i,j,k];
        if tmpTileListIndex <> VALUE_OF_TILE_EMPTY then
        begin
          tmpPatternName := 'animal' + IntToStr(GameController.TileManager.TileList[tmpTileListIndex].KindSerial);
          tmpTileBitmap := frmASMain.ImageManager.Item(tmpPatternName);
          tmpRect := Pos3DToAreaRect(GameController.TileManager.TileList[tmpTileListIndex].Pos3D);

          tmpBitmap.Canvas.DrawBitmap(tmpTileBitmap,
                                      RectF(0,
                                            0,
                                            tmpTileBitmap.Width,
                                            tmpTileBitmap.Height),
                                      RectF(tmpRect.Left,
                                            tmpRect.Top,
                                            tmpRect.Right,
                                            tmpRect.Bottom),
                                      1);

          if GameController.TileManager.TileList[tmpTileListIndex].IsSelected then
          begin
            tmpSelectedBitmap := frmASMain.ImageManager.Item('selected');
            tmpBitmap.Canvas.DrawBitmap(tmpSelectedBitmap,
                                        RectF(0,
                                              0,
                                              tmpSelectedBitmap.Width,
                                              tmpSelectedBitmap.Height),
                                        RectF(tmpRect.Left,
                                              tmpRect.Top,
                                              tmpRect.Right,
                                              tmpRect.Bottom),
                                        1);

          end;
        end;
      end;
  tmpBitmap.Canvas.EndScene;

  frmASMain.imgTileCanvas.Bitmap.Assign(tmpBitmap);
  frmASMain.lblCount.Text := IntToStr(GameController.TileManager.TileList.Count);
  tmpBitmap.Free;
end;