【问题标题】:Allegro5 Problems with deleting a text and display a new one after pressing a buttonAllegro5 删除文本并在按下按钮后显示新文本的问题
【发布时间】:2020-07-15 15:56:47
【问题描述】:

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

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】:

    当您调用“al_flip_display”时,您只是错过了“()”。它应该是“al_flip_display();”。 但即使这样,它也不会按预期工作,因为“游戏开始”只会出现片刻。我建议添加游戏状态。 而且我认为在 main 函数的最后你还应该销毁事件队列。

    #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);
    }
    

    希望对你有帮助! :)

    【讨论】:

    • 非常感谢!我目前正在尝试使用 Allegro 制作一些简单的游戏,但真的很难找到它的资源或指南,因为它真的很老了。不知道如果我与您联系寻求指导会不会太麻烦?甚至可能不是快板。希望收到您的来信!
    • 我大约在一两年前开始学习 Allegro。我强烈推荐fixbyproximity.com/2d-game-development-coursefixbyproximity.com/oop-game-development。我都看过了。他们太棒了!当涉及到指导时,我会很高兴地帮助你。我们可以一起学习!知道我们可以如何或在哪里交流吗?
    • 那太棒了!你有什么偏好的平台吗?你可以选择,我会跟随。而且我实际上目前正在使用它进行游戏开发研究!
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 2010-11-27
    • 2020-08-28
    • 1970-01-01
    • 2022-08-14
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多