首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示文本的Allegro5不工作

显示文本的Allegro5不工作
EN

Stack Overflow用户
提问于 2014-12-07 21:10:35
回答 1查看 473关注 0票数 0

我有这样的问题:我想给你发个“你好!”在游戏开始前,靠近快板屏幕的中央。不知道为什么总是只有全窗口白色的颜色后,我编写的程序,而不是消息“你好!”我不知道为什么它不显示“你好!”但是如果我删除注释行//*之间的代码,程序就会显示消息"Hello!“井。有人能告诉我怎么解决这个问题吗?

代码语言:javascript
复制
#include<allegro5\allegro5.h>
#include<allegro5\allegro_native_dialog.h>
#include<allegro5\allegro_font.h>
#include<allegro5\allegro_ttf.h>
#include<allegro5\allegro_primitives.h>

#include<iostream>
using namespace std;
int main(){
    int ScreenWidth = 800, ScreenHeight = 600;

    if (!al_init())
    {
        al_show_native_message_box(NULL, NULL, NULL, "Could not initialize Allegro 5", NULL, NULL);
        return -1;
    }

    al_set_new_display_flags(ALLEGRO_WINDOWED);
    ALLEGRO_DISPLAY *display = al_create_display(ScreenWidth, ScreenHeight);//creating window with dimensions: 800:600 px
    al_set_window_position(display, 200, 100);//place from left top positioning the frame of display
    al_set_window_title(display, "Try to catch me!");

    if (!display)//show this message if sth wrong with display
    {
        al_show_native_message_box(display, "Sample Title", "Display Settings", "Display window was not created succesfully", NULL, ALLEGRO_MESSAGEBOX_ERROR);
        return -1;
    }

    al_init_font_addon();//initialization font addon
    al_init_ttf_addon();//initialization ttf(true type font) addon

    //INTRO
    ALLEGRO_FONT *fontOrbionBlack36 = al_load_font("fonts/Orbitron Black.ttf", 36, NULL);
    al_draw_text(fontOrbionBlack36, al_map_rgb(44, 117, 255), ScreenWidth / 2, ScreenHeight / 2, ALLEGRO_ALIGN_CENTRE, "Hello!" );
    al_rest(5.0);

    //********************************************************************************
    al_init_primitives_addon();
    al_install_keyboard();

    ALLEGRO_COLOR electricBlue = al_map_rgb(44, 117, 255);
    ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue();

    al_register_event_source(event_queue, al_get_keyboard_event_source());

    bool done = false;
    int x = 10, y = 10;
    int moveSpeed = 5;

    while (!done)
    {
        ALLEGRO_EVENT events;
        al_wait_for_event(event_queue, &events);
        if (events.type = ALLEGRO_EVENT_KEY_DOWN)
        {
            switch (events.keyboard.keycode)
            {
            case ALLEGRO_KEY_DOWN:
                y += moveSpeed;
                break;
            case ALLEGRO_KEY_UP:
                y -= moveSpeed;
                break;          
            case ALLEGRO_KEY_ESCAPE:
                done = true;
                break;
            }
        }
        al_draw_rectangle(x, y, x + 20, y + 20, electricBlue, 2.0);
        al_flip_display();
        al_clear_to_color(al_map_rgb(0, 0, 0));
    }
    //*****************************************************************************************

    al_flip_display();
    al_rest(10.0);//rest is very simmilar to Sleep() it is waitg function, waiting 3s then close the allegro display
    //al_destroy_font(fontOrbionBlack18);
    al_destroy_font(fontOrbionBlack36);
    al_destroy_display(display);//destroy the display at the end of the programm


    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-07 23:04:49

这里有几个问题妨碍你看课文。

  1. 您已经设置了一个“等待事件然后绘制”循环,这个循环通常与计时器的使用相关联,但是没有计时器。这意味着除非触发某种事件(例如,按键盘键),否则al_wait_for_event将无限期地停止,您的程序将永远无法到达对al_flip_display的调用。您可以阅读更多关于计时器这里的内容,但暂时您必须按下键盘键才能使该程序取得进展。
  2. 清除/绘制/翻转调用的顺序有点混乱。

在主循环中尝试这样的操作:

代码语言:javascript
复制
al_clear_to_color(al_map_rgb(0, 0, 0));`
al_draw_rectangle(x, y, x + 20, y + 20, electricBlue, 2.0);
al_draw_text(fontOrbionBlack36, al_map_rgb(44, 117, 255), ScreenWidth / 2, ScreenHeight / 2, ALLEGRO_ALIGN_CENTRE, "Hello!" );
al_flip_display();

换句话说,先弄清楚,然后画,然后翻转。当前您只绘制文本一次(在主循环之前)。这意味着,清除屏幕将清除文本--您需要在清除屏幕之后绘制文本的每一个帧,而翻转显示之前绘制文本。

如果你改变了这两件事,你应该能够看到文本后,按下键盘按钮。然而,还有一些其他的修改可能会有所帮助:

  1. 我会删除对al_rest的调用,除非它们具有有用的用途。目前,它们让您在启动主循环之前等待5秒(这意味着即使您按下一个键,也无法立即看到文本)。
  2. 没有理由在主循环退出后翻转显示,尽管我猜这是您先前的显示文本的实验遗留下来的。
  3. 在检查事件类型时,请使用events.type == ALLEGRO_EVENT_KEY_DOWN而不是events.type = ALLEGRO_EVENT_KEY_DOWN。目前,您实际上是将值ALLEGRO_EVENT_KEY_DOWN分配给events.type,覆盖它的原始值。您的编译器可能(而且可能应该)已经警告过您了。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27347883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档