1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275:
| unit uGame;
interface
uses ElysionTypes, ElysionApplication, ElysionScene, ElysionLogger, ElysionColor, ElysionGraphics, ElysionTrueTypeFont, ElysionTimer, ElysionInput, ElysionUtils, ElysionRendering, ElysionTexture,
SysUtils, uBasic, uGlobal, uConfig, uMainMenu, uGameScreen, uCredits, uOptions;
type TGame = class(TelGame) private fMainMenu: TMainMenu; fGameScreen: TGameScreen; fCredits: TCredits; fOptions: TOptions; fLoadScreen: TelSprite;
fFont: TelTrueTypeFont; fShowFPS, fDebug: Boolean; fForceFullscreen, fForceWindow: Boolean;
fRenderTarget : TelRenderTarget;
public constructor Create(); Override; destructor Destroy; Override; procedure Initialize(); Override;
procedure Render(); Override; procedure Update(dt: Double = 0.0); Override; procedure HandleEvents(); Override; published property Debug: Boolean read fDebug write fDebug; property ForceFullscreen: Boolean read fForceFullscreen write fForceFullscreen; property ForceWindow: Boolean read fForceWindow write fForceWindow;
property Font: TelTrueTypeFont read fFont write fFont;
property MainMenu: TMainMenu read fMainMenu write fMainMenu; property GameScreen: TGameScreen read fGameScreen write fGameScreen; property Credits: TCredits read fCredits write fCredits; property Options: TOptions read fOptions write fOptions;
property ShowFPS: Boolean read fShowFPS write fShowFPS; end;
implementation
constructor TGame.Create; var tmpFullscreen: Boolean; begin Debug := true;
fForceFullscreen := false; fForceWindow := false;
fShowFPS := false; GameState := gsMainMenu;
if Self.Param('-debug') then Debug := true; if Self.Param('-fullscreen') then ForceFullscreen := true; if Self.Param('-window') then ForceWindow := true;
if Debug then begin TelLogger.getInstance.Priorities := [ltNote, ltWarning, ltError]; tmpFullscreen := false end else tmpFullscreen := true;
if (ForceWindow) and (not ForceFullscreen) then tmpFullscreen := false else tmpFullscreen := true;
if ((Desktop.Width = 1024) and (Desktop.Height = 600)) then inherited Create(Desktop.Width, Desktop.Height, AppConfig.Bits, true) else inherited Create(AppConfig.Width, AppConfig.Height, AppConfig.Bits, false);
fLoadScreen := TelSprite.Create; fLoadScreen.LoadFromFile(GetResImgPath + 'loadscreen.jpg');
fRenderTarget := TelRenderTarget.Create;
end;
destructor TGame.Destroy; begin inherited;
fLoadScreen.Destroy;
MainMenu.Destroy; if GameScreen <> nil then GameScreen.Destroy; end;
procedure TGame.Initialize; var newRatio: Single; begin
ActiveWindow.BeginScene; fLoadScreen.Draw; ActiveWindow.EndScene;
ActiveWindow.Caption := 'My Application'; ActiveWindow.ShowCursor();
fFont := TelTrueTypeFont.Create; fFont.LoadFromFile(GetStdFont, 16); fFont.Color := Color.clWhite; fFont.RenderStyle := rtBlended;
Input.DebugInfo();
fRenderTarget := TelRenderTarget.Create;
MainMenu := TMainMenu.Create(); Options := TOptions.Create(); Credits := TCredits.Create();
end;
procedure TGame.Render; var fSprite : TelSprite; fTexture : TelTexture; fColor : TelColor; begin
fRenderTarget.Bind;
if MainMenu.NewGameClick then begin fLoadScreen.Draw; ActiveWindow.EndScene;
if fGameScreen <> nil then FreeAndNil(fGameScreen); fGameScreen := TGameScreen.Create;
MainMenu.NewGameClick := false; end;
case GameState of gsMainMenu: MainMenu.Render(); gsOptions: Options.Render(); gsIntro: ; gsCredits: Credits.Render(); gsGame: GameScreen.Render(); end;
fSprite := TelSprite.Create(); fTexture := TelTexture.Create(); fTexture.LoadFromGL( fRenderTarget.TextureId, ActiveWindow.Width, ActiveWindow.Height ); fSprite.LoadFromTexture(fTexture); fRenderTarget.Unbind;
fColor.R := 150; fColor.G := 140; fColor.B := 120;
fSprite.Draw; end;
procedure TGame.Update(dt: Double); begin if ShowFPS then fFont.TextOut(makeV3f(8, 8, 0), Format('FPS: %.2f Delta: %.5f \n Mouse Abs: %d %d Rel: %d %d', [ActiveWindow.FPS, ActiveWindow.DeltaTime, Input.Mouse.Cursor.X, Input.Mouse.Cursor.Y, Input.Mouse.RelCursor.X, Input.Mouse.RelCursor.Y]));
case GameState of gsCredits: begin Credits.Update(dt); end; gsOptions: begin Options.Update(dt); end; gsMainMenu: begin MainMenu.Update(dt); end; gsGame: begin GameScreen.Update(dt); end; end;
end;
procedure TGame.HandleEvents(); begin case GameState of gsCredits: begin Credits.HandleEvents; end; gsOptions: begin Options.HandleEvents; end; gsMainMenu: begin MainMenu.HandleEvents; end; gsGame: begin GameScreen.HandleEvents; end; end;
if GameState <> gsMainMenu then begin if Input.Keyboard.isKeyHit(Key.Escape) or Input.XBox360Controller.Back then GameState := gsMainMenu; end else begin if Input.Keyboard.isKeyHit(Key.Escape) or Input.XBox360Controller.Back then Application.Quit(); end;
if Input.Keyboard.isKeyHit(Key.F) then begin ShowFPS := not ShowFPS; end;
if Input.Keyboard.isKeyHit(Key.T) then begin ActiveWindow.TakeScreenShot('screenshot'); end;
end;
end. |