mirror of
https://gitlab.com/manzerbredes/ochess.git
synced 2025-04-07 02:26:29 +02:00
Prepare for pieces animation
This commit is contained in:
parent
2151ccbe65
commit
c451c63aaa
3 changed files with 75 additions and 17 deletions
|
@ -58,6 +58,16 @@ void GameTabLeftPanel::OnPlay(wxCommandEvent &event) {
|
||||||
NotifyEditor();
|
NotifyEditor();
|
||||||
}
|
}
|
||||||
Notify();
|
Notify();
|
||||||
|
|
||||||
|
|
||||||
|
std::string fen = game->GetFen();
|
||||||
|
std::map<char, std::uint8_t> captures;
|
||||||
|
HalfMove *m = game->GetCurrentMove();
|
||||||
|
if (m != NULL) {
|
||||||
|
captures = m->GetLineCaptures();
|
||||||
|
}
|
||||||
|
/*board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board,
|
||||||
|
game->IsBlackToPlay(), captures,"a1","a2"); */
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameTabLeftPanel::Notify() {
|
void GameTabLeftPanel::Notify() {
|
||||||
|
@ -66,9 +76,10 @@ void GameTabLeftPanel::Notify() {
|
||||||
HalfMove *m = game->GetCurrentMove();
|
HalfMove *m = game->GetCurrentMove();
|
||||||
if (m != NULL) {
|
if (m != NULL) {
|
||||||
captures = m->GetLineCaptures();
|
captures = m->GetLineCaptures();
|
||||||
}
|
}
|
||||||
board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board,
|
board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board,
|
||||||
game->IsBlackToPlay(), captures);
|
game->IsBlackToPlay(), captures);
|
||||||
|
|
||||||
fen_text_field->SetValue(game->GetFen());
|
fen_text_field->SetValue(game->GetFen());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,20 @@ BoardCanvas::BoardCanvas(wxFrame *parent)
|
||||||
board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR";
|
board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR";
|
||||||
is_dragging = false;
|
is_dragging = false;
|
||||||
valid_drag = false;
|
valid_drag = false;
|
||||||
|
reuseBuffer=false;
|
||||||
t_captures->ResizePieces(t->GetPiecesSizes() * CAPTURE_FACTOR);
|
t_captures->ResizePieces(t->GetPiecesSizes() * CAPTURE_FACTOR);
|
||||||
SetClockTime(-1, -1, -1, false);
|
SetClockTime(-1, -1, -1, false);
|
||||||
SetClockTime(-1, -1, -1, true);
|
SetClockTime(-1, -1, -1, true);
|
||||||
ApplyPreferences();
|
ApplyPreferences();
|
||||||
// The following should be called when using an EVT_PAINT handler
|
// The following should be called when using an EVT_PAINT handler
|
||||||
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
|
timer.Bind(wxEVT_TIMER, &BoardCanvas::OnTimerTick, this);
|
||||||
|
duration=500;
|
||||||
|
fps=30;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoardCanvas::OnTimerTick(wxTimerEvent &event) {
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
BoardCanvas::~BoardCanvas() {
|
BoardCanvas::~BoardCanvas() {
|
||||||
|
@ -35,22 +43,35 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) {
|
||||||
dc.SetBackground(*wxWHITE_BRUSH);
|
dc.SetBackground(*wxWHITE_BRUSH);
|
||||||
dc.Clear();
|
dc.Clear();
|
||||||
|
|
||||||
// Setting up required attributes
|
if(!reuseBuffer){
|
||||||
REFRESH_MOUSE_LOCATION();
|
// Setting up required attributes
|
||||||
square_width = t->GetSquaresSizes();
|
REFRESH_MOUSE_LOCATION();
|
||||||
canvas_size = dc.GetSize();
|
square_width = t->GetSquaresSizes();
|
||||||
boardX = (canvas_size.x - (8 * square_width)) / 2;
|
canvas_size = dc.GetSize();
|
||||||
boardY = (canvas_size.y - (8 * square_width)) / 2;
|
boardX = (canvas_size.x - (8 * square_width)) / 2;
|
||||||
if (boardX > canvas_size.x)
|
boardY = (canvas_size.y - (8 * square_width)) / 2;
|
||||||
boardX = 0;
|
if (boardX > canvas_size.x)
|
||||||
if (boardY > canvas_size.y)
|
boardX = 0;
|
||||||
boardY = 0;
|
if (boardY > canvas_size.y)
|
||||||
|
boardY = 0;
|
||||||
|
|
||||||
// Setup buffer (later use for animations)
|
// Setup buffer (later use for animations)
|
||||||
buffer=new wxBitmap(canvas_size.x,canvas_size.y,32);
|
buffer=new wxBitmap(canvas_size.x,canvas_size.y,32);
|
||||||
wxMemoryDC memDC(*buffer);
|
wxMemoryDC memDC(*buffer);
|
||||||
DrawBoard(memDC);
|
DrawBoard(memDC);
|
||||||
dc.Blit(0,0,canvas_size.x,canvas_size.y,(wxDC*)&memDC,0,0);
|
dc.Blit(0,0,canvas_size.x,canvas_size.y,(wxDC*)&memDC,0,0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Otherwise reuse buffer and animate. TEST CODE FOR NOW:
|
||||||
|
dc.DrawBitmap(*buffer, 0, 0, true);
|
||||||
|
dc.DrawRectangle(wxRect(0+frame,0+frame,50,50));
|
||||||
|
frame++;
|
||||||
|
if(frame*fps>=duration){
|
||||||
|
timer.Stop();
|
||||||
|
reuseBuffer=false;
|
||||||
|
SetupBoard(final_board, final_is_black_turn, final_captures);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BoardCanvas::ApplyPreferences() {
|
void BoardCanvas::ApplyPreferences() {
|
||||||
|
@ -83,6 +104,22 @@ void BoardCanvas::SetupBoard(std::string board, bool is_black_turn,
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BoardCanvas::Animate(std::string board, bool is_black_turn, std::map<char, std::uint8_t> captures, std::string src, std::string dst){
|
||||||
|
this->final_board=board;
|
||||||
|
this->final_is_black_turn=is_black_turn;
|
||||||
|
this->final_captures=captures;
|
||||||
|
this->src=src;
|
||||||
|
this->dst=dst;
|
||||||
|
|
||||||
|
std::uint8_t pfile = src[0]-'a';
|
||||||
|
std::uint8_t prank = src[1]-'1';
|
||||||
|
char piece_moved = this->board[(7 - pfile) + 8 * (7-prank)]; // Piece to move
|
||||||
|
// Animate piece here
|
||||||
|
reuseBuffer=true;
|
||||||
|
frame=0;
|
||||||
|
timer.Start(1000/fps); // in ms;
|
||||||
|
}
|
||||||
|
|
||||||
void BoardCanvas::DrawBoard(wxDC &dc) {
|
void BoardCanvas::DrawBoard(wxDC &dc) {
|
||||||
std::uint32_t piece_width = t->GetPiecesSizes();
|
std::uint32_t piece_width = t->GetPiecesSizes();
|
||||||
std::uint32_t centrer_offset = (square_width - piece_width) / 2;
|
std::uint32_t centrer_offset = (square_width - piece_width) / 2;
|
||||||
|
|
|
@ -57,8 +57,16 @@ class BoardCanvas : public wxPanel {
|
||||||
ClockTime black_time, white_time;
|
ClockTime black_time, white_time;
|
||||||
bool frozen,lock_square_size;
|
bool frozen,lock_square_size;
|
||||||
|
|
||||||
// Drawing buffer
|
// Drawing buffer (ANIMATIONS)
|
||||||
wxBitmap *buffer;
|
wxBitmap *buffer;
|
||||||
|
bool reuseBuffer;
|
||||||
|
wxTimer timer;
|
||||||
|
int frame,duration,fps;
|
||||||
|
std::string final_board;
|
||||||
|
bool final_is_black_turn;
|
||||||
|
std::map<char, std::uint8_t> final_captures;
|
||||||
|
std::string src;
|
||||||
|
std::string dst;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BoardCanvas(wxFrame *parent);
|
BoardCanvas(wxFrame *parent);
|
||||||
|
@ -71,8 +79,10 @@ public:
|
||||||
void MouseEvent(wxMouseEvent &event);
|
void MouseEvent(wxMouseEvent &event);
|
||||||
void Zoom(std::int32_t zoom);
|
void Zoom(std::int32_t zoom);
|
||||||
void Swap();
|
void Swap();
|
||||||
|
void OnTimerTick(wxTimerEvent &event);
|
||||||
void SetupBoard(std::string board, bool is_black_turn,
|
void SetupBoard(std::string board, bool is_black_turn,
|
||||||
std::map<char, std::uint8_t> captures);
|
std::map<char, std::uint8_t> captures);
|
||||||
|
void Animate(std::string board, bool is_black_turn, std::map<char, std::uint8_t> captures, std::string src, std::string dst);
|
||||||
void SetClockTime(short hours, short min, short sec, bool IsBlack);
|
void SetClockTime(short hours, short min, short sec, bool IsBlack);
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue