
Amazonãä»äºã«ä»»ããŠããã°ããããœãŒã¹ã³ãŒããèªãã®ã«å€ãã®æéãè²»ãããŸããã
ä¿¡ããããªãã»ã© çŽ æŽããã idSoftware ã³ãŒã ãæ±ã£ ãã®ã§ ãç§ã¯
å²äžæé«ã®ã²ãŒã ã® 1ã€ãDuke Nukem 3Dãšã
Build ããšåŒã°ãããã®ãšã³ãžã³ã«ã€ããŠèšå®ããŸããã
ãšã³ãžã³èªäœã¯éåžžã«éèŠã§ããããã®é床ãå®å®æ§ãã¡ã¢ãªæ¶è²»éã§é«ãè©äŸ¡ãããŠããŸãããç§ã®ç±æã¯ãœãŒã¹ã³ãŒãã«åºããããŸãããããã¯ã秩åºãæšå¥šäºé
ãã³ã¡ã³ã/ããã¥ã¡ã³ãã®é å®ãšããç¹ã§ççŸããŠããŸããã ã³ãŒããèªãã§ããéãç§ã¯ã¬ã¬ã·ãŒã³ãŒããšãœãããŠã§ã¢ãé·çãã§ããããã«ãããã®ã«ã€ããŠå€ããåŠã³ãŸããã
ãã€ãã®ããã«
ãã¡ã¢ãèšäºã«æžãçŽããŸããã 圌女ãããªãã«ãœãŒã¹ã³ãŒããèªãã§ããªãã®ã¹ãã«ãåäžãããŠãããããšãé¡ã£ãŠããŸãã
ãã®èšäºãæ ¡æ£ããŠããã
Ken Silvermanã«æè¬ããããç§ã®æçŽã«å¯Ÿãã圌ã®å¿èãšè¯å¿çãªçãã¯ç§ã«ãšã£ãŠéèŠã ã£ãã
èµ·æº
Duke Nukem 3D-1ã€ã§ã¯ãªãã
2ã€ã®ã³ãŒãããŒã¹ïŒ
- ãã«ããšã³ãžã³ïŒã¬ã³ããªã³ã°ããããã¯ãŒã¯ããã¡ã€ã«ã·ã¹ãã ãããã³ãã£ãã·ã¥ãµãŒãã¹ãæäŸããŸãã
- ã²ãŒã ã¢ãžã¥ãŒã«ïŒ ãã«ããµãŒãã¹ã䜿çšããŠã²ãŒã ãäœæããŸãã
ãªããã®åé¢ãå¿
èŠãªã®ã§ããïŒ éçºãå§ãŸã£ã1993幎ã«ã¯ãåªãã3Dãšã³ãžã³ãäœæããããã«å¿
èŠãªã¹ãã«ãšç±æãæã£ãŠããã®ã¯å°æ°ã®äººã ãã ã£ãããã§ãã 3D Realmsã
Doomãšç«¶åããã²ãŒã ãæžãããšã«ãããšãã匷åãªãã¯ãããžãŒãèŠã€ããå¿
èŠããããŸããã ãã®ç¬éãã±ã³ã·ã«ããŒãã³ãç»å ŽããŸãã
ããææžåãããWebãµã€ããš
ã€ã³ã¿ãã¥ãŒã«ãããšãã±ã³ïŒåœæ18æ³ïŒã¯èªå®
ã§3Dãšã³ãžã³ãäœæããè©äŸ¡ã®ããã«3D Realmsã«ãã¢ãéããŸããã 圌ãã¯åœŒã®ã¹ãã«ãææã§ããããšã«æ°ã¥ããåæããŸãã

Silvermanã¯3D Realmsçšã®æ°ãããšã³ãžã³ãäœæããŸããããœãŒã¹ã³ãŒãã¯ä¿æããŸãã
Engine.h
ããããŒ
Engine.h
Engine.OBJ
ãã€ããªã¹ã¿ãã£ãã¯ã©ã€ãã©ãª ïŒ
Engine.OBJ
ïŒã®ã¿ãæäŸã
Engine.h
ã 3D RealmsããŒã ã¯ãã²ãŒã ã¢ãžã¥ãŒã«ïŒ
Game.OBJ
ïŒãåŒãç¶ããæçµçãªå®è¡å¯èœãã¡ã€ã«
DUKE3D.EXE
ããªãªãŒã¹ããŸãã
æ®å¿µãªãããã²ãŒã ã®äž¡æ¹ã®éšåã®ãœãŒã¹ã³ãŒãã¯åæã«éããŠããŸããã
- ãšã³ãžã³ã®ãœãŒã¹ã³ãŒãã¯ã2000幎6æ20æ¥ã«Ken Silvermanã«ãã£ãŠãªãªãŒã¹ãããŸããã
- ã²ãŒã ã¢ãžã¥ãŒã«ã®ãœãŒã¹ã³ãŒãã¯ã2003幎4æ1æ¥ã«3D Realmsã«ãã£ãŠãªãªãŒã¹ãããŸããã
ãã®çµæãå®å
šãªãœãŒã¹ã³ãŒãã¯ãã²ãŒã ã®ãªãªãŒã¹ããããã7幎ã§å©çšå¯èœã«ãªããŸããã
èå³æ·±ãäºå®ïŒãšã³ãžã³
ã®ååã
Build ãã¯ãæ°ãããšã³ãžã³ã®ã«ã¿ãã°ãäœæãããšãã«Ken Silvermanã«ãã£ãŠéžæãããŸããã 圌ã¯
ã·ãœãŒã©ã¹ã䜿çšããŠã
ãConstructionããšããåèªã®å矩èªãèŠã€ããŸãã ã
æåã®é£çµ¡

