Allegro5按下按钮后删除文本并显示新文本的问题

问题描述 投票:0回答:1

所以我写了这段代码,如果我按Enter键,它应该清除页面,然后输入一个新的文本,表示“游戏开始”。但它根本不会运行,只会保持不变,有人知道如何解决此问题吗?

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);
}
c++ allegro5
1个回答
0
投票

[当您调用'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);
}

我希望它会有所帮助! :)

© www.soinside.com 2019 - 2024. All rights reserved.