使用Allegro 5.0.2获取操纵杆输入

时间:2011-06-05 05:16:13

标签: c++ visual-studio-2010 allegro5

我是Allegro 5的新手,到目前为止,我已经用一些教程编写了一些代码,但我无法获得操纵杆输入。

这里是代码,它只是两个垂直移动的条形(和一个非常懒惰的方法,只是在第二个条上交换x和y坐标)。

#pragma comment (lib,"allegro-5.0.2-monolith-md-debug.lib")
#include <stdio.h>
#include <string>
#include <iostream>
#include <allegro5/allegro.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>

#define FPS 0xFF
#define SCREEN_W 1000
#define SCREEN_H 750
#define BAR_W 75
#define BAR_H 10

enum KEYS
{
    KEY_LEFT, KEY_RIGHT
};

int main(int argc, char **argv)
{
    ALLEGRO_DISPLAY *display = NULL;
    ALLEGRO_EVENT_QUEUE *event_queue = NULL;
    ALLEGRO_JOYSTICK *joystick = NULL;
    ALLEGRO_TIMER *timer = NULL;
    ALLEGRO_BITMAP *bouncer = NULL;
    float bouncer_x = SCREEN_W / 2.0 - BAR_W / 2.0;
    float bouncer_y = SCREEN_H - BAR_H;
    bool key[2] = {false, false};
    bool redraw = true;
    bool doexit = false;

    if(!al_init())
    {
        fprintf(stderr, "failed to initialize allegro!\n");
        return -1;
    }

    if(!al_install_keyboard())
    {
        fprintf(stderr, "failed to initialize the keyboard!\n");
        return -1;
    }

    if(!al_install_joystick())
    {
        fprintf(stderr, "failed to initialize the joystick!\n");
    }
    al_reconfigure_joysticks();
    joystick=al_get_joystick(al_get_num_joysticks()-1);

    timer = al_create_timer(1.0 / FPS);
    if(!timer)
    {
        fprintf(stderr, "failed to create timer!\n");
        return -1;
    }

    display = al_create_display(SCREEN_W, SCREEN_H);
    if(!display)
    {
        fprintf(stderr, "failed to create display!\n");
        al_destroy_timer(timer);
        return -1;
    }

    bouncer = al_create_bitmap(BAR_W, BAR_H);
    if(!bouncer)
    {
        fprintf(stderr, "failed to create bouncer bitmap!\n");
        al_destroy_display(display);
        al_destroy_timer(timer);
        return -1;
    }

    al_set_target_bitmap(bouncer);
    al_clear_to_color(al_map_rgb(0, 0, 255));
    al_set_target_bitmap(al_get_backbuffer(display));

    event_queue = al_create_event_queue();
    if(!event_queue)
    {
        fprintf(stderr, "failed to create event_queue!\n");
        al_destroy_bitmap(bouncer);
        al_destroy_display(display);
        al_destroy_timer(timer);
        return -1;
    }

    al_register_event_source(event_queue, al_get_display_event_source(display));
    al_register_event_source(event_queue, al_get_timer_event_source(timer));
    al_register_event_source(event_queue, al_get_keyboard_event_source());
    al_register_event_source(event_queue, al_get_joystick_event_source());
    al_clear_to_color(al_map_rgb(0,0,0));

    al_flip_display();
    al_start_timer(timer);

    while(!doexit)
    {
        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue, &ev);


        if(ev.type == ALLEGRO_EVENT_TIMER)
        {

            if(key[KEY_LEFT] && bouncer_x >= 2.0)
                bouncer_x -= 2.0;

            if(key[KEY_RIGHT] && bouncer_x <= SCREEN_W - BAR_W - 2.0)
                bouncer_x += 2.0;

            redraw = true;
        }

        else if(ev.type == ALLEGRO_EVENT_JOYSTICK_AXIS
                && ev.joystick.stick == 0
                && ev.joystick.axis == 0)
        {        
            float joypos=ev.joystick.pos;

            if(joypos<0 && bouncer_x >= 2.0)
                bouncer_x-=joypos;

            if(joypos>0 && bouncer_x <= SCREEN_W - BAR_W - 2.0)
                bouncer_x+=joypos;

            if(joypos=0)
                bouncer_x=SCREEN_W/2;
        }

        else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
            break;

        else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
        {
            switch(ev.keyboard.keycode)
            {
            case ALLEGRO_KEY_LEFT:
                key[KEY_LEFT] = true;
                break;

            case ALLEGRO_KEY_RIGHT:
                key[KEY_RIGHT] = true;
                break;
            }
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_UP)
        {
            switch(ev.keyboard.keycode)
            {
            case ALLEGRO_KEY_LEFT: 
                key[KEY_LEFT] = false;
                break;

            case ALLEGRO_KEY_RIGHT:
                key[KEY_RIGHT] = false;
                break;

            case ALLEGRO_KEY_ESCAPE:
                doexit = true;
                break;
            }
        }

        if(redraw && al_is_event_queue_empty(event_queue))
        {
            std::string str=al_get_joystick_name(joystick);
            redraw = false;

            al_clear_to_color(al_map_rgb(0,0,0));

            al_draw_bitmap(bouncer, bouncer_x, bouncer_y, 0);
            al_draw_bitmap(bouncer, bouncer_y, bouncer_x, 0);

            std::cout << ev.joystick.pos << " ";
            std::cout << str << " ";
            std::cout << al_get_joystick_active(joystick) << std::endl;

            al_flip_display();
        }
    }

    al_destroy_bitmap(bouncer);
    al_destroy_timer(timer);
    al_destroy_display(display);
    al_destroy_event_queue(event_queue);

    return 0;
}

现在,麻烦:ev.joystick.pos有一个相对静态的值(通过MSVC2010调试器查看),无论我的操纵杆的所有轴都在最大位置。

另外,我不知道如何获得特定棒的特定轴的值。只有当特定的轴和杆发生变化时,我才设法让杆移动,而不是“变化多少”。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我看不出你做错了什么,但我让控制器在我的游戏中运行,所以也许我的代码会有所了解。顺便说一下,我正在使用Xbox 360控制器。实际上,我使用的是GameStop品牌360控制器,所以它在技术上并不官方。无论如何,这是我的相关代码(完整的源代码是怪物):

    if(ev.type == ALLEGRO_EVENT_JOYSTICK_AXIS){
        if(ev.type == ALLEGRO_EVENT_JOYSTICK_AXIS){
        if(ev.joystick.stick == 0){ //float joys[3][2]
            joys[ev.joystick.stick][ev.joystick.axis] = ev.joystick.pos;
        }
     }


    void SetPosition(){

    int leftStick = 0;
    int rightStick = 1;
    int dPad = 2;

    int x = 0;
    int y = 1;
    int z = 2;

    bitmapX += joys[leftStick][x];
    bitmapY += joys[leftStick][y];
    }