Gtkmm - Как отделить короткое и длинное нажатие клавиши - PullRequest
0 голосов
/ 26 апреля 2020

В настоящее время я работаю над компьютерной игрой в стиле 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(){}
} ;
...