ãœãŒã¹ã³ãŒãã¯ããªãåã«ãªãªãŒã¹ãããã®ã§ïŒWatcom C / C ++ã³ã³ãã€ã©ãŒãšDOSã·ã¹ãã åãïŒã
Chocolate Doomã«äŒŒããã®ãèŠã€ããããšããŸãããããã¯ãDuke Nukem 3Dã²ãŒã ãã¬ã€ã90 -xãããã³ææ°ã®ã·ã¹ãã ã§ã®ã·ãŒã ã¬ã¹ãªã³ã³ãã€ã«ã
Duke Nukemã®ãœãŒã¹ã³ãŒãã³ãã¥ããã£ã¯ãã¯ãã¢ã¯ãã£ãã§ã¯ãªãããšãå€æããŸãããå€ãã®ããŒããåã³å€ããªã£ãŠãããäžéšã¯MacOS 9 PowerPCçšã§ãã ãŸã 1
ã€ãããµããŒããããŠããŸããïŒ
EDuke32 ïŒããå
ã®ã³ãŒããšæ¯èŒããŠé²åã
é²ã¿ãããŠããŸãã
ãã®çµæã
xDukeã§ã®äœæ¥ãéå§ã
ãŸããã ãLinuxããã³Mac OS Xã§ã¯ã³ã³ãã€ã«ã§ããŸããã§ããïŒã³ãŒãã®èªã¿åããšãããã¡ã€ãªã³ã°ã«æé©ãªIDEã§ããXcodeã®äœ¿çšãæé€ããŸããïŒã
Visual Studioã§äœæãããxDukeã¯ãå
ã®ã³ãŒããå¿ å®ã«åçŸããŸãã ãšã³ãžã³ãšã²ãŒã ã®2ã€ã®ãããžã§ã¯ããå«ãŸããŠããŸãã Engineãããžã§ã¯ãã¯éçã©ã€ãã©ãªïŒ
Engine.lib
ïŒã«ã³ã³ãã€ã«ãããGameãããžã§ã¯ãïŒ
main
ã¡ãœãããå«ãïŒã¯ããã«ãªã³ã¯ãããŠ
duke3D.exe
ãçæã
duke3D.exe
ã
VSãéããšãè€éãªãã¡ã€ã«åïŒ
ac
ã
cache1d.c
ïŒã®ããã«ããšã³ãžã³ãœãŒã¹ã¯ããäžèŠªåã«èŠããŸãã ãããã®ãã¡ã€ã«ã«ã¯ãç®ãšè³ã«æµå¯Ÿçãªãã®ãå«ãŸããŠããŸãã
Engine.cãã¡ã€ã«ã®å€ãã®äŸã®1ã€ã次ã«ç€ºããŸã
ïŒ693è¡ç®ïŒ ã
if ((globalorientation&0x10) > 0) globalx1 = -globalx1, globaly1 = -globaly1, globalxpanning = -globalxpanning; if ((globalorientation&0x20) > 0) globalx2 = -globalx2, globaly2 = -globaly2, globalypanning = -globalypanning; globalx1 <<= globalxshift; globaly1 <<= globalxshift; globalx2 <<= globalyshift; globaly2 <<= globalyshift; globalxpanning <<= globalxshift; globalypanning <<= globalyshift; globalxpanning += (((long)sec->ceilingxpanning)<<24); globalypanning += (((long)sec->ceilingypanning)<<24); globaly1 = (-globalx1-globaly1)*halfxdimen; globalx2 = (globalx2-globaly2)*halfxdimen;
泚ïŒãã¡ã€ã«/å€æ°åã«æ°åãå«ãŸããŠããå Žåãããã¯éåžžã«é©åãªååã§ã¯ãªãå¯èœæ§ããããŸãïŒ
game.c
ïŒ game.c
ã³ãŒã
ã®æåŸã®éšåã«
ã¯ãDuke Vã¹ã¯ãªããã®ãã©ãããå«ãŸããŠã
ãŸã ïŒ
æ³šïŒ xDukeã¯SDLã䜿çšããŸãããã¯ãã¹ãã©ãããã©ãŒã APIã¯WIN32ã¿ã€ããŒïŒ
QueryPerformanceFrequency
ïŒã®å©ç¹ã倱ããŸããã 䜿çšãããŠããSDLã¿ã€ããŒã¯ãDOSã§120 Hzã®åšæ³¢æ°ããšãã¥ã¬ãŒãããã«ã¯äžæ£ç¢ºãããããã§ãã
çµç«
SDLãšDirectXããããŒ/ã©ã€ãã©ãªã®å Žæãç解ããããšã«ãããã¯ã³ã¯ãªãã¯ã§ã³ãŒããã³ã³ãã€ã«ã§ããŸãã ãšãŠãããã§ãã æåŸã«æ®ãããã®ã¯ã
DUKE3D.GRP
ãªãœãŒã¹
DUKE3D.GRP
ãååŸããããšã§ããã²ãŒã ãéå§ãããŸã...ãŸãããŸãã¯ãã®ãããªãã®ã§ãã Vista / Windows 7ã§ã¯ãSDLã«ãã¬ããã®åé¡ãããããã§ãã

ãŠã£ã³ããŠã¢ãŒãïŒãŸãã¯Windows 8ã®ã»ããè¯ãïŒã§å®è¡ãããšãåé¡ã解決ããããã§ãã

ããã»ã¹æµžæŒ¬
ããã§ã²ãŒã ã¯æ©èœããŸãã æ°ç§ã§ã
Buildããã¹ãŠã®çŽ æŽãããã§è¡šç€ºããã次ã®ããšã瀺ããŸãã
- åŸæ倩äº
- çŸå®çãªç°å¢
- èªç±èœäž
- çã®3Dã®æèŠã
æåŸã®ãã€ã³ãã¯ããããã1996幎ã«æã圱é¿ãåãããã¬ãŒã€ãŒã§ãã æœæ°Žã¬ãã«ã¯æé«ã§ããã 2次å
ãããã«ããæè¡ãéçã«éããå Žåã§ããTodd ReplogleãšAllen Blumã¯ããã¬ã€ã€ãŒããã¬ããŒããã3次å
ã®äžçãžã®æ²¡å
¥æãé«ãããã»ã¯ã¿ãŒãšãã§ã¯ã¿ãŒããå®è£
ããŸããã ãã®é¢æ°ã¯ãäŒèª¬çãªLAã¡ã«ãããŠã³ãããã§äœ¿çšãããŸãã
ãã¬ã€ã€ãŒãææ°ã·ã£ããã«é£ã³èŸŒããšïŒ


ã»ã¯ã¿ãŒãšãã§ã¯ã¿ãŒã¯æ©èœãããçéžãåã«ãã¬ã€ã€ãŒããããäžã®å®å
šã«ç°ãªãå Žæã«ãã¬ããŒãããŸãã


è¯ãã²ãŒã ã¯ãã£ãããšèæœåãããã¥ãŒã¯ãã±ã ãäŸå€ã§ã¯ãããŸããã§ããã20幎çµã£ãä»ã§ãããã¬ã€ããã®ã¯ä¿¡ããããªãã»ã©æ¥œããã§ãã ãããŠä»ããã®ãœãŒã¹ã調ã¹ãããšãã§ããŸãïŒ
ãšã³ãžã³ã©ã€ãã©ãªã®æŠèŠ

ãšã³ãžã³ã³ãŒãã¯8503è¡ã®1ã€ã®ãã¡ã€ã«ã«ããã10åã®ã¡ã€ã³é¢æ°ïŒ
Engine.c
ïŒãš2ã€ã®è¿œå ãã¡ã€ã«ã«ãããŸãã
cache1.c
ïŒä»®æ³ãã¡ã€ã«ã·ã¹ãã ïŒsicïŒïŒããã³ãã£ãã·ã¥ã·ã¹ãã ããã·ãŒãžã£ãå«ãŸããŠããŸããac
ïŒé«åºŠã«æé©åãããx86ã¢ã»ã³ãã©ãŒã§ãããåäœæããããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã³ãŒãã®Cå®è£
ã ã³ãŒãã¯åäœããŸããããããèªãããšã¯å€§ããªèŠçã§ãïŒ
3ã€ã®ç¿»èš³ã¢ãžã¥ãŒã«ãšããã€ãã®æ©èœããç解ãã«ããé«ã¬ãã«ã®ã¢ãŒããã¯ãã£ãæ§æããŠããŸãã æ®å¿µãªãããèªè
ãééããå°é£ã¯ãããã ãã§ã¯ãããŸããã
ã»ã¯ã·ã§ã³å
šäœã
ãã«ããšã³ãžã³ã®å
éšå°çšã«ããŸããïŒä»¥äžãåç
§ïŒã
ã²ãŒã ã¢ãžã¥ãŒã«ã®æŠèŠ

