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

仅包含头文件,无依赖的DOOM源代码移植版。设计用于在任何设备上运行。
主要面向那些想要"在微波炉上运行DOOM"的人群。
许可证信息请见文件末尾。
调用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_int和doom_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示例请参见src/sdl_example.c文件。
有限使用软件许可协议
本有限使用软件许可协议(以下简称"协议")是您(最终用户)与Id Software, Inc.(以下简称"ID")之间的法律协议。通过下载或购买包括源代码(以下简称"源代码")、艺术数据、音乐和软件工具(统称为"软件")在内的软件材料,您同意受本协议条款的约束。如果您不同意本协议的条款,请立即销毁您可能已下载或复制的软件。
ID软件许可证
1. 许可授予。ID授予您使用软件的权利。您对软件或商标不拥有任何所有权或专有权。就本节而言,"使用"指将软件加载到RAM中,以及安装在硬盘或其他存储设备上。当不再按照本协议使用软件或使用软件的权利终止时,应销毁软件及其任何存档副本。您同意不会违反美国出口管理法(或任何其他管理此类事务的法律)将软件运输、转让或出口到任何国家,且不会以任何其他方式违反任何适用法律使用软件。
2. 允许的用途。仅出于教育目的,您作为最终用户可以使用源代码的部分内容(如特定例程)来开发自己的软件,但不得复制源代码,除第4段所述情况外。前句中提到的有限权利在下文中称为"教育用途"。通过行使教育用途权利,您不会获得对源代码或其任何部分的任何所有权、版权、专有权或其他权益。您可以自行处置您自己的软件。除教育用途权利外,您不得将软件或包含源代码的任何部分用于商业利益。
3. 禁止的用途:在任何情况下,您作为最终用户都不得被允许或授权对软件进行商业开发。您或任何在您指示下行事的人不得对软件或其任何部分进行以下行为:
出租;
销售;
租赁;
按次付费提供;
为金钱或任何其他对价进行分发;或
以任何其他方式和通过任何媒介进行商业开发或用于任何商业目的。
尽管有上述禁止规定,您可以通过行使第2段中提到的教育用途权利来商业开发您所开发的软件。
4. 版权。软件和与之相关的所有版权(包括软件生成或描绘的所有角色和其他图像)均为ID所有,受美国版权法和国际条约条款的保护。ID应保留对软件及其所有部分的专有所有权和版权,您对这些材料不拥有任何所有权或其他专有权益。您必须像对待任何其他受版权保护的材料一样对待软件。您不得以其他方式全部或部分复制、拷贝或向他人披露软件。您不得复制软件附带的书面材料。您同意尽最大努力确保本协议许可下的任何软件用户遵守本协议。
5. 无保证。ID否认所有明示和暗示的保证,包括但不限于对软件的适销性和特定用途适用性的暗示保证。本有限保证赋予您特定的法律权利。您可能拥有因司法管辖区不同而异的其他权利。ID不保证软件的运行将不中断、无错误或满足您的特定要求。上述保证代替所有其他口头或书面的明示保证。ID的代理人、员工、分销商和经销商无权对本保证进行修改,或代表ID提供额外保证。
专有补救。软件是免费向您提供的。您同意,对于由软件的任何缺陷或故障造成的损失或损害,无论是基于合同、侵权(包括疏忽)、严格责任还是其他形式的诉讼,您都不得对ID及其附属公司、承包商、供应商和代理人提出任何索赔。本协议应根据德克萨斯州法律解释和管辖。版权和其他专有事项将受美国法律和国际条约管辖。在任何情况下,ID均不对因违反保证、违约、疏忽或其他法律理论而引起的数据丢失、利润损失、节省损失、特殊、附带、后果性、间接或其他类似损害承担责任,即使ID或其代理人已被告知此类损害的可能性,也不对任何其他方的任何索赔承担责任。某些司法管辖区不允许排除或限制附带或后果性损害,因此上述限制或排除可能不适用于您。


职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


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


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生 成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号