Project Icon

PureDOOM

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

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

纯粹的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或其代理人已被告知此类损害的可能性,也不对任何其他方的任何索赔承担责任。某些司法管辖区不允许排除或限制附带或后果性损害,因此上述限制或排除可能不适用于您。
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

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

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号