ã²ãŒã ã¢ãžã¥ãŒã«ã¯å®å
šã«ãšã³ãžã³ã¢ãžã¥ãŒã«ã®äžã«æ§ç¯ãããã·ã¹ãã ã¯ããã»ã¹ã§äœ¿çšããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãåŒã³åºããŸãã ã²ãŒã å
ã®ãã¹ãŠã¯
ãã«ã ïŒã¬ã³ããªã³ã°ããªãœãŒã¹ã®ããŒãããã¡ã€ã«ã·ã¹ãã ããã£ãã·ã³ã°ã·ã¹ãã ãªã©ïŒãéããŠè¡ãããŸãã å¯äžã®äŸå€ã¯ãµãŠã³ããšé³æ¥œã§ããã
ã²ãŒã ã«å®å
šã«é¢é£ããŠããŸãã
ãšã³ãžã³ã«ãã£ãšèå³ããã£ãã®ã§ãããã§ã¯ããŸãç解ããŠããŸããã§ããã ãããããã®ã¢ãžã¥ãŒã«ã§ã¯ãããå€ãã®çµéšãšçµç¹ãèŠãããšãã§ããŸãã15åã®ãã¡ã€ã«ããœãŒã¹ã³ãŒããç解å¯èœãªã¢ãžã¥ãŒã«ã«åå²ããŸãã ããã«ã
types.h
ïŒ
stdint.h
ã®ã€ãã·ãšãŒã¿ãŒïŒãããã移æ€æ§ãåäžããŠããŸãã
ããã€ãã®èå³æ·±ãç¹ïŒ
game.c
ã¯ã game.c
è¡ã®ã³ãŒãã®ã¢ã³ã¹ã¿ãŒã§ããmenu.c
ã¯ããã¹ã€ããã±ãŒã¹ããmenu.c
3,000è¡ããããŸãã- ã»ãšãã©ã®ã¡ãœããã«ã¯ãvoidããã©ã¡ãŒã¿ãããããvoidããè¿ããŸãã ãã¹ãŠã¯ã°ããŒãã«å€æ°ãä»ããŠè¡ãããŸãã
- ã¡ãœããåã¯camelCaseãŸãã¯NAMESPACEãã¬ãã£ãã¯ã¹ã䜿çšããŸããã
- ãã®ã¢ãžã¥ãŒã«ã«ã¯åªããããŒãµãŒ/ã¬ãã·ã«ã«ã¢ãã©ã€ã¶ãŒããããŸã ã ã ããŒã¯ã³å€ ã¯
#define
ã§ã¯ãªã10é²æ°å€ã§æž¡ãããŸãã
äžè¬ã«ãã³ãŒãã®ãã®éšåã¯èªã¿ããããç解ããããã§ãã
ç¶æ¿ããããœãŒã¹ã³ãŒã
Doom / Quakeã«ãã£ãŠçæãããç¡æ°ã®ããŒããèŠããšããªãDuke Nukem 3DããŒãããããªã«å°ãªãã®ããšãã€ãçåã«æããŸããã Ken Silvermanãèªåã§ãããè¡ãããšã決å®ããåŸã«ã®ã¿ããšã³ãžã³ãOpenGLã«ç§»æ€ããããšãã«ãåã質åãçããŸããã
ã³ãŒãã確èªããã®ã§ããã®èšäºã®ç¬¬2éšã§ããã説æããããšæããŸãã
ãã§ã³ã¬ãŒããã¥ãŒã¯ãã±ã 3D
ç§ã¯ãã®ãšã³ãžã³ã倧奜ãã§ã²ãŒã ã倧奜ããªã®ã§ããã®ãŸãŸã«ããŠããããšã¯ã§ããŸããã§ããããããã©ããœãŒã¹ã³ãŒãã®ç§»æ€çã§ãã
Chocolate Duke Nukem 3Dãäœæãã次ã®2ã€ã®ç®æšãéæããããšããŸããã
- ãã¬ãŒãã³ã°ïŒèªã¿ããããç解ã移æ€æ§ã
- ä¿¡é Œæ§ïŒã²ãŒã ãã¬ã€ã¯ã1996幎ã«486ã§èŠããã®ãšäŒŒãŠããã¯ãã§ãã
ãã®ã€ãã·ã¢ãããã³ãŒãã®ç¶æ¿ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã æãéèŠãªå€æŽã«ã€ããŠã¯ãèšäºã®ç¬¬2éšã§èª¬æããŸãã
ãã«ããšã³ãžã³ã®å
éš
Build㯠ãDuke Nukem 3Dãã
Shadow Warriorã
Bloodãªã©ã®å€ãã®æåããã²ãŒã ã§äœ¿çšãã
ãŠããŸãã 1996幎1æ29æ¥ã«ãªãªãŒã¹ãããæç¹ã§ã圌ã¯é©æ°çãªæ©èœãåãã
Doomãšã³ãžã³ãç Žå£ããŸããã
- ç Žå£å¯èœãªç°å¢
- åŸæããåºãšå€©äº
- é¡
- äžäžã«èŠãæ©èœ
- æ°Žäžãé£ã¶ãããæ³³ãèœå
- ãã¯ã»ã«ãªããžã§ã¯ã ïŒåŸã§ãè¡æ¶²ãã«è¡šç€ºïŒ
- 3Dã«æ²¡é ããïŒãã¬ããŒã¿ãŒã®ãããïŒã
çå ã¯ã1996幎6æã«åŒ·åãªPentiumã§çºå£²ãããQuakeã圌ããåã£ããã®ã§ãããæ°å¹Žã®éã
Buildã¯åœæã®ã»ãšãã©ã®ã³ã³ãã¥ãŒã¿ãŒã§é«å質ããã¶ã€ããŒã®èªç±ããããŠæãéèŠãªããšãšããŠé«éãæäŸããŸããã
åºæ¬ã³ã³ã»ããïŒããŒã¿ã«ã·ã¹ãã
ã»ãšãã©ã®3Dãšã³ãžã³ã¯ããã€ããªã¹ããŒã¹ããŒãã£ã·ã§ã³ãŸãã¯Octreeã䜿çšããŠã²ãŒã ã«ãŒããåå²ããŸãã ããšãã°ãDoomã¯æéã®ãããæ¹æ³ïŒæ倧30åïŒã§åã«ãŒããååŠçããŠã次ã®ããšãå¯èœã«ããBSPããªãŒãäœæããŸããã
- å£ã䞊ã¹æ¿ãã
- äœçœ®ã決å®ãã
- è¡çªãæ€åºããŸãã
ããããã¹ããŒãã®ããã«ãè²æ©ããªããã°ãªã
ãŸããã§ãã ãå£
ã¯åãããšãã§ããŸããã§ãã ã
ãã«ãã¯ãã®å¶éãåé€ããã«ãŒããååŠçããŸããã§ãããã代ãã
ã«ããŒã¿ã«ã·ã¹ãã ã䜿çšããŸã
ã ïŒ


