PureDOOM

PureDOOM

轻量级DOOM源码移植 适配多种硬件平台

PureDOOM是一个轻量级的DOOM源码移植项目,专注于实现广泛的硬件兼容性。该项目使用纯C语言开发,不依赖外部库,能在多种设备上运行,包括嵌入式系统。主要特点有单头文件设计、支持32位和64位架构等。PureDOOM提供灵活的API接口,方便开发者集成视频、输入、音频和音乐功能,使DOOM能适配不同硬件环境。

DOOM源代码移植游戏开发单头文件跨平台Github开源项目

纯粹的DOOM

仅包含头文件,无依赖的DOOM源代码移植版。设计用于在任何设备上运行。

主要面向那些想要"在微波炉上运行DOOM"的人群。

许可证

许可证信息请见文件末尾。

主要特点:

  • 单个头文件
  • 纯C语言,无包含依赖:不需要stdlib、stdio等
  • 支持32位和64位

其他特点:

  • 菜单选项可禁用鼠标前进/后退
  • 准星选项
  • 始终奔跑选项

待办事项

  • 自定义分辨率
  • 移除exit并让update在退出时返回0。添加doom_get_exit_code()
  • 实现套接字和多人游戏

值得添加的功能

  • 可重新绑定的按键
  • 解锁帧率
  • 在菜单中释放鼠标并用于点击
  • 擦除屏幕时菜单冻结
  • 使用浮点数代替fixed_t
  • 法语和德语
  • 全彩色模式(不使用COLORMAPS,使用完整的24位RGB)

使用方法

调用doom_init(),然后每帧调用doom_update(),或者尽可能频繁地调用。这将运行DOOM,但不包括视频、输入、声音或音乐。

#define DOOM_IMPLEMENTATION #include "PureDOOM.h" int main(int argc, char** argv) { doom_init(argc, argv, 0); while (true) { doom_update(); } }

启用功能

大多数标准头文件在多数平台上都可用。定义这些预处理器来切换这些功能。

  • DOOM_IMPLEMENT_PRINT。允许printf,需要<stdio.h>
  • DOOM_IMPLEMENT_MALLOC。允许malloc/free,需要<stdlib.h>
  • DOOM_IMPLEMENT_FILE_IO。允许FILE,需要<stdio.h>
  • DOOM_IMPLEMENT_GETTIME。需要<sys/time.h><winsock.h>
  • DOOM_IMPLEMENT_EXIT。允许exit(),需要<stdlib.h>
  • DOOM_IMPLEMENT_GETENV。需要<stdlib.h>

如果你的微波炉没有这些头文件,你可以覆盖它们的默认实现:

void doom_set_print(doom_print_fn print_fn); void doom_set_malloc(doom_malloc_fn malloc_fn, doom_free_fn free_fn); void doom_set_file_io(doom_open_fn open_fn, doom_close_fn close_fn, doom_read_fn read_fn, doom_write_fn write_fn, doom_seek_fn seek_fn, doom_tell_fn tell_fn, doom_eof_fn eof_fn); void doom_set_gettime(doom_gettime_fn gettime_fn); void doom_set_exit(doom_exit_fn exit_fn); void doom_set_getenv(doom_getenv_fn getenv_fn);

视频

每一帧,在调用doom_update()之后,你可以通过doom_get_framebuffer获取屏幕像素,并按你的方式显示它。

