В настоящее время я работаю над компьютерной игрой в стиле escape-игры, в которой мне разрешено использовать только Gtkmm.
Моя идея заключается в том, чтобы управлять персонажем и иметь возможность перемещать его с помощью клавиш со стрелками.
Эта часть работает, но я бы хотел, чтобы символ нажимал короткое нажатие клавиши и шел в нужном направлении длинным нажатием клавиши (что-то вроде системы ходьбы в играх покемонов GBA). Я хотел бы сделать это, потому что в будущем я хотел бы, чтобы персонаж мог запускать действия, когда он находится рядом с конкретным c местом и обращен в правильном направлении.
Есть ли способ Я мог бы сделать это?
Мой текущий код ниже:
#pragma once
#include <gtkmm.h>
#include <gtkmm/fixed.h>
#include <unistd.h>
#include <glibmm/main.h>
#include <gdkmm/pixbufanimation.h>
enum Direction {
haut,
bas,
gauche,
droite
};
class Personnage : public Gtk::Window {
private :
Gtk::Image img_;
Gtk::Image imgFond_;
Gtk::Fixed *fix_fenetre_;
int d_dimension_;
double x_, y_;
Direction orientation_;
Glib::RefPtr<Gdk::PixbufAnimation> anim_haut_;
Glib::RefPtr<Gdk::PixbufAnimation> anim_bas_;
Glib::RefPtr<Gdk::PixbufAnimation> anim_gauche_;
Glib::RefPtr<Gdk::PixbufAnimation> anim_droite_;
public :
Personnage() : x_(1), y_(1), d_dimension_(35)
{ // fenetre
set_default_size(5*d_dimension_, 5*d_dimension_);
set_resizable(false);
set_title("Test");
fix_fenetre_ = new Gtk::Fixed;
add(*fix_fenetre_);
fix_fenetre_->show();
// image
imgFond_.set("fond_test.png");
fix_fenetre_ -> put(imgFond_, 0, 0);
anim_haut_ = Gdk::PixbufAnimation::create_from_file("animation/35x35/haut.gif");
anim_bas_ = Gdk::PixbufAnimation::create_from_file("animation/35x35/bas.gif");
anim_droite_ = Gdk::PixbufAnimation::create_from_file("animation/35x35/droite.gif");
anim_gauche_ = Gdk::PixbufAnimation::create_from_file("animation/35x35/gauche.gif");
img_.set(anim_bas_);
fix_fenetre_ -> put(img_, d_dimension_, d_dimension_);
orientation_ = bas;
add_events(Gdk::KEY_PRESS_MASK);
show_all_children();
}
bool on_key_press_event(GdkEventKey* key_event) override{
// vers le haut
if(key_event->keyval == GDK_KEY_Up){
this -> img_.set(this -> anim_haut_);
this -> orientation_ = haut;
if(this -> y_ > 0){
this -> y_ = this -> y_ - 1;
this -> fix_fenetre_ -> move(img_, d_dimension_*this -> x_, d_dimension_*this -> y_);
}
}
// vers le bas
else if(key_event->keyval == GDK_KEY_Down){
this -> img_.set(this -> anim_bas_);
this -> orientation_ = bas;
if(this -> y_ < 5){
this -> y_ = this -> y_ + 1;
this -> fix_fenetre_ -> move(img_, d_dimension_*this -> x_, d_dimension_*this -> y_);
}
}
// vers la gauche
else if(key_event->keyval == GDK_KEY_Left){
this -> img_.set(this -> anim_gauche_);
this -> orientation_ = gauche;
if(this -> x_ > 0){
this -> x_ = this -> x_ - 1;
this -> fix_fenetre_ -> move(img_, d_dimension_*this -> x_, d_dimension_*this -> y_);
}
}
// vers la droite
else if(key_event->keyval == GDK_KEY_Right){
this -> img_.set(this -> anim_droite_);
this -> orientation_ = droite;
if(this -> x_ < 5){
this -> x_ = this -> x_ + 1;
this -> fix_fenetre_ -> move(img_, d_dimension_*this -> x_, d_dimension_*this -> y_);
}
}
else if(key_event->keyval == GDK_KEY_Escape){
//close the window, when the 'esc' key is pressed
hide();
return true;
}
return Gtk::Window::on_key_press_event(key_event);
}
~Personnage(){}
} ;