Day04_新建一个HelloWorld对话框

今天,我们在欢迎首页的menu增加一个button,点击后弹出一个对话框窗口,显示 HelloWorld,效果如下:
在这里插入图片描述
要完成这个看起来很简单的小功能可没这么简单。这一篇文章,强烈建议大家动动手,对于掌握编译方法和熟悉项目的框架很有帮助,不过动手前,大家要有心理准备,可以先上一个洗手间、倒杯茶调整好心态,有任何问题欢迎评论区提出。

第一步,我们增加 菜单项目,名称为 HelloWorld

1、intro_gui.cpp , _nested_select_game_widgets[] 定义了菜单选项,我们在 Exit 退出按钮下面 增加一个Helloworld的button
在这里插入图片描述

2.~/OpenTTD/src/lang/english.txt 增加两行STRING定义,这里我们以英文为例,包括按钮的名称和悬浮的提示文字

按钮名称为 STR_INTRO_HELLOWORLD,
在这里插入图片描述

增加 悬浮提示 STR_INTRO_TOOLTIP_HELLOWORLD,这样鼠标悬浮在按钮上的时候,会显示 “Study how to create a windows box” 这一样提示
在这里插入图片描述

3、修改好这两个文件,到build目录下,make编译, ./openttd 启动游戏后,菜单项增加了这个按钮,但是点击这个按钮没有任何反应,我们还需要定义一个新的窗口
在这里插入图片描述

第二步、我们要创建新的窗口

1.~/OpenTTD/src/ 下面增加cpp和h 两个文件
首先,创建gui文件helloworld_gui.cpp

#include "stdafx.h"
#include "saveload/saveload.h"
#include "error.h"
#include "gui.h"
#include "gfx_func.h"
#include "command_func.h"
#include "network/network.h"
#include "network/network_content.h"
#include "strings_func.h"
#include "fileio_func.h"
#include "fios.h"
#include "helloworld.h" //tmpmod
#include "window_func.h"
#include "tilehighlight_func.h"
#include "querystring_gui.h"
#include "engine_func.h"
#include "landscape_type.h"
#include "date_func.h"
#include "core/geometry_func.hpp"
#include "gamelog.h"
#include "stringfilter_type.h"
#include "widgets/fios_widget.h"
#include "table/sprites.h"
#include "table/strings.h"
#include "safeguards.h"

static const NWidgetPart _nested_helloworld_dialog_widgets[] = {
    NWidget(NWID_HORIZONTAL),
        NWidget(WWT_CLOSEBOX, COLOUR_GREY),
        NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION),
        NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
    EndContainer(),
};

struct HelloworldWindow : public Window {
public:
    HelloworldWindow(WindowDesc *desc)
            : Window(desc)
    {
        this->CreateNestedTree(true);
        this->FinishInitNested(0);
        this->GetWidget<NWidgetCore>(WID_SL_CAPTION)->widget_data = STR_HELLOWORLD_CAPTION;
        ResetObjectToPlace();
    }

    virtual ~HelloworldWindow()
    {
    }
};

static WindowDesc _load_helloworld_desc(
    WDP_CENTER, "helloworld_game", 500, 294,
    WC_HELLOWORLD, WC_NONE,
    0,
    _nested_helloworld_dialog_widgets, lengthof(_nested_helloworld_dialog_widgets)
);

void ShowHelloworldDialog()
{
    DeleteWindowById(WC_HELLOWORLD, 0);
    WindowDesc *sld;
    sld = &_load_helloworld_desc;
    new HelloworldWindow(sld);
}

创建头文件helloworld.h

#ifndef HELLOWORLD_H
#define HELLOWORLD_H
void ShowHelloworldDialog();

#endif /* HELLOWORLD_H */

2、~/OpenTTD/src/CmakeLists.txt 增加 这两个文件定义,为编译做准备
在这里插入图片描述

3、intro_game.cpp OnClick()增加按钮的响应
在这里插入图片描述

4、window_type.h 新增 窗口类型 WC_HELLOWORLD
在这里插入图片描述

5、intro_widget.h 增加 按钮定义
在这里插入图片描述

6、准备就绪,因为新增了两个文件,所以我们要在 build目录下,运行 cmake … 重新生成文件::
在这里插入图片描述

启动界面,点击HelloWorld按钮,弹出 Hello World 对话框,成功!!大家可以尝试把游戏的语言修改为中文(温馨提示:变更前记得录屏记住操作的位置,否则可能会造成遗憾。)

在这里插入图片描述

通过今天的学习,我们可以了解到OpenTTD的gui框架和如何使用界面控件,下一次课程我们将进入游戏的本体部分,看看游戏界面上面的这些小精灵Sprite是怎么生成并显示到屏幕上的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值