ãã®ãããã§ã¯ãã²ãŒã ãã¶ã€ããŒã¯5ã€ã®ã»ã¯ã¿ãŒïŒäžèšïŒãæããããããäºãã«æ¥ç¶ããŠãå£ãããŒã¿ã«ãšããŠããŒã¯ããŸããïŒäžïŒã
ãã®çµæã
Build worldããŒã¿ããŒã¹ã¯ãšãŠã€ããªãã·ã³ãã«ã«ãªããŸãããã»ã¯ã¿ãŒçšã®1ã€ã®é
åãšå£çšã®1ã€ã®é
åã§ãã
ã»ã¯ã¿ãŒïŒ5ãšã³ããªãŒïŒïŒå£ïŒ29ãšã³ããªãŒïŒïŒ
================================================== ======================
0 | startWallïŒ0 numWallsïŒ6 0 | ãã€ã³ã= [xãy]ãnextsector = -1 //ã»ã¯ã¿ãŒ0ã®å£
1 | startWallïŒ6 numWallsïŒ8 .. | //ã»ã¯ã¿ãŒ0ã®å£
2 | startWallïŒ14 numWallsïŒ4 .. | //ã»ã¯ã¿ãŒ0ã®å£
3 | startWallïŒ18 numWallsïŒ3 3 | ãã€ã³ã= [xãy]ãnextsector = 1 //ã»ã¯ã¿ãŒ0ããã»ã¯ã¿ãŒ1ãžã®ããŒã¿ã«
4 | startWallïŒ21 numWallsïŒ8 .. | //ã»ã¯ã¿ãŒ0ã®å£
============================== .. | //ã»ã¯ã¿ãŒ0ã®å£
.. |
ã»ã¯ã¿ãŒã®æåã®å£1 >> 6 | ãã€ã³ã= [xãy]ãnextsector = -1
7 | ãã€ã³ã= [xãy]ãnextsector = -1
8 | ãã€ã³ã= [xãy]ãnextsector = -1
9 | ãã€ã³ã= [xãy]ãnextsector = 2 //ã»ã¯ã¿ãŒ1ããã»ã¯ã¿ãŒ2ãžã®ããŒã¿ã«
10 | ãã€ã³ã= [xãy]ãnextsector = -1
11 | ãã€ã³ã= [xãy]ãnextsector = 0 //ã»ã¯ã¿ãŒ1ããã»ã¯ã¿ãŒ0ãžã®ããŒã¿ã«
12 | ãã€ã³ã= [xãy]ãnextsector = -1
ã»ã¯ã¿ãŒã®æåŸã®å£1 >> 13 | ãã€ã³ã= [xãy]ãnextsector = -1
.. |
28 | ãã€ã³ã= [xãy]ãnextsector = -1
============================================
ãã«ãã«é¢ããå¥ã®èª€è§£-å
ç·ãæŸåºããŸãããæåã«é ç¹ããã¬ãŒã€ãŒã®ç©ºéã«æ圱ããã次ã«èŠç¹ããå/è·é¢ãçæãããŸãã
ãã¥ãŒãã£ãµã€ã¯ã«ã®æŠèŠ
ãã¬ãŒã ã¬ã³ããªã³ã°ããã»ã¹ã®æŠèŠïŒ
- ã²ãŒã ã¢ãžã¥ãŒã«ã¯ãã¬ã³ããªã³ã°ãéå§ããã»ã¯ã¿ãŒããšã³ãžã³ ã¢ãžã¥ãŒã«ã«éä¿¡ããŸãïŒéåžžãããã¯ãã¬ãŒã€ãŒã®ã»ã¯ã¿ãŒã§ããããã©ãŒã®ããã»ã¯ã¿ãŒããããŸãïŒã
- ãšã³ãžã³ã¢ãžã¥ãŒã«ã¯ããŒã¿ã«ã·ã¹ãã ããã€ãã¹ãã èå³ã®ããã»ã¯ã¿ãŒã蚪åããŸãã 蚪åããåã»ã¯ã¿ãŒïŒ
- å£ã¯ã°ã«ãŒãïŒããã³ããïŒãšåŒã°ããã»ããã«ã°ã«ãŒãåãããŸãã ãããã¯ã¹ã¿ãã¯ã«ä¿åãããŸãã
- ãã®ã»ã¯ã¿ãŒã«è¡šç€ºãããã¹ãã©ã€ãã決å®ãããã¹ã¿ãã¯ã«ä¿åãããŸãã
- ã°ã«ãŒãã¯è¿ãããé ãé ã«åŠçãããŸãïŒåºäœã®å£ãšããŒã¿ã«ãã¬ã³ããªã³ã°ãããŸãã
- ã¬ã³ããªã³ã°ã®åæ¢ïŒ ã²ãŒã ã¢ãžã¥ãŒã«ã衚瀺ãããŠããã¹ãã©ã€ããæŽæ°ããã®ãåŸ
æ©ããŠããŸã ã
- ãã¹ãŠã®ã¹ãã©ã€ããšéæãªå£ã¯ãé ãããé£ã«åãã£ãŠé çªã«ã¬ã³ããªã³ã°ãããŸãã
- ãããã¡ãåãæ¿ããããŸãã
ã³ãŒãã®åã¹ãããã¯æ¬¡ã®ãšããã§ãã
èå³æ·±ãäºå®ïŒã³ãŒããåŠç¿ãããšãããããšããŠäœ¿çšãã
å®å
šã«å±éããã
ãµã€ã¯ã«ããããŸãã
èå³æ·±ãäºå®ïŒãããã¡ã¹ã€ããã³ã°ã¡ãœããã
nextpage()
ãšåŒã°ããã®ã¯ãªãã§ããïŒ 90幎代ã«ã¯ãVGA / VESAã®ããã°ã©ãã³ã°ã®åã³ã«ã¯ããã«ãããã¡ãªã³ã°ã®å®è£
ãå«ãŸããŠããŸããããããªã¡ã¢ãªã®2ã€ã®éšåãé çªã«å²ãåœãŠããã䜿çšãããŠããŸããã åéšåã¯ãããŒãžããšåŒã°ããŠããŸããã 1ã€ã®éšåã¯VGA CRTã¢ãžã¥ãŒã«ã«ãã£ãŠäœ¿çšããã2çªç®ã®éšåã¯ãšã³ãžã³ã«ãã£ãŠæŽæ°ãããŸããã ãããã¡ã®åãæ¿ãã¯ãããŒã¹ã¢ãã¬ã¹ã眮ãæãã次ã®ããŒãžïŒã次ã®ããŒãžãïŒã®CRTã䜿çšããããšã§æ§æãããŠããŸããã ããã«ã€ããŠ
ã¯ãMichael Abrashã®ã°ã©ãã£ãã¯ããã°ã©ãã³ã°ã®ãã©ãã¯ããã¯ïŒBones and sinewã®ç¬¬23ç« ã§è©³ããèªãããšãã§ããŸãã
ä»æ¥ãSDLã¯ãããªã¢ãŒã
SDL_DOUBLEBUF
åçŽãªãã©ã°ã§ãã®äœæ¥ãç°¡çŽ åããŸãããã¡ãœããåã¯éå»ã®ææç©ã®ãŸãŸã§ãã
1.ã¬ã³ããªã³ã°ãéå§ããå Žæ
BSPãååšããªããšããããšã¯ããã€ã³ã
p(x,y)
ãååŸããã·ãŒãã®ã»ã¯ã¿ãŒã«å°éãããŸã§ããªãŒã®ããŒããééããããšãäžå¯èœã§ããããšãæå³ããŸãã
Buildã§ã¯ ã
updatesector(int newX, int newY, int* lastKnownSectorID)
ã䜿çšããŠåäœçœ®ãæŽæ°
ãããåŸããã¬ãŒã€ãŒã®çŸåšã®ã»ã¯ã¿ãŒã
ç£èŠããå¿
èŠããããŸãã
ã²ãŒã ã¢ãžã¥ãŒã«ã¯
ããšã³ãžã³ã¢ãžã¥ãŒã«ã®ãã®ã¡ãœãããé »ç¹ã«åŒã³åºããŸãã
åçŽãª
updatesector
å®è£
updatesector
ãã¹ãŠã®ã»ã¯ã¿ãŒãç·åœ¢ã«ã¹ãã£ã³ããæ¯å
p(x,y)
ã»ã¯ã¿ãŒS
å
ã«ãããã©ããããã§ãã¯ããŸãããããã
updatesector
åäœãã¿ãŒã³ã«ãã£ãŠæé©åãããŸãã
lastKnownSectorID
ãšãã¢ã«ãŽãªãºã ã¯ãã¬ãŒã€ãŒãããŸãé ãã«ç§»åããŠããªããšæ³å®ããã»ã¯ã¿ãŒlastKnownSectorID
ãããã§ãã¯ãéå§ããŸããlastKnownSectorID
1ãå®äºã§ããªãã£ãå Žåãã¢ã«ãŽãªãºã ã¯ããŒã¿ã«ã䜿çšããŠé£æ¥ããlastKnownSectorID
ã»ã¯ã¿ãŒããã§ãã¯ããŸãã- ãããŠæåŸã«ãææªã®ã·ããªãªã§ã¯ã圌ã¯ãã¹ãŠã®ã»ã¯ã¿ãŒãç·åœ¢æ€çŽ¢ã§ãã§ãã¯ããŸãã

