diff --git a/applications/tappytux/gameplayform.lfm b/applications/tappytux/gameplayform.lfm index 5d03c8e4b..56cc4ba04 100644 --- a/applications/tappytux/gameplayform.lfm +++ b/applications/tappytux/gameplayform.lfm @@ -1,7 +1,7 @@ object formTappyTuxGame: TformTappyTuxGame - Left = 599 + Left = 388 Height = 425 - Top = 312 + Top = 172 Width = 621 Caption = 'Tappy Tux' ClientHeight = 425 @@ -21,7 +21,7 @@ object formTappyTuxGame: TformTappyTuxGame end object Answer: TEdit Left = 104 - Height = 23 + Height = 22 Top = 392 Width = 514 OnKeyPress = AnswerKeyPress @@ -83,7 +83,7 @@ object formTappyTuxGame: TformTappyTuxGame end object Level: TEdit Left = 8 - Height = 23 + Height = 22 Top = 64 Width = 76 ReadOnly = True @@ -91,7 +91,7 @@ object formTappyTuxGame: TformTappyTuxGame end object Score: TEdit Left = 8 - Height = 23 + Height = 22 Top = 152 Width = 76 ReadOnly = True @@ -99,7 +99,7 @@ object formTappyTuxGame: TformTappyTuxGame end object Lives: TEdit Left = 8 - Height = 23 + Height = 22 Top = 232 Width = 76 ReadOnly = True diff --git a/applications/tappytux/mod_tappymath.pas b/applications/tappytux/mod_tappymath.pas index dc2256f57..13644373c 100644 --- a/applications/tappytux/mod_tappymath.pas +++ b/applications/tappytux/mod_tappymath.pas @@ -98,10 +98,9 @@ begin snowmanWrong.StartPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanWrong.EndPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanWrong.Position := vTappyTuxDrawer.GetAnimation(i).Position; - snowmanWrong.Bitmap := TPortableNetworkGraphic.Create; + snowmanWrong.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanwrong.png'); snowmanWrong.caption:= 'Oh-oh!'; snowmanWrong.value:= '0'; - snowmanWrong.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanwrong.png'); vTappyTuxDrawer.AddAnimation(snowmanWrong); vTappyTuxDrawer.RemoveAnimation(i); i := i -1; @@ -184,17 +183,13 @@ begin lTuxAnimation.IsInfinite := True; lTuxAnimation.StartPoint := Point(250, 328); lTuxAnimation.EndPoint := lTuxAnimation.StartPoint; - SetLength(lTuxAnimation.Bitmaps, 6); - lTuxAnimation.Bitmaps[0] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[0].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_1.png'); - lTuxAnimation.Bitmaps[1] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[1].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); - lTuxAnimation.Bitmaps[2] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[2].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); - lTuxAnimation.Bitmaps[3] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[3].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_4.png'); - lTuxAnimation.Bitmaps[4] := lTuxAnimation.Bitmaps[2]; - lTuxAnimation.Bitmaps[5] := lTuxAnimation.Bitmaps[1]; + SetLength(lTuxAnimation.Images, 6); + lTuxAnimation.LoadImageFromPng(0, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_1.png'); + lTuxAnimation.LoadImageFromPng(1, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); + lTuxAnimation.LoadImageFromPng(2, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); + lTuxAnimation.LoadImageFromPng(3, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_4.png'); + lTuxAnimation.LoadImageFromPng(4, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); + lTuxAnimation.LoadImageFromPng(5, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); vTappyTuxDrawer.AddAnimation(lTuxAnimation); for i:= 1 to 5 do @@ -274,9 +269,8 @@ begin snowmanAnimation.StartPoint := Point(xAux, 5); snowmanAnimation.EndPoint := Point(xAux, 100); snowmanAnimation.IsInfinite:= false; - snowmanAnimation.Bitmap := TPortableNetworkGraphic.Create; + snowmanAnimation.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowman.png'); //snowmanAnimation.caption:= gameQuestionList[random(gameQuestionList.Count - 1)]; - snowmanAnimation.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowman.png'); questionType[1] := random(3); @@ -332,10 +326,9 @@ begin snowmanRight.StartPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanRight.EndPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanRight.Position := vTappyTuxDrawer.GetAnimation(i).Position; - snowmanRight.Bitmap := TPortableNetworkGraphic.Create; snowmanRight.caption:= 'OK!'; snowmanRight.value:= '0'; - snowmanRight.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanright.png'); + snowmanRight.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanright.png'); vTappyTuxDrawer.AddAnimation(snowmanRight); vTappyTuxDrawer.RemoveAnimation(i); i := i - 1; diff --git a/applications/tappytux/mod_tappywords.pas b/applications/tappytux/mod_tappywords.pas index d60cb4620..fed0f4ad1 100644 --- a/applications/tappytux/mod_tappywords.pas +++ b/applications/tappytux/mod_tappywords.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, fpSound, // LCL - ExtCtrls, + ExtCtrls, IntfGraphics, // TappyTux tappyconfig, tappydrawer, tappymodules; @@ -99,10 +99,9 @@ begin snowmanWrong.StartPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanWrong.EndPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanWrong.Position := vTappyTuxDrawer.GetAnimation(i).Position; - snowmanWrong.Bitmap := TPortableNetworkGraphic.Create; snowmanWrong.caption:= 'Oh-oh!'; snowmanWrong.value:= '0'; - snowmanWrong.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanwrong.png'); + snowmanWrong.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanwrong.png'); vTappyTuxDrawer.AddAnimation(snowmanWrong); vTappyTuxDrawer.RemoveAnimation(i); i := i -1; @@ -157,7 +156,6 @@ procedure TTappyWords.StartNewGame(SndFX: Integer; Music: Integer; Level: Intege var i: Integer; lTuxAnimation: TTappySpriteAnimation; - begin count := 5; timerWords.Enabled := True; @@ -174,8 +172,8 @@ begin if QuestionList < 0 then QuestionList := 0; gameQuestionList := TStringList.Create; - //gameQuestionList.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images'+PathDelim+'modules'+PathDelim+'tappywords'+PathDelim+'0.txt'); - gameQuestionList.LoadFromFile('C:/'+IntToStr(QuestionList)+'.txt'); + gameQuestionList.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images'+PathDelim+'modules'+PathDelim+'tappywords'+PathDelim+'0.txt'); + //gameQuestionList.LoadFromFile('C:/'+IntToStr(QuestionList)+'.txt'); formTappyTuxGame.Answer.ReadOnly := false; formTappyTuxGame.GameOver.Visible := false; @@ -190,17 +188,13 @@ begin lTuxAnimation.IsInfinite := True; lTuxAnimation.StartPoint := Point(250, 328); lTuxAnimation.EndPoint := lTuxAnimation.StartPoint; - SetLength(lTuxAnimation.Bitmaps, 6); - lTuxAnimation.Bitmaps[0] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[0].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_1.png'); - lTuxAnimation.Bitmaps[1] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[1].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); - lTuxAnimation.Bitmaps[2] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[2].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); - lTuxAnimation.Bitmaps[3] := TPortableNetworkGraphic.Create; - lTuxAnimation.Bitmaps[3].LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_4.png'); - lTuxAnimation.Bitmaps[4] := lTuxAnimation.Bitmaps[2]; - lTuxAnimation.Bitmaps[5] := lTuxAnimation.Bitmaps[1]; + SetLength(lTuxAnimation.Images, 6); + lTuxAnimation.LoadImageFromPng(0, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_1.png'); + lTuxAnimation.LoadImageFromPng(1, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); + lTuxAnimation.LoadImageFromPng(2, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); + lTuxAnimation.LoadImageFromPng(3, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_4.png'); + lTuxAnimation.LoadImageFromPng(4, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_3.png'); + lTuxAnimation.LoadImageFromPng(5, vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'tux_2.png'); vTappyTuxDrawer.AddAnimation(lTuxAnimation); //Sound Creation @@ -227,7 +221,6 @@ var heightAux: array [0..4] of integer; existenceAux: array [0..4] of boolean; snowmanAnimation: TFallingText; - begin for i:= 0 to 4 do @@ -288,9 +281,8 @@ begin snowmanAnimation.StartPoint := Point(xAux, 5); snowmanAnimation.EndPoint := Point(xAux, 100); snowmanAnimation.IsInfinite:= false; - snowmanAnimation.Bitmap := TPortableNetworkGraphic.Create; + snowmanAnimation.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowman.png'); snowmanAnimation.caption:= gameQuestionList[random(gameQuestionList.Count - 1)]; - snowmanAnimation.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowman.png'); vTappyTuxDrawer.AddAnimation(snowmanAnimation); end; @@ -300,7 +292,6 @@ var i: Integer; j: Integer; snowmanRight: TFallingText; - begin i:= 0; j:= vTappyTuxDrawer.GetAnimationCount - 1; @@ -319,10 +310,9 @@ begin snowmanRight.StartPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanRight.EndPoint := vTappyTuxDrawer.GetAnimation(i).Position; snowmanRight.Position := vTappyTuxDrawer.GetAnimation(i).Position; - snowmanRight.Bitmap := TPortableNetworkGraphic.Create; + snowmanRight.LoadImageFromPng(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanright.png'); snowmanRight.caption:= 'OK!'; snowmanRight.value:= '0'; - snowmanRight.Bitmap.LoadFromFile(vTappyTuxConfig.GetResourcesDir() + 'images' + PathDelim + 'sprites' + PathDelim + 'snowmanright.png'); vTappyTuxDrawer.AddAnimation(snowmanRight); vTappyTuxDrawer.RemoveAnimation(i); i := i - 1; diff --git a/applications/tappytux/tappydrawer.pas b/applications/tappytux/tappydrawer.pas index aa10617ba..380b3bfa9 100644 --- a/applications/tappytux/tappydrawer.pas +++ b/applications/tappytux/tappydrawer.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, Controls, Graphics, LCLType, IntfGraphics, fpimage, - Math, + Math, LCLIntf, tappyconfig, tappymodules; type @@ -14,6 +14,7 @@ type { TTappyTuxAnimation } TTappyTuxAnimation = class + public StartPoint, EndPoint: TPoint; Position: TPoint; CurrentStep: Integer; @@ -32,20 +33,22 @@ type TTappySpriteAnimation = class(TTappyTuxAnimation) public - //StartPoint, EndPoint: TPoint; override; - Bitmaps: array of TFPImageBitmap; + Images: array of TLazIntfImage; + destructor Destroy; override; procedure DrawToIntfImg(AIntfImage: TLazIntfImage); override; procedure ExecuteFinal; override; + procedure LoadImageFromPng(AIndex: Integer; APath: string); end; { TFallingText } TFallingText = class(TTappyTuxAnimation) public - //StartPoint, EndPoint: TPoint; override; - Bitmap: TFPImageBitmap; + Image: TLazIntfImage; + destructor Destroy; override; procedure DrawToIntfImg(AIntfImage: TLazIntfImage); override; procedure DrawToCanvas(ACanvas: TCanvas); override; procedure ExecuteFinal; override; + procedure LoadImageFromPng(APath: string); end; { TTappyTuxDrawer } @@ -62,7 +65,7 @@ type procedure DrawToCanvas(ACanvas: TCanvas); class procedure DrawImageWithTransparentColor( ADest: TLazIntfImage; const ADestX, ADestY: Integer; AColor: TFPColor; - AImage: TFPImageBitmap); + AImage: TLazIntfImage); class function DateTimeToMilliseconds(aDateTime: TDateTime): Int64; //function GetImage(ATile: TChessTile): TPortableNetworkGraphic; procedure HandleMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); @@ -85,17 +88,26 @@ implementation { TTappySpriteAnimation } +destructor TTappySpriteAnimation.Destroy; +var + i: Integer; +begin +{ for i := 0 to Length(Images)-1 do + if Assigned(Images[i]) then Images[i].Free;} + inherited Destroy; +end; + procedure TTappySpriteAnimation.DrawToIntfImg(AIntfImage: TLazIntfImage); var lNumBitmaps, lCurBmpIndex: Integer; begin - lNumBitmaps := Length(Bitmaps); + lNumBitmaps := Length(Images); if lNumBitmaps = 0 then Exit; lCurBmpIndex := CurrentStep mod lNumBitmaps; TTappyTuxDrawer.DrawImageWithTransparentColor(AIntfImage, - Position.X, Position.Y, colFuchsia, Bitmaps[lCurBmpIndex]); + Position.X, Position.Y, colFuchsia, Images[lCurBmpIndex]); end; procedure TTappySpriteAnimation.ExecuteFinal; @@ -103,12 +115,32 @@ begin inherited ExecuteFinal; end; +procedure TTappySpriteAnimation.LoadImageFromPng(AIndex: Integer; APath: string); +var + lBitmap: TPortableNetworkGraphic; +begin + lBitmap := TPortableNetworkGraphic.Create; + try + lBitmap.LoadFromFile(APath); + Images[AIndex] := TLazIntfImage.Create(0, 0); + Images[AIndex].LoadFromBitmap(lBitmap.Handle, 0); + finally + lBitmap.Free; + end; +end; + {TFallingText} +destructor TFallingText.Destroy; +begin + if Assigned(Image) then Image.Free; + inherited Destroy; +end; + procedure TFallingText.DrawToIntfImg(AIntfImage: TLazIntfImage); begin TTappyTuxDrawer.DrawImageWithTransparentColor(AIntfImage, - Position.X, Position.Y, colFuchsia, Bitmap); + Position.X, Position.Y, colFuchsia, Image); end; procedure TFallingText.DrawToCanvas(ACanvas: TCanvas); @@ -122,6 +154,20 @@ begin inherited ExecuteFinal; end; +procedure TFallingText.LoadImageFromPng(APath: string); +var + lBitmap: TPortableNetworkGraphic; +begin + lBitmap := TPortableNetworkGraphic.Create; + try + lBitmap.LoadFromFile(APath); + Image := TLazIntfImage.Create(0, 0); + Image.LoadFromBitmap(lBitmap.Handle, 0); + finally + lBitmap.Free; + end; +end; + { TTappyTuxAnimation } @@ -208,7 +254,7 @@ var X, Y: integer; i: Integer; lAnimation: TTappyTuxAnimation; - lStartTime, lTimeDiff: TDateTime; + lStartTime, lAnimTime, lTimeDiff: TDateTime; begin {$IFDEF TAPPY_PROFILER} lStartTime := Now; @@ -224,7 +270,14 @@ begin begin lAnimation := TTappyTuxAnimation(FAnimationList.Items[i]); lAnimation.CalculatePosition(); + {$IFDEF TAPPY_PROFILER} + lAnimTime := Now; + {$ENDIF} lAnimation.DrawToIntfImg(lIntfImage); + {$IFDEF TAPPY_PROFILER} + lTimeDiff := Now - lAnimTime; + WriteLn(Format('[TTappyTuxDrawer.DrawToCanvas] %s %d DrawToIntfImage Performance: %7d ms', [lAnimation.ClassName, i, DateTimeToMilliseconds(lTimeDiff)])); + {$ENDIF} end; lTmpBmp.LoadFromIntfImage(lIntfImage); @@ -234,9 +287,7 @@ begin // Now TCanvas drawings // ------------------------- - // Now the module should draw itself - - // Draw all animations via TLazIntfImage + // Second pass of animation drawings, now draw via TCanvas for using fonts for i := 0 to FAnimationList.Count - 1 do begin lAnimation := TTappyTuxAnimation(FAnimationList.Items[i]); @@ -249,44 +300,35 @@ begin end; {$IFDEF TAPPY_PROFILER} lTimeDiff := Now - lStartTime; - // DebugLn(Format('[TwebLobbyServer.DataModuleRequest] END RequestClass=%s Performance: %7d ms', [Msg.ClassName, DateTimeToMilliseconds(lTimeDiff)])); + WriteLn(Format('[TTappyTuxDrawer.DrawToCanvas] Performance: %7d ms', [DateTimeToMilliseconds(lTimeDiff)])); {$ENDIF} end; class procedure TTappyTuxDrawer.DrawImageWithTransparentColor(ADest: TLazIntfImage; - const ADestX, ADestY: Integer; AColor: TFPColor; AImage: TFPImageBitmap); + const ADestX, ADestY: Integer; AColor: TFPColor; AImage: TLazIntfImage); var x, y, CurX, CurY: Integer; - IntfImage: TLazIntfImage; lDrawWidth, lDrawHeight: Integer; CurColor: TFPColor; begin - IntfImage := TLazIntfImage.Create(0,0); - try - IntfImage.LoadFromBitmap(AImage.Handle, AImage.MaskHandle); - - // Take care not to draw outside the destination area - lDrawWidth := Min(ADest.Width - ADestX, AImage.Width); - lDrawHeight := Min(ADest.Height - ADestY, AImage.Height); - for y := 0 to lDrawHeight - 1 do + // Take care not to draw outside the destination area + lDrawWidth := Min(ADest.Width - ADestX, AImage.Width); + lDrawHeight := Min(ADest.Height - ADestY, AImage.Height); + for y := 0 to lDrawHeight - 1 do + begin + for x := 0 to lDrawWidth - 1 do begin - for x := 0 to lDrawWidth - 1 do - begin - CurX := ADestX + x; - CurY := ADestY + y; + CurX := ADestX + x; + CurY := ADestY + y; - // Never draw outside the destination - if (CurX < 0) or (CurY < 0) then Continue; + // Never draw outside the destination + if (CurX < 0) or (CurY < 0) then Continue; - CurColor := AImage.Canvas.Colors[x, y]; // Good for debugging - if ((CurColor.Green div $FF) <> (AColor.Green div $FF)) or - ((CurColor.Red div $FF) <> (AColor.Red div $FF)) or - ((CurColor.Blue div $FF) <> (AColor.Blue div $FF)) then - ADest.Colors[CurX, CurY] := IntfImage.Colors[x, y]; - end; + CurColor := AImage.Colors[x, y]; + if (AColor.Green <> CurColor.Green) or (AColor.Red <> CurColor.Red) + or (AColor.Blue <> CurColor.Blue) then + ADest.Colors[CurX, CurY] := CurColor; end; - finally - IntfImage.Free; end; end; diff --git a/applications/tappytux/tappytux.lpi b/applications/tappytux/tappytux.lpi index d86fc352e..496a7c193 100644 --- a/applications/tappytux/tappytux.lpi +++ b/applications/tappytux/tappytux.lpi @@ -16,8 +16,38 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -97,7 +127,7 @@ - + @@ -107,6 +137,9 @@ + + +