while (true) { doom_update(); uint8_t* framebuffer = doom_get_framebuffer(4 /* RGBA */); // ... 显示帧缓冲 }

输入

当你从微波炉触摸板接收到输入事件时,只需调用其中一个DOOM输入事件:

void doom_key_down(doom_key_t key); void doom_key_up(doom_key_t key); void doom_button_down(doom_button_t button); void doom_button_up(doom_button_t button); void doom_mouse_move(int delta_x, int delta_y);

声音

创建一个以11025hz (DOOM_SAMPLERATE)输出的声音线程,512个样本,16位,立体声。然后在你的声音回调中,调用doom_get_sound_buffer来更新并获取当前DOOM的声音输出。如果你的声音循环在一个线程中,确保在这个函数和doom_update周围添加同步原语。

这里是一个使用SDL音频回调的简单例子:

void sdl_audio_callback(void* userdata, Uint8* stream, int len) { SDL_LockAudio(); int16_t* buffer = doom_get_sound_buffer(len); SDL_UnlockAudio(); memcpy(stream, buffer, len); }

你可以使用不同的比特率,但要确保重新采样,因为DOOM将始终是11025hz,512个样本,16位,2个通道。每个缓冲区总共2048字节。

音乐

在你的应用程序中设置一个以140hz运行的定时器。在定时器的回调中,只要还有MIDI消息要发送,就继续调用DOOM的音乐。

这里是一个使用Windows MultiMedia播放MIDI事件的例子,使用SDL定时器:

Uint32 tick_music(Uint32 interval, void *param) { uint32_t midi_msg; SDL_LockAudio(); while (midi_msg = doom_tick_midi()) midiOutShortMsg(midi_out_handle, midi_msg); SDL_UnlockAudio(); return 1000 / DOOM_MIDI_RATE /* 140 */; }

更改默认设置

DOOM源代码中的默认输入设置不是现代的。它使用方向键移动,用',''.'进行平移。你可以调用doom_set_default_intdoom_set_default_str来更改它们:

// 将默认绑定更改为现代映射 doom_set_default_int("key_up", DOOM_KEY_W); doom_set_default_int("key_down", DOOM_KEY_S); doom_set_default_int("key_strafeleft", DOOM_KEY_A); doom_set_default_int("key_straferight", DOOM_KEY_D); doom_set_default_int("key_use", DOOM_KEY_E); doom_set_default_int("mouse_move", 0); // 鼠标将不会前进

完整列表请参考m_misc.cpp中的默认值。

可用的SDL示例

完整的SDL示例请参见src/sdl_example.c文件。

DOOM许可证

      有限使用软件许可协议

        本有限使用软件许可协议(以下简称"协议")是您(最终用户)与Id Software, Inc.(以下简称"ID")之间的法律协议。通过下载或购买包括源代码(以下简称"源代码")、艺术数据、音乐和软件工具(统称为"软件")在内的软件材料,您同意受本协议条款的约束。如果您不同意本协议的条款,请立即销毁您可能已下载或复制的软件。

ID软件许可证
1. 许可授予。ID授予您使用软件的权利。您对软件或商标不拥有任何所有权或专有权。就本节而言,"使用"指将软件加载到RAM中,以及安装在硬盘或其他存储设备上。当不再按照本协议使用软件或使用软件的权利终止时,应销毁软件及其任何存档副本。您同意不会违反美国出口管理法(或任何其他管理此类事务的法律)将软件运输、转让或出口到任何国家,且不会以任何其他方式违反任何适用法律使用软件。

2. 允许的用途。仅出于教育目的,您作为最终用户可以使用源代码的部分内容(如特定例程)来开发自己的软件,但不得复制源代码,除第4段所述情况外。前句中提到的有限权利在下文中称为"教育用途"。通过行使教育用途权利,您不会获得对源代码或其任何部分的任何所有权、版权、专有权或其他权益。您可以自行处置您自己的软件。除教育用途权利外,您不得将软件或包含源代码的任何部分用于商业利益。

3. 禁止的用途:在任何情况下,您作为最终用户都不得被允许或授权对软件进行商业开发。您或任何在您指示下行事的人不得对软件或其任何部分进行以下行为:

   出租;
   销售;
   租赁;
   按次付费提供;
   为金钱或任何其他对价进行分发;或
   以任何其他方式和通过任何媒介进行商业开发或用于任何商业目的。

尽管有上述禁止规定,您可以通过行使第2段中提到的教育用途权利来商业开发您所开发的软件。

4. 版权。软件和与之相关的所有版权(包括软件生成或描绘的所有角色和其他图像)均为ID所有,受美国版权法和国际条约条款的保护。ID应保留对软件及其所有部分的专有所有权和版权,您对这些材料不拥有任何所有权或其他专有权益。您必须像对待任何其他受版权保护的材料一样对待软件。您不得以其他方式全部或部分复制、拷贝或向他人披露软件。您不得复制软件附带的书面材料。您同意尽最大努力确保本协议许可下的任何软件用户遵守本协议。

5. 无保证。ID否认所有明示和暗示的保证,包括但不限于对软件的适销性和特定用途适用性的暗示保证。本有限保证赋予您特定的法律权利。您可能拥有因司法管辖区不同而异的其他权利。ID不保证软件的运行将不中断、无错误或满足您的特定要求。上述保证代替所有其他口头或书面的明示保证。ID的代理人、员工、分销商和经销商无权对本保证进行修改,或代表ID提供额外保证。

   专有补救。软件是免费向您提供的。您同意,对于由软件的任何缺陷或故障造成的损失或损害,无论是基于合同、侵权(包括疏忽)、严格责任还是其他形式的诉讼,您都不得对ID及其附属公司、承包商、供应商和代理人提出任何索赔。本协议应根据德克萨斯州法律解释和管辖。版权和其他专有事项将受美国法律和国际条约管辖。在任何情况下,ID均不对因违反保证、违约、疏忽或其他法律理论而引起的数据丢失、利润损失、节省损失、特殊、附带、后果性、间接或其他类似损害承担责任,即使ID或其代理人已被告知此类损害的可能性,也不对任何其他方的任何索赔承担责任。某些司法管辖区不允许排除或限制附带或后果性损害,因此上述限制或排除可能不适用于您。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多