Add ability to resize engine's window
authorunc0rr
Sun, 27 Jul 2008 19:37:24 +0000
changeset 1120 eb5a9f86f9c6
parent 1119 be9700b424b2
child 1121 d595dc56b4f3
Add ability to resize engine's window
hedgewars/CCHandlers.inc
hedgewars/GSHandlers.inc
hedgewars/SDLh.pas
hedgewars/hwengine.dpr
hedgewars/uStore.pas
hedgewars/uWorld.pas
--- a/hedgewars/CCHandlers.inc	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/CCHandlers.inc	Sun Jul 27 19:37:24 2008 +0000
@@ -455,7 +455,7 @@
 {$ENDIF}
 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 
-flags:= SDL_OPENGL;
+flags:= SDL_OPENGL or SDL_RESIZABLE;
 if cFullScreen then flags:= flags or SDL_FULLSCREEN
                else SDL_WM_SetCaption('Hedgewars', nil);
 {$IFDEF DEBUGFILE}
--- a/hedgewars/GSHandlers.inc	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/GSHandlers.inc	Sun Jul 27 19:37:24 2008 +0000
@@ -964,7 +964,7 @@
            end
   until b;
 
-t:= cScreenHeight - 4;
+t:= - 4;
 for i:= 0 to Pred(TeamsCount) do
     with thexchar[i] do
          begin
--- a/hedgewars/SDLh.pas	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/SDLh.pas	Sun Jul 27 19:37:24 2008 +0000
@@ -57,6 +57,7 @@
       SDL_KEYDOWN     = 2;
       SDL_KEYUP       = 3;
       SDL_QUITEV      = 12;
+      SDL_VIDEORESIZE = 16;
 
       SDL_APPINPUTFOCUS = 2;
 
@@ -65,6 +66,7 @@
 
       SDL_GL_DOUBLEBUFFER = 5;
       SDL_OPENGL          = 2;
+      SDL_RESIZABLE       = $00000010;
 
       RMask = $FF;
       GMask = $FF00;
@@ -167,9 +169,9 @@
 
      TSDL_ActiveEvent = record
 	                type_: byte;
-                        gain: byte;
-                        state: byte;
-                        end;
+                    gain: byte;
+                    state: byte;
+                    end;
 
      TSDL_KeyboardEvent = record
                           type_: Byte;
@@ -181,6 +183,11 @@
      TSDL_QuitEvent = record
                       type_: Byte;
                       end;
+	TSDL_ResizeEvent = record
+			type_: Byte;
+			w, h: LongInt;
+			end;
+
      PSDL_Event = ^TSDL_Event;
      TSDL_Event = record
                   case Byte of
@@ -188,6 +195,7 @@
                        SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent);
                        SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent);
                        SDL_QUITEV: (quit: TSDL_QuitEvent);
+                       SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent);
                        end;
 
      PByteArray = ^TByteArray;
--- a/hedgewars/hwengine.dpr	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/hwengine.dpr	Sun Jul 27 19:37:24 2008 +0000
@@ -132,6 +132,17 @@
 halt
 end;
 
+////////////////////////////////
+procedure Resize(w, h: LongInt);
+begin
+cScreenWidth:= w;
+cScreenHeight:= h;
+if cFullScreen then
+	ParseCommand('/fullscr 1', true)
+else
+	ParseCommand('/fullscr 0', true);
+end;
+
 ///////////////////
 procedure MainLoop;
 var PrevTime,
@@ -141,12 +152,13 @@
 PrevTime:= SDL_GetTicks;
 repeat
 while SDL_PollEvent(@event) <> 0 do
-      case event.type_ of
-           SDL_KEYDOWN: if GameState = gsChat then KeyPressChat(event.key.keysym.unicode);
-           SDL_ACTIVEEVENT: if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then
-                               cHasFocus:= event.active.gain = 1;
-           SDL_QUITEV: isTerminated:= true
-           end;
+	case event.type_ of
+		SDL_KEYDOWN: if GameState = gsChat then KeyPressChat(event.key.keysym.unicode);
+		SDL_ACTIVEEVENT: if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then
+				cHasFocus:= event.active.gain = 1;
+		SDL_VIDEORESIZE: Resize(max(event.resize.w, 320), max(event.resize.h, 240));
+		SDL_QUITEV: isTerminated:= true
+		end;
 CurrTime:= SDL_GetTicks;
 if PrevTime + cTimerInterval <= CurrTime then
    begin
--- a/hedgewars/uStore.pas	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/uStore.pas	Sun Jul 27 19:37:24 2008 +0000
@@ -128,7 +128,7 @@
     begin
     r.x:= 0;
     r.y:= 0;
-    drY:= cScreenHeight - 4;
+    drY:= - 4;
     for t:= 0 to Pred(TeamsCount) do
      with TeamsArray[t]^ do
       begin
--- a/hedgewars/uWorld.pas	Sun Jul 27 19:21:30 2008 +0000
+++ b/hedgewars/uWorld.pas	Sun Jul 27 19:37:24 2008 +0000
@@ -52,7 +52,7 @@
 
 var cWaterSprCount: LongInt;
     Captions: array[TCapGroup] of TCaptionStr;
-    AMxLeft, AMxCurr, SlotsNum: LongInt;
+    AMxShift, SlotsNum: LongInt;
     tmpSurface: PSDL_Surface;
     fpsTexture: PTexture = nil;
 
