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