aboutsummaryrefslogtreecommitdiff
path: root/src/game_tab
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2023-01-08 12:26:38 +0100
committerLoic Guegan <manzerbredes@mailbox.org>2023-01-08 12:26:38 +0100
commit7fe3e6dee0b66bac61ae20c2e2cd8bcc843b8f5d (patch)
treea997d0eaf35e9d6a54d4655d21183f144b468312 /src/game_tab
parent749455cf19d84a3657c3cddf04394ddff5a81ea8 (diff)
Improve BoardCanvas
Diffstat (limited to 'src/game_tab')
-rw-r--r--src/game_tab/left_panel/board/BoardCanvas.cpp38
-rw-r--r--src/game_tab/left_panel/board/BoardCanvas.hpp4
2 files changed, 17 insertions, 25 deletions
diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp
index 1043d86..9eb54ee 100644
--- a/src/game_tab/left_panel/board/BoardCanvas.cpp
+++ b/src/game_tab/left_panel/board/BoardCanvas.cpp
@@ -21,8 +21,7 @@ BoardCanvas::BoardCanvas(wxFrame *parent)
adata.duration_fast=80;
adata.fps=30;
adata.buffer=new wxBitmap(500,500,32);
- adata.reuseBuffer=false;
- adata.buffer=nullptr;
+ adata.animate=false;
// Init game state
gs.is_black_turn=false;
gs.board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR";
@@ -41,7 +40,6 @@ BoardCanvas::BoardCanvas(wxFrame *parent)
Bind(wxEVT_KEY_DOWN, [p=this](wxKeyEvent &e){e.ResumePropagation(1);e.Skip();});
Bind(wxEVT_KEY_UP, [p=this](wxKeyEvent &e){e.ResumePropagation(1);e.Skip();});
Bind(wxEVT_PAINT, &BoardCanvas::OnPaint, this);
- Bind(wxEVT_SIZE, &BoardCanvas::OnResize, this);
// Mouse events:
Bind(wxEVT_MOTION, &BoardCanvas::MouseEvent, this);
Bind(wxEVT_LEFT_DOWN, &BoardCanvas::MouseEvent, this);
@@ -51,16 +49,6 @@ BoardCanvas::BoardCanvas(wxFrame *parent)
Bind(wxEVT_RIGHT_DCLICK, &BoardCanvas::MouseEvent, this);
}
-void BoardCanvas::OnResize(wxSizeEvent &e){
- wxSize size=e.GetSize();
- if(size.x>100 && size.y>100){
- // Setup buffer (use for animations)
- if(adata.buffer!=nullptr)
- free(adata.buffer);
- adata.buffer=new wxBitmap(size.x,size.y,32);
- }
-}
-
BoardCanvas::~BoardCanvas() {
delete t;
delete t_captures;
@@ -82,7 +70,7 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) {
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
- if(!adata.reuseBuffer){
+ if(!adata.animate){
// Setting up required attributes
REFRESH_MOUSE_LOCATION();
square_width = t->GetSquaresSizes();
@@ -94,14 +82,10 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) {
boardX = 0;
if (boardY > canvas_size.y)
boardY = 0;
- wxMemoryDC memDC(*adata.buffer);
- memDC.SetBackground(*wxWHITE_BRUSH);
- memDC.Clear();
- DrawBoard(memDC);
- dc.Blit(0,0,canvas_size.x,canvas_size.y,(wxDC*)&memDC,0,0);
+ DrawBoard(dc);
}
else {
- // Otherwise reuse buffer and animate
+ // Reuse buffer and animate
dc.DrawBitmap(*adata.buffer, 0, 0, true);
double percent=adata.frame/adata.frames;
// Draw moving piece
@@ -155,9 +139,17 @@ void BoardCanvas::Animate(const GameState &new_gs, const std::string &src, const
std::uint8_t prank = src[1]-'1';
adata.piece_moved = gs.board[pfile + 8 * (7-prank)]; // Piece to move
- // Now remove the piece that will be moved
+ // Now init adata.buffer and remove the piece that will be moved
gs.board[pfile + 8 * (7-prank)]=' ';
+ wxSize buffer_size=adata.buffer->GetSize();
+ if(canvas_size!=buffer_size){
+ wxLogDebug("Allocate a new animation buffer");
+ free(adata.buffer);
+ adata.buffer=new wxBitmap(canvas_size.x,canvas_size.y,32);
+ }
wxMemoryDC memDC(*adata.buffer);
+ memDC.SetBackground(*wxWHITE_BRUSH);
+ memDC.Clear();
DrawBoard(memDC);
// Now compute piece start position and translation vector
@@ -183,7 +175,7 @@ void BoardCanvas::Animate(const GameState &new_gs, const std::string &src, const
adata.transVect.y=y-adata.src.y+centrer_offset;
// Start animation:
- adata.reuseBuffer=true;
+ adata.animate=true;
int duration_backup=adata.duration;
adata.duration=faster ? adata.duration_fast : adata.duration;
int frame_duration=(1000/adata.fps);
@@ -201,7 +193,7 @@ void BoardCanvas::Animate(const GameState &new_gs, const std::string &src, const
sw.Start(0);
}
adata.duration=faster ? duration_backup : duration_backup;
- adata.reuseBuffer=false;
+ adata.animate=false;
SetupBoard(new_gs);
}
diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp
index 6ef2957..0576f1d 100644
--- a/src/game_tab/left_panel/board/BoardCanvas.hpp
+++ b/src/game_tab/left_panel/board/BoardCanvas.hpp
@@ -42,8 +42,8 @@ typedef std::tuple<short, short, short> ClockTime;
typedef struct AnimState {
/// @brief Temporary buffer to reduce latency
wxBitmap *buffer;
- /// @brief Should *buffer be used?
- bool reuseBuffer;
+ /// @brief Should animation be played on refresh?
+ bool animate;
/// @brief Current animated frame
int frame;
/// @brief Total number of frames for the animation