å·ŠåŽã®ãããã§ã¯ããã¬ãŒã€ãŒã®äœçœ®ã®æåŸã®æ¢ç¥ã®ã»ã¯ã¿ãŒã¯ID
1
ã®ã»ã¯ã¿ãŒã§ããããã¬ãŒã€ãŒã移åããè·é¢ã«å¿ããŠã
updatesector
ã¯æ¬¡ã®é åºã§ãã§ãã¯ããŸãã
inside(x,y,1)
ïŒãã¬ãŒã€ãŒã¯ã»ã¯ã¿ãŒãåºããŸã§ç§»åããŠããŸããïŒãinside(x,y,0)
ïŒãã¬ãŒã€ãŒã¯é£æ¥ããã»ã¯ã¿ãŒã«ãããã«ç§»åããŸããïŒã
inside(x,y,2)
inside(x,y,0)
ïŒãã¬ã€ã€ãŒã¯ããããåããïŒã²ãŒã ã®ãã¹ãŠã®ã»ã¯ã¿ãŒã®ãã§ãã¯ãæœåšçã«å¿
èŠã§ãïŒã
inside(x,y,1)
inside(x,y,2)
inside(x,y,3)
inside(x,y,4)
ææªã®ã·ããªãªã¯éåžžã«ã³ã¹ãããããå¯èœæ§ããããŸãã ããããã»ãšãã©ã®å Žåããã¬ãŒã€ãŒ/ã·ã§ã«ã¯ããŸãé ãã«ç§»åãããã²ãŒã ã®é床ã¯é«ããŸãŸã§ãã
å
éšã®è©³çŽ°
å
éšã¯ã次ã®2ã€ã®çç±ãã泚ç®ã«å€ããæ¹æ³ã§ãã
- æŽæ°ã®ã¿ã䜿çšã§ããŸãã
- å¹ã®å¯èœæ§ã®ããã»ã¯ã¿ãŒã«å¯ŸããŠå®è¡ããå¿
èŠããããŸãã
ãã®æ¹æ³ã¯ã
Buildãã©ã®ããã«æ©èœããããå®å
šã«ç€ºããŠããããããã®æ¹æ³ã詳ããèŠãŠãããŸããå€ãè¯ããã¯ã¿ãŒã¢ãŒãã¯ãŒã¯ãšXORã䜿çšããŸãã
åºå®å°æ°ç¹ã³ã³ãã¥ãŒãã£ã³ã°ãšãŠããã¿ã¹ãã¯ã¿ãŒã¢ãŒãã¯ãŒã¯ã®æ代
90幎代ã®ã»ãšãã©ã®ã³ã³ãã¥ãŒã¿ãŒã«ã¯æµ®åå°æ°ç¹æ°ïŒFPUïŒã®ã³ããã»ããµãŒïŒ386SXã386DXã486SXïŒããªãã£ãããã
Buildã§ã¯æŽæ°ã®ã¿ã䜿çšãããŸããã

ãã®äŸã¯ããšã³ããã€ã³ãAããã³Bãæã€å£ã瀺ããŠããŸããã¿ã¹ã¯ã¯ããã€ã³ããå·Šãå³ããå€æããããšã§ãã
Michael Abrashã®Black Book of ProgrammingïŒReference of Frameã®ç¬¬61ç« ã§ããã®åé¡ã¯åçŽãªã¹ã«ã©ãŒç©ãšæ¯èŒã«ãã£ãŠè§£æ±ºãããŠããŸãã
bool inFrontOfWall(float plan[4], float point[3]) { float dot = dotProduct(plan,point); return dot < plan[3]; }

