轻量级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辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。
像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。
AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。
一站式AI创作平台
提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作
AI办公助手,复杂任务高效处理
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。