Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

unit app_main;

interface

uses sux_constant, sux_object,
     input_main,
     sound_main,
     gl_main, app_glscene_main, app_game_main,
     app_constant, app_ini;

type
  TSettings=record
    close:SXBool;
    score:SXInt;
  end;
  SUXApp=class(SUXObject)
    settings:TSettings;
    input:SUXInput;
    sound:SUXSound;
    gl:SUXGL;
    ini:SAIni;
    scene:SAGLScene;
    game:SAGame;

    procedure getKeyPressed(const key: Char);

    procedure onTimer;

    procedure initialize;
    procedure shutdown;
    constructor Create(parent:TObject);
    destructor Destroy; override;
  end;

implementation

uses main, file_file, Forms;


// --- SUXApp


procedure SUXApp.getKeyPressed(const key: Char);
begin
  game.getKeyPressed(key);
end;




procedure SUXApp.onTimer;
begin
  sx.timer.ignoreLastFrameDuration;
 
  repeat
    try
      sx.onTimer; // Update engine timer

      input.onTimer;
      game.onTimer;
      sound.onTimer;
      gl.onTimer;

      if (ini.settings.menu.canquit) then
        if (input.isPressed('Immediate Quit')) then settings.close:=true;
    except
      sx.console.addLine('ERROR: Unhandled exception occurred in pingK main loop');
    end;
   
  until (settings.close);

  FormMain.Close;
end;




procedure SUXApp.initialize;
var p: SXInt;
    param: SXStringL;
    startimmediately: SXBool;
begin
  FormMain.Timer.Enabled:=false;

  sx.console.addSeparatorLine;
  sx.console.addLine('Application Layer: Initializing...');
  sx.console.addEmptyLine;
  sx.console.addLine('Application: '+SX_APPLICATION_IDENTIFIER);
  sx.console.addLine('Version:     '+SX_APPLICATION_VERSION);
  sx.console.addLine('Copyright:   '+SX_APPLICATION_COPYRIGHT);
  sx.console.addSeparatorLine;
  sx.console.addEmptyLine;

  ini.initialize;

  // Parse arguments.
  startimmediately := false;
  for p := 0 to System.ParamCount do
  begin
    param := System.ParamStr(p);
    sx.console.addLine('Command line argument: ' + param);
    if (param = '-action') then startimmediately := true;
    if (param = 'rx') and (p < System.ParamCount) then
    begin
      ini.settings.display.width := sx.convert.strToInt(System.ParamStr(p + 1));
      ini.settings.display.fullscreen := true;
    end;
    if (param = 'ry') and (p < System.ParamCount) then
    begin
      ini.settings.display.height := sx.convert.strToInt(System.ParamStr(p + 1));
      ini.settings.display.fullscreen := true;
    end;
  end;

  FormMain.ClientWidth:=ini.settings.display.width;
  FormMain.ClientHeight:=ini.settings.display.height;
  if (not ini.settings.display.fullscreen) then FormMain.Position:=poScreenCenter
  else begin
    FormMain.BorderStyle:=bsNone;
    FormMain.Left:=0;
    FormMain.Top:=0;
  end;

  input.initialize(FormMain,true,true,true);
  sound.initialize(FormMain,false,false,true,44100,ini.settings.sound.volume,32);
  gl.initialize(FormMain,'View',0,0,ini.settings.display.width,ini.settings.display.height,32,
    ini.settings.display.hz,ini.settings.display.fullscreen);

  input.addButton('Quit','Menu',ini.settings.controls.cancel);
  input.addButton('Backspace','Menu',SX_INPUT_BUTTONINDEX_BACKSPACE);
  input.addButton('Help','Menu',SX_INPUT_BUTTONINDEX_F1);
  input.addButton('Hint','Menu',SX_INPUT_BUTTONINDEX_F5);
  input.addButton('Immediate Quit','Menu',SX_INPUT_BUTTONINDEX_F10);
  input.addButton('Up','Menu',SX_INPUT_BUTTONINDEX_UP);
  input.addButton('Down','Menu',SX_INPUT_BUTTONINDEX_DOWN);
  input.addButton('Accept','Menu', ini.settings.controls.accept);
  input.addButton('Pause','Menu',SX_INPUT_BUTTONINDEX_P);
  input.addButton('Up','Player1',ini.settings.player1.keyup);
  input.addButton('Down','Player1',ini.settings.player1.keydown);
  input.addButton('Up','Player2',ini.settings.player2.keyup);
  input.addButton('Down','Player2',ini.settings.player2.keydown);
  sound.loadSamplesFromList('sounds\sounds');

  scene:=SAGLScene.Create(self,'Scene');
  scene.initialize;

  if (not ini.settings.menu.candisplaymenu) then startimmediately := true;
  game.initialize(startimmediately);

  FormMain.Timer.Enabled:=true;
end;


procedure SUXApp.shutdown;
begin
  sx.console.addEmptyLine;
  sx.console.addSeparatorLine;
  sx.console.addLine('Application Layer: Shut down...');

  scene.Free;
  ini.Free;
  game.Free;

  sx.console.addSeparatorLine;
  sx.console.addEmptyLine;

  input.Free;
  sound.Free;
  gl.Free;
end;


constructor SUXApp.Create(parent:TObject);
begin
  inherited Create(parent,'SUX App Main');

  settings.close:=false;
  settings.score:=0;
  input:=SUXInput.Create(self);
  sound:=SUXSound.Create(self);
  gl:=SUXGL.Create(self);
  ini:=SAIni.Create(self);
  game:=SAGame.Create(self);
end;


destructor SUXApp.Destroy;
begin
  shutdown;

  inherited;
end;


end.