ããããæµ®åå°æ°ç¹æŒç®ã®ãªãäžçã§ã¯ãåé¡ã¯ãã¯ãã«ç©ã«ãã£ãŠè§£æ±ºãããŸãã
bool inFrontOfWall(int wall[2][2], int point[2]) { int pointVector[2], wallVector[2] ; pointVector[0] = point[0] - wall[0][0];
èå³æ·±ãäºå®ïŒ ãã«ããœãŒã¹ã³ãŒãã§æ€çŽ¢æååãfloatããèšå®ããå ŽåãäžèŽãããã®ã¯1ã€ããããŸããã
èå³æ·±ãäºå®ïŒ float
åã®äœ¿çšã¯ãPentiumããã»ããµããã³æµ®åå°æ°ç¹æ°çšã®ã³ããã»ããµã察象ãšãããããQuakeãæ®åãããŸããã
å¹å€è§åœ¢ã®å
åŽ
ãã¯ãã«ç©ã䜿çšããŠå£ã«å¯Ÿããç¹ã®äœçœ®ã決å®ããæ¹æ³ãåŠç¿ããã®ã§ã
inside
詳ããèŠãããšãã§ããŸãã

å¹é¢ã®ããªãŽã³ãš2ã€ã®ãã€ã³ããããäŸïŒãã€ã³ã1ãšãã€ã³ã2ã
- ãã€ã³ã1ã¯å€ã«ãããšèŠãªãããŸãã
- ãã€ã³ã2ã¯å
éšã«ãããšèŠãªãããŸãã
ããªãŽã³å
ã®ãã€ã³ãïŒããªãŽã³å
ãã€ã³ããPIPïŒã決å®ããããã®ãææ°ã®ãã¢ã«ãŽãªãºã ã¯ãå·ŠåŽã«ããŒã ãæŸå°ãã亀差ãã蟺ã®æ°ã決å®ããããšã§ãã å¥æ°ã®å Žåããã€ã³ãã¯å
åŽã«ãããå¶æ°ã®å Žå-å€åŽã«ãããŸãã

Buildã¯ãã®ã¢ã«ãŽãªãºã ã®ããªãšãŒã·ã§ã³ã䜿çšããŸããå蟺ã®ãšããžã®æ°ãã«ãŠã³ãããXORã䜿çšããŠçµæãçµåããŸãã

èå³æ·±ãäºå®ïŒ Doomãšã³ãžã³ã¯
R_PointOnSideã§ã»ãŒåãããªãã¯ãå®è¡ããå¿
èŠããã
ãŸãã ã Quakeã¯
Mod_PointInLeafã§ãã¬ãŒã³ãšæµ®åå°æ°ç¹æŒç®ã䜿çšã
ãŸãã ã
èå³æ·±ãäºå®ïŒèªã¿ã«ããå Žå
ã¯ãChocolate Duke Nukemã®ããŒãžã§ã³ã調ã¹ãããšããå§ãããŸããã³ã¡ã³ãããããŸãã
2.ã¬ã³ããªãŒãšäžéæãªå£
éå§ã»ã¯ã¿ãŒã¯ã
ã²ãŒã ã¢ãžã¥ãŒã«ã«ãã£ãŠ
ãã«ããšã³ãžã³ã«æž¡ãã
ãŸã ã ã¬ã³ããªã³ã°ã¯ã
drawrooms
äžéæãªå£ããå§ãŸããŸããã¹ã¿ãã¯ã§æ¥ç¶ããã2ã€ã®ã¹ãããã§ãã

- ååŠç段éã§ã¯ãããŒã¿ã«ã·ã¹ãã ã
startingSectorID
scansector()
ããïŒstartingSectorIDã§startingSectorID
ïŒãã¹ã¿ãã¯äžã®å£ãä¿åããŸãïŒ scansector()
ã - ã¹ã¿ãã¯ã¯ãæãèŠçŽ ã§æ§æãããŸãã
- ã¹ã¿ãã¯èŠçŽ ã¯ã¬ã³ãã©ãŒã¡ãœããã«æž¡ãããŸãïŒ
drawwalls()
ã

ãæããšã¯äœã§ããïŒ
ã°ã«ãŒãã¯ããæœåšçã«èŠããããšèããããå£ã®ã»ããã§ãã ãããã®å£ã¯1ã€ã®ã»ã¯ã¿ãŒã«å±ããåžžã«ïŒãã€ã³ãã§æ¥ç¶ãããŠïŒãã¬ãŒã€ãŒã«åããããŠããŸãã
ã¹ã¿ãã¯å
ã®å£ã®ã»ãšãã©ãããããããããã®çµæãç»é¢äžã«ã¬ã³ããªã³ã°ãããã®ã¯äžéšã®ã¿ã§ãã
æ³šïŒ ãå£ãããã·ãã¯ããæœåšçã«èŠãããå£ã®ãªã¹ãå
ã®å£ãæãæŽæ°ã§ãã pvWallsé
åã«ã¯ãã¯ãŒã«ãããŒã¿ããŒã¹å
ã®å£ãžã®ãªã³ã¯ãšããã®åº§æšããã¬ãŒã€ãŒã®ã¹ããŒã¹ãšç»é¢ã¹ããŒã¹ãžã®å転/移åãå«ãŸããŸãã
泚ïŒããŒã¿æ§é ã¯å®éã«ã¯ããè€éã§ããã°ã«ãŒãã®æåã®å£ã®ã¿ãã¹ã¿ãã¯ã«ä¿åãããŸãã æ®ãã¯ãèå¥åãžã®ãªã³ã¯ãå«ããªã¹ããšããŠäœ¿çšãããé
åã«ãããŸããããã¯ãã°ã«ãŒããã¹ã¿ãã¯å
ã§ãã°ããäžäžã«ç§»åã§ããããã«è¡ãããŸãã
èå³æ·±ãäºå®ïŒãã£ã«ããã»ã¹ã¯é
åã䜿çšããŠã蚪åãããã»ã¯ã¿ãŒããããŒã¯ããŸãããã®é
åã¯ãåãã¬ãŒã ã®åã«ã¯ãªã¢ããå¿
èŠããããŸããçŸåšã®ãã¬ãŒã ã§ã»ã¯ã¿ãŒã蚪åããããã©ãããå€æããããã«ã framenumberããªãã¯ã¯äœ¿çšãããŸãããèå³æ·±ãäºå®ïŒ Doomãšã³ãžã³ã§ã¯ãè§åºŠãç»é¢ã®åã«å€æããããã«å®éåã䜿çšãããŸãããã§ã¯ãã«ããã¬ã€ã€ãŒã®ç©ºéã«äžçã®é ç¹ãå€æããè¡åã®COS /眪ã䜿çšããŸããããŒã¿ã«ã«å
¥åããå Žåã次ã®ãã¥ãŒãªã¹ãã£ãã¯ã䜿çšãããŸãããã¬ãŒã€ãŒã«åãããã90床ã®ç¯å²å
ã«ãããã¹ãŠã®ããŒã¿ã«ããã©ããã£ã³ã°ãããŸãããã®éšåã¯ç解ãã«ããã§ãã ãããããµã€ã¯ã«ãç¯çŽããããã«éçºè
ãã©ã®ããã«ããããå Žæãæ¢ãããã瀺ããŠãããããèå³æ·±ããã®ã§ãã
ã°ã«ãŒãçæ
ã»ã¯ã¿ãŒå
ã®å£ã¯ããã³ããã«ã°ã«ãŒãåãããŸããã¢ã€ãã¢ã説æãã
å³ã次ã«ç€ºããŸããäžã®å³ã¯ã3ã€ã®ã»ã¯ã¿ãŒã4ã€ã®ã°ã«ãŒããçæããããšã瀺ããŠããŸãã- ã»ã¯ã¿ãŒ1ã¯ã1ã€ã®å£ãå«ã1ã€ã®ã°ã«ãŒããçæããŸããã
- ã»ã¯ã¿ãŒ2ã¯ã3ã€ã®å£ãå«ã1ã€ã®ã°ã«ãŒããçæããŸããã
- ã»ã¯ã¿ãŒ3ã¯2ã€ã®ã°ã«ãŒããçæããåã°ã«ãŒãã«ã¯2ã€ã®å£ãå«ãŸããŠããŸãã
å£ãã°ã«ãŒãã«ã°ã«ãŒãåããã®ã¯ãªãã§ããïŒBuildã«ã¯è¿
éãªäžŠã¹æ¿ããå¯èœã«ããããŒã¿æ§é ããªãããã§ãã圌ã¯ããã»ã¹ïŒO²ïŒã䜿çšããŠæãè¿ãã°ã«ãŒããååŸããŸããããã¯ãåå£ã§å®è¡ãããšéåžžã«ã³ã¹ããããããŸãããªãœãŒã¹ã®ã³ã¹ãã¯ãå€ãã®å£ã§å®è¡ããå Žåãããã¯ããã«äœããªããŸããã°ã«ãŒãã䜿çšãã
ã°ã«ãŒãã®ã¹ã¿ãã¯ãåãããšããšã³ãžã³ã¯è¿ãããé ãã«åãã£ãŠã°ã«ãŒããæãå§ããŸãããšã³ãžã³ã¯ãå¥ã®ã°ã«ãŒãã«ãã£ãŠãããã¯ãããŠããªãæåã®ã°ã«ãŒããéžæããŸãïŒåžžã«ããã®æ¡ä»¶ãæºããã°ã«ãŒããå°ãªããšã1ã€ãããŸãïŒã closest = 0; tempbuf[closest] = 1; for(i=1; i < numbunches; i++){ if ((j = bunchfront(i,closest)) < 0) continue; tempbuf[i] = 1; if (j == 0){ tempbuf[closest] = 1; closest = i; } }
泚ïŒå€æ°ã®ååã«ãããããããéžæãããã°ã«ãŒãã¯å¿
ãããæãè¿ããšã¯éããŸãããã±ã³ã·ã«ããŒãã³ã«ãã£ãŠäžããããéžæã®ååã®èª¬æïŒ2 . , x-. , . , x-. . : , . (: , , «» !) ( ) . , , , â
bunchfront
-é«éã§è€éã§äžå®å
šãªãããBuild ã¯çµæãã¬ã³ãã©ãŒã«éä¿¡ããåã«äºéãã§ãã¯ãå®è¡ããŸããããã¯ã³ãŒããé©ãããŸãããçµæãšããŠOïŒn²ïŒã§ã¯ãªãOïŒnïŒãååŸããŸããéžæãããåã°ã«ãŒãã«ã¯drawalls(closest)
ã¬ã³ãã©ãŒãéä¿¡ãããŸããã³ãŒãã®ãã®éšåã¯ãã§ããã ãå€ãã®å£/åº/倩äºãæç»ããŸããå£/åº/倩äºã®å¯èŠå
ãã®éšåãç解ããã«ã¯ãå£ãåºã倩äºãªã©ããã¹ãŠãåçŽã«ã¬ã³ããªã³ã°ãããããšãç解ããããšãéèŠã§ããã¬ã³ãã©ãŒã³ã¢ã«ã¯2ã€ã®ã¯ãªããã³ã°é
åããããŸããäžç·ã«ãç»é¢äžã®ãã¯ã»ã«ã®ååã®äžäžã®ã¯ãªããã³ã°å¢çã远跡ããŸãã
泚ïŒãšã³ãžã³ã¯éåžžãæ§é äœé
åã§ã¯ãªãããªããã£ãåã®é
åã䜿çšããŸããã¹ã©ã€ããŒã¯ãäžããäžã«åãã£ãŠåçŽæ¹åã®ãã¯ã»ã«ç¯å²ãèšé²ããŸããå¢çå€ã¯äºãã«åãã£ãŠç§»åããŸãããã¯ã»ã«åãå®å
šã«ãªãŒããŒã©ããããŠãããšå€æãããšãã«ãŠã³ã¿ãŒå€ãæžå°ããŸãã
泚ïŒã»ãšãã©ã®å Žåãã¯ãªããã³ã°é
åã¯éšåçã«ã®ã¿æŽæ°ãããŸããããŒã¿ã«ã¯ãç©Žããæ®ããŸãã
ã°ã«ãŒãå
ã®åå£ã¯ã¹ã¯ãªãŒã³ã¹ããŒã¹ã«æ圱ããã次ã®ããã«ãªããŸãã- åºäœã®å£ã®å ŽåïŒ
- 衚瀺ãããŠããå Žåã倩äºãã¬ã³ããªã³ã°ãããŸãã
- åºã¯ã衚瀺ãããŠããå Žåã«ã¬ã³ããªã³ã°ãããŸãã
- å£ãèŠããå Žåã¯ã¬ã³ããªã³ã°ãããŸãã
- åå
šäœããã¯ãªããã³ã°é
åã§ã¯ãªãããããŠãããšããŒã¯ãããŸãã
- ãããããŒã¿ã«ã®å ŽåïŒ
- 衚瀺ãããŠããå Žåã倩äºãã¬ã³ããªã³ã°ãããŸãã
- åºã¯ã衚瀺ãããŠããå Žåã«ã¬ã³ããªã³ã°ãããŸãã
- ãšã³ãžã³ã¯ã次ã®ã»ã¯ã¿ãŒãã調ã¹ããŸãã
- ã¯ãªããã³ã°é
åã¯ãæç»ããããã®ã«åºã¥ããŠæŽæ°ãããŸãã
åæ¢æ¡ä»¶ïŒãã®ãµã€ã¯ã«ã¯ããã¹ãŠã®ã°ã«ãŒããåŠçããããããã¯ã»ã«ã®ãã¹ãŠã®åãå®äºãšããŠããŒã¯ããããŸã§ç¶ããŸããããã¯ãã·ãŒã³ãåå²ããäŸãããšãã°ã誰ããããç¥ã£ãŠããããŒã«ã«ãã£ãŠç解ããã®ãã¯ããã«ç°¡åã§ãïŒ
ãããã§ã¯ãããŒã¿ã«ã¯èµ€ã§ãçœã§å¡ãã€ã¶ãããå£ã§è¡šç€ºãããŸãïŒ
æåã®ã°ã«ãŒãã®3ã€ã®å£ã¯ãç»é¢ã¹ããŒã¹ã«æ圱ãããŸãïŒäžéšã®ã¿ãç»é¢ã«è¡šç€ºãããŸãã
ãããã£ãŠããšã³ãžã³ã¯åºãåçŽã«ã¬ã³ããªã³ã°ã§ããŸãã
次ã«ããšã³ãžã³ã¯3ã€ã®å£ã®ããããã«é£æ¥ããã»ã¯ã¿ãŒããèŠã-1
ãŸããå€ãã§ãªãããããããã®å£ã¯ããŒã¿ã«ã§ããåºã®é«ãã®éããèŠãŠããšã³ãžã³ã¯ããããã®åºã«ã¹ãããã¢ããïŒãUPãïŒãæãå¿
èŠãããããšãç解ããŠããŸãã
ãããŠããããæåã®ã°ã«ãŒãã§ã¬ã³ããªã³ã°ãããã¹ãŠã§ããããã§ã2çªç®ã®ã°ã«ãŒããç»é¢ã¹ããŒã¹ã«æ圱ãããŸãã
ãŸããäžéšã®ã¿ãååŸãããŸããããã¯ããšã³ãžã³ãããã¢ãã¬ã³ããªã³ã°ã§ããããšãæå³ããŸãã
次ã®ã»ã¯ã¿ãŒãèŠãŠãæãé·ãããŒã¿ã«ãèŠããšããšã³ãžã³ã¯æ£ãåŒãäžããããšãã§ããŸãïŒãSTEP UPãïŒããã ããã°ã«ãŒãã®2çªç®ã®ããŒã¿ã«ã¯äžäœã»ã¯ã¿ãŒã«ã€ãªãããŸããæ£ã¯æç»ãããŸããã
ãã®ããã»ã¹ãç¹°ãè¿ãããŸããã·ãŒã³å
šäœã瀺ããããªã¯æ¬¡ã®ãšããã§ãããã¢ããŒã¿ã«ã¬ã³ããªã³ã°ã®çµæãšããŠãBuildã¯2ã€ã®ç°ãªããã¯ã¹ãã£ãŒã§ã¬ããžãäžäžã«ã¬ã³ããªã³ã°ããŸãããããã¯ã1ã€ã ãã§ã©ã®ããã«å¯èœpicnum
ã§ããïŒïŒããã¯ãæ§é ã«ãpicnum
ããããããã«å¯èœã§ããããã¯ãoverpicnum
çé¢ã®å£ãŸãã¯ãã¹ã¯ã®ããå£ã®ããã§ãããå察ã»ã¯ã¿ãŒã®å£ããäžã®ãã¯ã¹ãã£ã®ã€ã³ããã¯ã¹ããçããããšãã§ãããã©ã°ã§ããããã¯ã»ã¯ã¿ãŒæ§é ã®ãµã€ãºãå°ããä¿ã€ããšãå¯èœã«ããããã¯ã§ãããç§ã¯ãããªã§ä»ã®2ã€ã®ã·ãŒã³ãç·šéããŸããïŒStreetïŒ0:00ãã0:08ãŸã§ïŒæ©éã®æäžç·ã®ããŒã¿ã«ã䜿çšããŠãåºã®åçŽéšåãæç»ããŸãã0:08ã«ããšã³ãžã³ã¯æ©éã®åŸã®ã»ã¯ã¿ãŒã®ããã¢ã¬ãã«ãæ€çŽ¢ããŸããäžæãããšãããŒã¿ã«ã®å£ãæç»ãããŸããæ©éã®ã¬ã³ããªã³ã°ãå®äºããŸãã0:18ã0:30ïŒå·ŠåŽã®2ã€ã®æ©éã®ã°ã«ãŒãã䜿çšããŠã巚倧ãªåºãã¬ã³ããªã³ã°ããŸããåå Žã®å€ïŒããã¯ããŠã£ã³ããŠã衚瀺ãããèå³æ·±ãã·ãŒã³ã§ããæåŸã®ãããªã¯ãŠã£ã³ããŠã瀺ããŠããŸããäœææ¹æ³ã®è©³çŽ°ã¯æ¬¡ã®ãšãã ã§ãããããïŒ
æåã®ã°ã«ãŒãã«ã¯ãç»é¢ã¹ããŒã¹ã«æ圱ããããšãã«å€©äºãšåºãæç»ã§ãã4ã€ã®å£ãå«ãŸããŸãïŒ
ã°ã«ãŒãã®å·Šå£ã¯ããŒã¿ã«ã§ããå匷ããåŸã次ã®ã»ã¯ã¿ãŒã®åºã¯åãé«ãã§ããã倩äºãé«ãããšãããããŸããããã§ã¯ãæ£å£ãã¬ã³ããªã³ã°ããå¿
èŠã¯ãããŸããã 2çªç®ã®å£ã¯äžéæã§ãïŒãããäžã§çœã§ããŒã¯ãããŠããŸãïŒããã®çµæããã¯ã»ã«ã®å®å
šãªåãæç»ãããŸã
ã3çªç®ã®å£ã¯ããŒã¿ã«ã§ãã次ã®ã»ã¯ã¿ãŒã®é«ããèŠããšããããäœãããšããããã®ã§ãæ£å£ãäžã«ã¬ã³ããªã³ã°ããå¿
èŠããããŸãã
åããããŒãã³ã°ãããã»ã¹ãããã¢ã«å¯ŸããŠå®è¡ãããŸããé«ããããæ£å£ãäœæãã
ãŸããæåŸã«ãæåŸã®å£ãåŠçãããŸããããã¯ããŒã¿ã«ã§ã¯ãªãããããã¯ã»ã«ã®åå
šäœãæç»ãããŸãã
èå³æ·±ãäºå®ïŒå£ã¯åçŽã«æç»ããããããBuildã¯90床å転ããRAMã«ãã¯ã¹ãã£ãä¿åããŸããããã«ããããã£ãã·ã¥ã®äœ¿çšã倧å¹
ã«æé©åãããŸãã3.äžæåæ¢
ãã®æç¹ã§ã衚瀺ãããŠãããã¹ãŠã®åºäœå£ããªãã¹ã¯ãªãŒã³ãããã¡ã«æžã蟌ãŸããŸãããšã³ãžã³ã¯äœæ¥ãåæ¢ããã²ãŒã ã¢ãžã¥ãŒã«ãå®äºããã®ãåŸ
ã£ãŠã衚瀺ãããŠãããã¹ãŠã®ã¹ãã©ã€ããã¢ãã¡ãŒã·ã§ã³åããŸãããããã®ã¹ãã©ã€ãã¯ã次ã®é
åã«æžã蟌ãŸããŸãã #define MAXSPRITESONSCREEN 1024 extern long spritesortcnt; extern spritetype tsprite[MAXSPRITESONSCREEN];
4.ã¹ãã©ã€ãã®ã¬ã³ããªã³ã°
äžåºŠã²ãŒã ã¢ãžã¥ãŒã«ã¯ããã¹ãŠã®å¯èŠã¹ãã©ã€ãã®ã¢ãã¡ãŒã·ã§ã³ãå®äºãããã«ãã¯é ãããè¿ããŸã§ã«ïŒæç»ãéå§ããŸãdrawmasks()
ã- èŠç¹ããåã¹ãã©ã€ããŸã§ã®è·é¢ãèšç®ãããŸãã
- ã·ã§ã«ã¢ã«ãŽãªãºã ã«ãã£ãŠãœãŒããããã¹ãã©ã€ãã®é
å
- ãšã³ãžã³ã¯ã2ã€ã®ãªã¹ãïŒã¹ãã©ã€ãçšãšéæãªå£çšïŒãã亀äºã«ããŒã¿ãååŸããŸãã
- 1ã€ã®ãªã¹ãã䜿ãæãããåŸããšã³ãžã³ã¯åå²ãæå°éã«æããããšãã1ã€ã®ã¿ã€ãïŒã¹ãã©ã€ããŸãã¯å£ïŒã®ã¿ãã¬ã³ããªã³ã°ããã«ãŒãã«åãæ¿ããŸãã
ãããã¡ã€ãªã³ã°
Instrumentsãããã¬ãŒãä»ããŠDuke Nukem 3Dãå®è¡ãããšãã©ã®ããã»ããµãŒãµã€ã¯ã«ãè²»ããããããããããŸããã¡ã€ã³ã¡ãœããïŒ
äžæè°ã§ã¯ãããŸãããã»ãšãã©ã®æéã¯äžéæãªå£ã®ã¬ã³ããªã³ã°ãšãããã¡ãŒã®åãæ¿ãã®åŸ
æ©ã«è²»ããããŸãïŒvsyncããªã³ïŒãå±ç€ºå®€ã®æ¹æ³ïŒ
93ïŒ
ã®æéãå£ã®å¡è£
ã«è²»ããããŠããŸãã6ïŒ
ã¯ãã¹ãã©ã€ã/éæãªå£ã®èŠèŠåã®ããã«äºçŽãããŠããŸãããããŒã«ãŒã æ¹åŒïŒ
ãã®è€éãã«ãããããããå¯èŠè¡šé¢ã®å®çŸ©ïŒå¯èŠè¡šé¢ã®æ±ºå®ïŒã¯ãåºäœå£ã®å¯èŠå段éã®0.1ïŒ
ããããããŸãããDrawallsã¡ãœããïŒ
*ã¹ãã£ã³é¢æ°-ããã¯ããšã³ãžã³ãšã¢ã»ã³ãã©ãŒããã·ãŒãžã£éã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ããwallscan()
ïŒå£ceilscan()
ïŒåŸæã®ãªã倩äºflorscan()
ïŒåŸæã®ãªãåºparascan()
: ( wallscan()
)grouscan()
: â
:ceilscan() florscan() , . while. , . , , , . while Doom.
ã±ã³ã¯ç§ã¹ã¯ãªããéä¿¡evaldrawãspan_v2h.kcãæ°Žå¹³ãã³ãã®ãªã¹ãã«åçŽãã³ãã®ãªã¹ããå€æããæ¹æ³ceilscanïŒïŒãšflorscanïŒïŒã瀺ãã
displayrestæ¹æ³ïŒ
displayrest
ããæ¡åãããã²ãŒã ãŠããããããã§ã®äž»ãªã³ã¹ãã¯ãã¬ã³ããªã³ã°ïŒæŠåšïŒã®ã³ã¹ãã§ããã¹ããŒã¿ã¹ããŒã¯ãã¬ãŒã ããšã«ã¬ã³ããªã³ã°ãããã匟è¬ã«ãŠã³ã¿ãŒãå€æŽããããšãã«ã®ã¿æ¿å
¥ãããŸããVGAããã³VESAã«é¢ããèå³æ·±ãäºå®
X-Mode VGAã®ãããã§ãã»ãšãã©ã®ãã¬ãŒã€ãŒã¯320x240ã§ãã«ããå®è¡ããŸãããããããVESAèŠæ Œã®ãããã§ããšã³ãžã³ã¯Super-VGA解å床ããµããŒãããŠããŸããããã©ãœãŒã¹ã«ã¯VESAã³ãŒããè£
åãããŠãããããŒã¿ãã«ãªè§£å床ã®æ±ºå®ãšã¬ã³ããªã³ã°ãæäŸããŸãããã¹ã¿ã«ãžã¹ãã¯ãã®è¯ãã¬ã€ãã§VESAã®ããã°ã©ãã³ã°ã«ã€ããŠèªãããšãã§ããŸããä»æ¥ã¯ãã³ãŒãå
ã§ãããšãã°ãã¡ãœããã®ååã ããæ®ããŸãgetvalidvesamodes()
ããµãŠã³ããšã³ãžã³
ãã€ãŠãDuke3Dã«ã¯å°è±¡çãªãµãŠã³ãã·ã¹ãã ãšã³ãžã³ããããŸããã圌ã¯ãµãŠã³ããšãã§ã¯ããããã¯ã¹ããŠãªããŒããã·ãã¥ã¬ãŒãããããšããã§ããŸããã詳现ã«ã€ããŠã¯ãreverb.cãã芧ãã ãããã¬ã¬ã·ãŒã³ãŒã
ãã«ãã³ãŒãã¯éåžžã«èªã¿ã«ããã§ããDuke Nukem 3Dããã³Buildãšã³ãžã³ïŒãœãŒã¹ã³ãŒãã®åé¡ãšã¬ã¬ã·ãŒããŒãžã«ããããã®å°é£ã®ãã¹ãŠã®çç±ããªã¹ãããŸãããæšå¥šèªæž
ãªããããè¯ãç»ã-ããã¯çŽ æŽãããã§ãïŒããããããªãã䞻匵ãããªããããªãã¯ã¹ãŒããŒãšãŽãšããŠIDãèªãããšãã§ããŸãïŒãã¥ãŒã¯ã»ãã±ã 3Dã®åµé - ããŒã¿ã«ã«åºã¥ãå¥ã®ã²ãŒã ã«ã€ããŠãèªã¿ã«ãªãããå Žåã¯ãShee Barrettã®ThiefïŒThe Dark Projectã«é¢ããåªããäºåŸåæããå§ãããŸãã
- ã±ã³ã»ã·ã«ããŒãã³ãšã®å€ãã®ã€ã³ã¿ãã¥ãŒïŒ
[ .]