
OpenTTD
文章平均质量分 76
十五天学习从零开发一款模拟经营类游戏,以OpenTTD这款开源项目为学习材料,学习如何开发一款2.5D的游戏,学习用c++语言开发跨windows/Linux/OSX平台游戏,学习Linux环境下的SDL2开发
舟翁
这个作者很懒,什么都没留下…
展开
-
Day15_城镇是怎么发展起来的
返回目录上一篇文章我们看了一下工厂的产量逻辑还是比较简单的,相关逻辑直接一个函数实现。今天我们看一下相对比较复杂的城镇发展逻辑。同样,我们也可以在官网https://wiki.openttd.org/en/Manual/Towns#town-growth 看一些Tips。1.公交车和火车运送乘客对城镇的发展影响效果一致;2.转运货物的火车站一样也可以得到发展;3.玩家可以通过捐赠新建筑在短期内迅速发展城镇;4.城市比乡镇发展速度快1倍;5.玩家必须确保城镇不被火车轨道,机场和水路包围;(这个好像原创 2021-11-22 15:26:34 · 1329 阅读 · 0 评论 -
Day14_工厂的产量是怎么发展的
返回目录openttd 工厂的发展基本逻辑是物流越发达,运货效率越高发展越快,没有交通接入的工厂发展缓慢,最后甚至从地图消失,我们从 OpenTTD | Game Mechanics 可以了解到工厂发展的算法逻辑,简单讲就是每个月会有一定概率改变产量,交通运输服务越好的工厂,变好的概率越高,交通运输服务越差的工厂,变坏的概率越高,工厂产量变化逻辑如下:1.每个月4.5%概率发生变化2.不同交通服务变化比例:poor- 33%增产 67%减产: good 67%增产 33%减少; excellent 8原创 2021-11-18 10:47:32 · 801 阅读 · 0 评论 -
Day13_交通工具是怎么移动起来的
首先,我们做一个有趣的实验,在viewport.cpp 的 AddSortableSpriteToDraw() 增加一行代码viewport.cpp Line659void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z,原创 2021-11-15 11:55:22 · 2793 阅读 · 0 评论 -
Day12_OpenTTD的页面刷新原理
返回目录每次我打开游戏看到菜单背景的时候,就惊叹于这个背景动画就像进入正式的游戏界面一般细致。研究源码后,我才知道原来这个背景动画真的就是一个游戏进度,我们只需要注释一行代码,就可以像下面一样拖动菜单的背景。window.cpp Line2787static void HandleAutoscroll(){ if (_game_mode == GM_MENU || HasModalProgress()) return; <=只需要注释这一行代码...普通的存档文件以.sav作为原创 2021-11-12 11:32:11 · 2324 阅读 · 0 评论 -
Day11_MapTiles是怎么绘制出来的
返回目录OpenTTD的界面通过viewport.cpp 实现,界面上由相对静止的网格Tile以及不断移动的交通工具vehicle组成,在Tile上可能是各种气候条件的陆地、海洋、工业设施、城镇等,交通工具则主要包括汽车、火车、轮船和飞机四大类。我们看一下网格Tile绘制的原理。viewport.cpp ViewportAddLandscape()是绘制Tile的关键,这个函数通过双重循环,先行row再列column 实现了各种气候地形和建筑物的绘制。viewport.cpp Line1164stat原创 2021-11-08 11:38:57 · 297 阅读 · 0 评论 -
Day10_Linux环境下的SDL2简介
返回目录20211104_Day10_Linux环境下的SDL2简介OpenTTD在Linux环境下通过SDL2来驱动显示,./openttd -d 2 启动后,我们可以看到以下日志,验证确实使用到 sdl ,大家可以试一下在windows环境下,启动命令行,看看下面的最后一行 video driver 后面显示的是什么内容。游戏启动阶段创建窗口调用链SDL_CreateWindow()<- sdl2_v.cpp VideoDriver_SDL_Base::CreateMainWindow原创 2021-11-04 09:57:02 · 830 阅读 · 0 评论 -
Day09_OpenTTD的Viewport介绍
返回目录OpenTTD的视觉系统2.5D形式展现,素材都是图片,通过屏幕贴图的方式生成界面元素,因此不能像真3D游戏那样在游戏过程中旋转视角,看到3D模型侧面或者背面的情况。这种2.5D的展示方式对显卡要求较低,大量使用在手机游戏里面,比如 王者荣耀、部落冲突、三国志策略版的界面,我们都能看到这种显示模式的身影。Openttd.cpp 代码量不大(行数 3000+),函数数量多(50+),其中对外服务函数26个,私有服务 27个。上层调用者主要包括 gui类、cmd类以及游戏初始化阶段的各种类,向下调用原创 2021-11-01 17:13:01 · 603 阅读 · 0 评论 -
Day08_OpenGfx源码分析
返回目录在 《Day05_OpenTTD的Sprite介绍》,我们学习了OpenTTD的资源文件以及加载内存的全过程,在ubuntu环境下,资源文件放在 ~/.openttd/baseset 目录下,我们把grf文件用16进制方式打开后,发现都是 00 00 47 52 46 82 0D 0A 1A 0A 开头,如下:通过 https://newgrf-specs.tt-wiki.net/wiki/Main_Page 的学习,我们了解到 OpenGfx使用nml进行数据压缩生成grf文件,然后压缩成原创 2021-10-28 09:34:18 · 1433 阅读 · 0 评论 -
Day07_Sprite是如何绘制到界面上的
返回目录前面的章节,我们讲述了Sprite加载的原理,最终是放到一个 SpriteCache这样一个数据结构里面。今天,我们继续看一下在loop里面,程序如何将这些Sprite绘制到界面上。首先 研究 SpriteCache.cpp ,在《Day05_OpenTTD的Sprite介绍》 我们了解到 游戏启动阶段,LoadNextSprite() 函数加载 SpriteCache的过程。在 spritecache.h 里面还定义了 GetRawSprite(),这个函数向外提供服务,通过SpriteI原创 2021-10-25 15:16:18 · 373 阅读 · 3 评论 -
Day06_自己动手编译OpenGFX库
返回目录OpenGFX是OpenTTD的资源库,Linux环境下,正式环境部署位置 ~/.openttd/baseset 目录下,编译后的文件扩展名 .grf 。游戏启动后,程序会搜索指定文件夹,将这些文件解码并加载到内存里面备用。$ git clone https://github.com/OpenTTD/OpenGFX从git拉取源代码后,直接 make 会报错 缺少 grfcodechttps://www.openttd.org/downloads/grfcodec-releases/l原创 2021-10-21 09:29:24 · 538 阅读 · 0 评论 -
Day05_OpenTTD的Sprite介绍
返回目录今天的内容终于要与游戏沾边了,sprite是游戏里面贴图的小组件,比如地形上面的每一个方块,草地、水面、道路、铁轨,以及在上面跑的汽车、火车,天上的飞机,都是属于sprite。OpenTTD里面在游戏启动阶段会扫描预设的磁盘路径,把扩展名 grf 的文件信息解密加载到内存cache里面,后面的贴图直接采用内存块拷贝的方式推送到显卡上面。我们使用 openttd -d 2 启动游戏,在主控上可以看到大量包含 Replacing sprites 关键字的信息,如下:通过这个关键字,我们可以检索原创 2021-10-18 17:08:31 · 686 阅读 · 0 评论 -
Day04_新建一个HelloWorld对话框
今天,我们在欢迎首页的menu增加一个button,点击后弹出一个对话框窗口,显示 HelloWorld,效果如下:要完成这个看起来很简单的小功能可没这么简单。这一篇文章,强烈建议大家动动手,对于掌握编译方法和熟悉项目的框架很有帮助,不过动手前,大家要有心理准备,可以先上一个洗手间、倒杯茶调整好心态,有任何问题欢迎评论区提出。第一步,我们增加 菜单项目,名称为 HelloWorld1、intro_gui.cpp , _nested_select_game_widgets[] 定义了菜单选项,我们在原创 2021-10-14 10:21:19 · 949 阅读 · 0 评论 -
Day03_OpenTTD源代码框架分析
返回目录首先,我们找程序的主入口,根据关键字 main( ,我们可以定位到 opentpp.cpp 的 openttd_main() 是程序的主入口。我这里整理了 openttd_main() 调用的思维导图如下,可以在文章最下面下载这个文件大致流程:1.解析命令行参数(与大部分的c和c++处理初始化变量的方法类似,值得学习);2.扫描指定路径获取文件列表(图形、音乐、音效、文字等);3.初始化 窗口(Linux环境下是通过SDL2的方法开启窗口;4.初始化Palettes(图片画板);原创 2021-10-11 17:20:37 · 1349 阅读 · 0 评论 -
十五天学习做一款模拟经营类游戏
Day01. OpenTTD游戏简介以及为什么要研究它 (计划2021.10.4推出)Day02. 搭建OpenTTD的编译环境-Linux、windows和OSX(计划2021.10.7推出)Day03. OpenTTD源代码框架分析(计划2021.10.11推出)Day04. 新建一个HelloWorld对话框(计划2021.10.14推出)Day05. OpenTTD的Sprite介绍(计划2021.10.18推出)Day06. 自己动手编译OpenGFX库(计划2021.10.21推出)原创 2021-10-09 13:56:20 · 1225 阅读 · 0 评论 -
Day02_搭建OpenTTD的编译环境-Linux
返回目录首先,我们配置一套舒服的源码阅读和编译环境。在这个介绍系列中,我们使用Visual Studio Code作为源码的阅读器,主要原因有两点:一、c++的函数调用查询(ctrl+鼠标左键) ;二、历史查询结点跳转(alt+键盘左右键) 。下载源代码地址:https://gitee.com/mirrors/OpenTTD使用VSC打开项目后,效果如下:编译环境 Ubuntu20.04 ,相比windows环境 openttd在Linux下的编译更加简便(windows环境下的vs201原创 2021-10-09 13:54:24 · 1311 阅读 · 0 评论 -
Day01_OpenTTD游戏简介以及为什么要研究它
OpenTTD是一款传奇的开源游戏项目,官网 openttd.org有它的详细介绍,他是基于1994年推出的交通大亨这款游戏改编而来,令人惊奇的是,经过近30年的社区热心群众发展,这个项目的生命力异常强韧,从最初存在大量bug和兼容性问题的小厂游戏,发展成一款跨平台、运行稳定性非常好的优秀游戏作品。游戏中,玩家扮演新成立的运输公司老板,通过建设铁路、公路、桥梁、机场、车站等设施,运输旅客、货物和各种自然资源的模拟经营游戏。游戏最终目标是通过运输赚取最大利润,经过残酷的竞争,最终打败对手,成为运输大亨。在国内原创 2021-10-09 13:48:23 · 1705 阅读 · 0 评论