Restore Game App

This commit is contained in:
daleclack 2024-02-10 21:05:39 +08:00
parent 1f0e4ebd7a
commit ef7d728eac
3 changed files with 83 additions and 87 deletions

View File

@ -1,23 +0,0 @@
#pragma once
#include <gtkmm.h>
class Game : public Gtk::Window{
public:
Game(BaseObjectType *cobject,Glib::RefPtr<Gtk::Builder> &tmp_builder);
static Game * create();
private:
//The main builder
Glib::RefPtr<Gtk::Builder> game_builder;
//Child Widgets
Gtk::Window *game_window;
Gtk::Button *win_close,*win_mini;
Gtk::Button *game_btn[4],*btngo,*btnexit;
Gtk::Label *game_label;
int game_index[4];
//Signal Handlers
void gamebtn_clicked(int *index);
void btngo_clicked();
void btnexit_clicked();
void win_closed();
};

View File

@ -1,63 +0,0 @@
#include "Game.hh"
#include <ctime>
#include <cstdlib>
#include <cstdio>
Game::Game(BaseObjectType *cobject,Glib::RefPtr<Gtk::Builder> &tmp_builder)
:Gtk::Window(cobject),
game_builder(tmp_builder),
game_index{0,1,2,3}
{
//Ininalize Window
set_icon_name("game");
game_builder->get_widget("window",game_window);
game_builder->get_widget("btn_exit",btnexit);
game_builder->get_widget("btn_go",btngo);
game_builder->get_widget("label",game_label);
for(int i=0;i<4;i++){
char str[6];
sprintf(str,"btn_%d",i+1);
game_builder->get_widget(str,game_btn[i]);
game_btn[i]->signal_clicked().connect(sigc::bind(
sigc::mem_fun(*this,&Game::gamebtn_clicked),&game_index[i]));
}
//Link Signals
btngo->signal_clicked().connect(sigc::mem_fun(*this,&Game::btngo_clicked));
btnexit->signal_clicked().connect(sigc::mem_fun(*this,&Game::hide));
}
void Game::gamebtn_clicked(int *index){
//Get Current button
int flag;
srand((unsigned)time(NULL));
flag=rand()%4;
game_btn[flag]->set_image_from_icon_name("My_GtkUI",Gtk::ICON_SIZE_DIALOG);
if(*index==flag){
game_label->set_label("Good Luck!");
}else{
game_label->set_label("The Button is here!");
}
//Disable Buttons
for(int i=0;i<4;i++){
game_btn[i]->set_sensitive(false);
}
}
void Game::btngo_clicked(){
//Clean Icons showed in button and enable buttons
for(int i=0;i<4;i++){
game_btn[i]->set_image_from_icon_name("");
game_btn[i]->set_sensitive();
}
game_label->set_label("Select a button");
}
Game * Game::create(){
// Load the Builder file and instantiate its widgets.
auto builder = Gtk::Builder::create_from_resource("/org/gtk/daleclack/game1.ui");
Game * window = nullptr;
builder->get_widget_derived("window",window);
return window;
}

View File

@ -1,4 +1,6 @@
#include "GameApp.h"
#include <cstdlib>
#include <ctime>
struct _GameApp
{
@ -10,15 +12,95 @@ struct _GameApp
G_DEFINE_TYPE(GameApp, game_app, GTK_TYPE_WINDOW)
static void btns_clicked(GtkButton *widget, GameApp *self)
{
// Get random index
srand(time(NULL));
int index = (rand() % 4) + 1;
// Get Button index
const char *button_label = gtk_button_get_label(widget);
// Create image widget
GtkWidget *image1 = gtk_image_new();
gtk_image_set_pixel_size(GTK_IMAGE(image1), 48);
gtk_image_set_from_icon_name(GTK_IMAGE(image1), "My_GtkUI");
// Check button index and set icon
switch (index)
{
case 1:
gtk_button_set_child(GTK_BUTTON(self->btn_1), image1);
break;
case 2:
gtk_button_set_child(GTK_BUTTON(self->btn_2), image1);
break;
case 3:
gtk_button_set_child(GTK_BUTTON(self->btn_3), image1);
break;
case 4:
gtk_button_set_child(GTK_BUTTON(self->btn_4), image1);
break;
}
// Set Label
if (index == (int)(button_label[0] - 48))
{
gtk_label_set_label(GTK_LABEL(self->label), "Good Luck!");
}
else
{
gtk_label_set_label(GTK_LABEL(self->label), "The Button is here!");
}
}
static void btngo_clicked(GtkWidget *widget, GameApp *self)
{
// Initalize label and btns
gtk_label_set_label(GTK_LABEL(self->label), "Select a button");
gtk_button_set_label(GTK_BUTTON(self->btn_1), "1");
gtk_button_set_label(GTK_BUTTON(self->btn_2), "2");
gtk_button_set_label(GTK_BUTTON(self->btn_3), "3");
gtk_button_set_label(GTK_BUTTON(self->btn_4), "4");
}
static void btnexit_clicked(GtkWidget *widget, GameApp *self)
{
// Close the game
gtk_window_close(GTK_WINDOW(self));
}
static void game_app_dispose(GObject *object)
{
// Destructer
gtk_widget_dispose_template(GTK_WIDGET(object), game_app_get_type());
G_OBJECT_CLASS(game_app_parent_class)->dispose(object);
}
static void game_app_init(GameApp *self)
{
// Initalize template
gtk_widget_init_template(GTK_WIDGET(self));
// Link Signals
g_signal_connect(self->btn_1, "clicked", G_CALLBACK(btns_clicked), self);
g_signal_connect(self->btn_2, "clicked", G_CALLBACK(btns_clicked), self);
g_signal_connect(self->btn_3, "clicked", G_CALLBACK(btns_clicked), self);
g_signal_connect(self->btn_4, "clicked", G_CALLBACK(btns_clicked), self);
g_signal_connect(self->btn_go, "clicked", G_CALLBACK(btngo_clicked), self);
g_signal_connect(self->btn_exit, "clicked", G_CALLBACK(btnexit_clicked), self);
}
static void game_app_class_init(GameAppClass *klass)
{
// Set dispose signal for the window
G_OBJECT_CLASS(klass)->dispose = game_app_dispose;
// Set template
gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS(klass),
"/org/gtk/daleclack/game1.ui");
// Get widget from template
gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass), GameApp, label);
gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass), GameApp, btn_1);
gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(klass), GameApp, btn_2);
@ -31,4 +113,4 @@ static void game_app_class_init(GameAppClass *klass)
GameApp *game_app_new()
{
return GAME_APP(g_object_new(game_app_get_type(), NULL));
}
}