@@ -65,8 +65,7 @@
 prevPoint.Y:= cScreenHeight div 2;
 WorldDx:=  - 1024 + cScreenWidth div 2;
 WorldDy:=  - 512 + cScreenHeight div 2;
-AMxLeft:= cScreenWidth - 210;
-AMxCurr:= cScreenWidth
+AMxShift:= 210
 end;
 
 procedure ShowAmmoMenu;
@@ -77,18 +76,18 @@
 if (TurnTimeLeft = 0) or KbdKeyPressed then bShowAmmoMenu:= false;
 if bShowAmmoMenu then
    begin
-   if AMxCurr = cScreenWidth then prevPoint.X:= 0;
-   if AMxCurr > AMxLeft then dec(AMxCurr, MENUSPEED);
+   if AMxShift = 210 then prevPoint.X:= 0;
+   if AMxShift > 0 then dec(AMxShift, MENUSPEED);
    end else
    begin
-   if AMxCurr = AMxLeft then
+   if AMxShift = 0 then
       begin
       CursorPoint.X:= cScreenWidth div 2;
       CursorPoint.Y:= cScreenHeight div 2;
       prevPoint:= CursorPoint;
       SDL_WarpMouse(CursorPoint.X, CursorPoint.Y)
       end;
-   if AMxCurr < cScreenWidth then inc(AMxCurr, MENUSPEED);
+   if AMxShift < 210 then inc(AMxShift, MENUSPEED);
    end;
 
 if CurrentTeam = nil then exit;
@@ -98,7 +97,7 @@
      begin
      if Ammo = nil then exit;
      SlotsNum:= 0;
-     x:= AMxCurr;
+     x:= cScreenWidth - 210 + AMxShift;
      y:= cScreenHeight - 40;
      dec(y);
      DrawSprite(sprAMBorders, x, y, 0);
@@ -137,9 +136,9 @@
      if (Pos >= 0) then
         if Ammo^[Slot, Pos].Count > 0 then
            begin
-           DrawTexture(AMxCurr + 10, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex);
+           DrawTexture(cScreenWidth - 200 + AMxShift, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex);
            if Ammo^[Slot, Pos].Count < AMMO_INFINITE then
-              DrawTexture(AMxCurr + 175, cScreenHeight - 68, CountTexz[Ammo^[Slot, Pos].Count]);
+              DrawTexture(cScreenWidth + AMxShift - 35, cScreenHeight - 68, CountTexz[Ammo^[Slot, Pos].Count]);
            if bSelected then
               begin
               bShowAmmoMenu:= false;
@@ -151,7 +150,7 @@
      end;
 
 bSelected:= false;
-if AMxLeft = AMxCurr then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (RealTicks shr 6) mod 8)
+if AMxShift = 0 then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (RealTicks shr 6) mod 8)
 end;
 
 procedure MoveCamera; forward;
@@ -292,7 +291,7 @@
 for t:= 0 to Pred(TeamsCount) do
    with TeamsArray[t]^ do
       begin
-      DrawTexture(cScreenWidth div 2 - NameTagTex^.w - 3, DrawHealthY, NameTagTex);
+      DrawTexture(cScreenWidth div 2 - NameTagTex^.w - 3, cScreenHeight + DrawHealthY, NameTagTex);
 
       r.x:= 0;
       r.y:= 0;
@@ -300,14 +299,14 @@
       r.h:= HealthTex^.h;
 
       DrawFromRect(cScreenWidth div 2,
-                        DrawHealthY,
+                        cScreenHeight + DrawHealthY,
                         @r, HealthTex);
 
       inc(r.x, cTeamHealthWidth + 2);
       r.w:= 3;
 
       DrawFromRect(cScreenWidth div 2 + TeamHealthBarWidth + 2,
-                        DrawHealthY,
+                        cScreenHeight + DrawHealthY,
                         @r, HealthTex);
       end;
 
@@ -338,7 +337,7 @@
    end;
 
 // AmmoMenu
-if (AMxCurr < cScreenWidth) or bShowAmmoMenu then ShowAmmoMenu;
+if (AMxShift < 210) or bShowAmmoMenu then ShowAmmoMenu;
 
 DrawChat;
 
@@ -426,10 +425,10 @@
 
 if ((CursorPoint.X = prevPoint.X)and(CursorPoint.Y = prevpoint.Y)) then exit;
 
-if AMxCurr < cScreenWidth then
+if AMxShift < 210 then
    begin
-   if CursorPoint.X < AMxCurr + 35 then CursorPoint.X:= AMxCurr + 35;
-   if CursorPoint.X > AMxCurr + 200 then CursorPoint.X:= AMxCurr + 200;
+   if CursorPoint.X < cScreenWidth + AMxShift - 175 then CursorPoint.X:= cScreenWidth + AMxShift - 175;
+   if CursorPoint.X > cScreenWidth + AMxShift - 10 then CursorPoint.X:= cScreenWidth + AMxShift - 10;
    if CursorPoint.Y < cScreenHeight - 75 - SlotsNum * 33 then CursorPoint.Y:= cScreenHeight - 75 - SlotsNum * 33;
    if CursorPoint.Y > cScreenHeight - 76 then CursorPoint.Y:= cScreenHeight - 76;
    prevPoint:= CursorPoint;