Allegro5 Проблемы с удалением текста и отображением нового после нажатия кнопки - PullRequest
0 голосов
/ 03 апреля 2020

Итак, я написал этот код, где, если я нажму клавишу ввода, он должен очистить страницу, а затем ввести новый текст с надписью «игра начинается». но он вообще не запускается и просто остается прежним, кто-нибудь знает, как это исправить?

PS. Дополнительный вопрос, как создать задержку после замены текста на 5 секунд, а затем очистить текст снова?

Спасибо!

#include <iostream>
#include<allegro5/allegro.h>
#include<allegro5/allegro_ttf.h>
#include<allegro5/allegro_font.h>

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>


int main()
{
    al_init();
    al_init_font_addon();
    al_init_ttf_addon();

    ALLEGRO_DISPLAY* display = al_create_display(640, 480);
    ALLEGRO_FONT* font = al_load_ttf_font("YARDSALE.ttf", 30, 0);
    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();

    al_install_keyboard();
    al_install_mouse();

    al_register_event_source(queue, al_get_keyboard_event_source());
    al_register_event_source(queue, al_get_mouse_event_source());
    bool done = false;

    while (!done) {
        al_clear_to_color(al_map_rgb(255, 255, 255));
        al_draw_text(font, al_map_rgb(139, 0, 0), 320, 150, ALLEGRO_ALIGN_CENTER, "Press Enter to start");
        al_draw_text(font, al_map_rgb(148, 0, 211), 320, 300, ALLEGRO_ALIGN_CENTER, "PRESS ESC TO QUIT");
        al_flip_display();

        ALLEGRO_EVENT event;
        al_wait_for_event(queue, &event);

        if (event.type == ALLEGRO_EVENT_KEY_UP)
        {
            switch (event.keyboard.keycode)
            {
            case ALLEGRO_KEY_ESCAPE:
                done = true;
                break;
            case ALLEGRO_KEY_ENTER:

                al_clear_to_color(al_map_rgb(255, 255, 255));
                al_draw_text(font, al_map_rgb(0, 255, 0), 300, 200, 0, "Game Starts");
                al_flip_display;

                break;

            }
        }
    }
    al_destroy_font(font);
    al_destroy_display(display);
}

1 Ответ

0 голосов
/ 09 апреля 2020

Вы просто пропустили "()", когда вызвали 'al_flip_display'. Это должно быть 'al_flip_display ();'. Но даже при этом он не будет работать так, как ожидалось, потому что «Начало игры» появится только на мгновение. Я предлагаю добавить игровые состояния. И я думаю, что в конце основной функции вы также должны уничтожить очередь событий.

#include<allegro5/allegro.h>
#include<allegro5/allegro_ttf.h>
#include<allegro5/allegro_font.h>

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>

enum class GAME_STATE { CLICK, INTRO, MAIN };

int main()
{
    al_init();
    al_init_font_addon();
    al_init_ttf_addon();

    ALLEGRO_DISPLAY* display = al_create_display(640, 480);
    ALLEGRO_FONT* font = al_load_ttf_font("font_code_pro.ttf", 30, 0);
    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
    ALLEGRO_TIMER* timer = al_create_timer(1 / 60.0);

    al_install_keyboard();
    al_install_mouse();

    al_register_event_source(queue, al_get_keyboard_event_source());
    al_register_event_source(queue, al_get_mouse_event_source());
    al_register_event_source(queue, al_get_timer_event_source(timer));
    bool done = false;
    bool draw = false;

    unsigned delay = 0;

    GAME_STATE state = GAME_STATE::CLICK;

    al_start_timer(timer);

    while(!done)
    {
        ALLEGRO_EVENT event;
        al_wait_for_event(queue, &event);

        if(event.type == ALLEGRO_EVENT_TIMER)
        {
            draw = true;

            if(state == GAME_STATE::INTRO && !((++delay) % (60 * 5)))state = GAME_STATE::MAIN;
        }

        if(event.type == ALLEGRO_EVENT_KEY_DOWN)
        {
            switch(event.keyboard.keycode)
            {
                case ALLEGRO_KEY_ESCAPE:
                    done = true;
                    break;
                case ALLEGRO_KEY_ENTER:
                    if(state == GAME_STATE::CLICK)
                        state = GAME_STATE::INTRO;
                    break;

            }
        }

        if(draw)
        {
            draw = false;
            switch(state)
            {
                case GAME_STATE::CLICK:
                    al_clear_to_color(al_map_rgb(255, 255, 255));
                    al_draw_text(font, al_map_rgb(139, 0, 0), 320, 150, ALLEGRO_ALIGN_CENTER, "Press Enter to start");
                    al_draw_text(font, al_map_rgb(148, 0, 211), 320, 300, ALLEGRO_ALIGN_CENTER, "PRESS ESC TO QUIT");
                    al_flip_display();
                    break;
                case GAME_STATE::INTRO:
                    al_clear_to_color(al_map_rgb(255, 255, 255));
                    al_draw_text(font, al_map_rgb(0, 255, 0), 300, 200, 0, "Game Starts");
                    al_flip_display();
                    break;
                case GAME_STATE::MAIN:
                    al_clear_to_color(al_map_rgb(255, 255, 255));
                    //
                    al_flip_display();
                    break;
                default:
                    break;
            }
        }
    }
    al_destroy_font(font);
    al_destroy_timer(timer);
    al_destroy_event_queue(queue);
    al_destroy_display(display);
}

Надеюсь, это поможет! :)

...