飞飞世界论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 14703|回复: 0
打印 上一主题 下一主题

昼夜系统

[复制链接]

197

主题

203

帖子

1064

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1064
QQ
跳转到指定楼层
楼主
发表于 2016-1-10 03:46:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.
( ^% X) r  w! v# i8 e8 A8 I你走在 world.h* N& D: T0 r4 u9 M
晚上搜索
Code:
public:
        BOOL                   InitWorldEnvir();             // 24½Ã°£ Light ¼3ᤠ1×±aŸ èˉ°æ Ãê±aè*
#if __VER >= 15// __GUILD_HOUSE
        void                   InProcessing();               // gmpbigsun : Çöàç¿ùμå·Î áøàԽà ÇÑ1ø è£Ãaμê
        void                   OutProcessing();              // gmpibgsun : Çöàç¿ùμå¿¡¼* Åeàå½Ã ÇÑ1ø è£Ãaμê
#endif
        // Render
        void                   Projection(LPDIRECT3DDEVICE9 pd3dDevice, int nWidth, int nHeight );
        void                   Render(LPDIRECT3DDEVICE9 pd3dDevice, CD3DFont* pFont = NULL );
        void                   RenderBase(LPDIRECT3DDEVICE9 pd3dDevice, CD3DFont* pFont );
               
        // Light, Camera and etc...

2 r/ d6 X( z8 q( a- S9 I4 N' ?
下面插入
Code:
        bool                   IsNight();
        FLOAT                  GetRealTime();

% ?5 d0 V1 ~/ i' ~
然后你进入1 e1 C  P/ z# m0 x9 @- {
World3D.cpp
搜索
Code:
// Ä«¸T¶ó Ãæμ1üũ½Ã¿¡¸¸ ¾2′Âμí..
BOOLCWorld::CheckBound(D3DXVECTOR3* vPos,D3DXVECTOR3* vDest,D3DXVECTOR3* vOut,FLOAT* fLength )
{
        D3DXVECTOR3 tempVec=(*(vPos)-*(vDest));///10.0f;
        floatlength=D3DXVec3Length(&tempVec);
        D3DXVec3Normalize(&tempVec,&tempVec);
        tempVec/=10;
        D3DXVECTOR3 tempVec2=*(vDest);
        D3DXVECTOR3 vDist1, vDist2;
        float tempheight;
        BOOL    b1,b2;
        b1 = FALSE;    b2 = FALSE;
        tempVec2 += (tempVec * 10);           // Ä«¸T¶ó°¡ àú2ù áöÇü¿¡ 2¸μé¾î°¡¼* á»»°′ù.
        
        BOOL bWaterChkDn = FALSE;
        BOOL bWaterChkUp = FALSE;
        FLOAT fWaterHeight = 0.0f;
        LPWATERHEIGHT pWaterHeight =GetWaterHeight( *vDest );
        if( pWaterHeight &&
               ( pWaterHeight->byWaterTexture& (byte)(~MASK_WATERFRAME)) == WTYPE_WATER )
        {
               fWaterHeight =(FLOAT)pWaterHeight->byWaterHeight;
               //vDest->y += 0.5f;
               
               if( fWaterHeight < vDest->y)
               {
                       bWaterChkDn = TRUE;
               }
               else
               {
                       bWaterChkUp = TRUE;
               }
        }                                    
        for( int i = 0; i < int( length * 10 );i++ )
        {
               tempVec2+=tempVec;
               tempheight=GetLandHeight(tempVec2.x, tempVec2.z );
               #if __VER >= 11 //__FIX_PICKING
               // Ä«¸T¶ó¸| ¾à°£ ′õ μé¾îáÖ±aà§Çؼ* ¼öᤠ- 07.10.24 - micky
               if(tempVec2.y<tempheight+0.6f)
               #else
               if(tempVec2.y<tempheight+0.3f)
               #endif
               {
                       b1 = TRUE;
                       vDist1 = tempVec2 -*vDest;           // »ç¶÷¿¡¼* ±3Â÷ᡱîáöàÇ1æÇao¤Åí
//                     *(vOut)=tempVec2;
//                     vOut->y+=1.1f;
//                     return TRUE;
                       break;
               }
               // Äé¸ˉÅí°¡ 1°à§¿¡ àÖ°í, àá±aáö¾ê¾ò′ù¸é ¼ö¸é Ãæμ1üũÇÏ¿© Ä«¸T¶ó°¡ 1°¼óืΠ¾èμé¾î°¡°Ô Ã3¸®ÇÔ.
               D3DXVECTOR3 vWaterVec = tempVec2;
               //vWaterVec.y+=0.5f;
               if( bWaterChkDn )
               {
                       if(vWaterVec.y<fWaterHeight+0.3f)
                       {
                               b1 = TRUE;
                               vDist1 =vWaterVec - *vDest;   
                               break;
                       }
               }
#if __VER < 10
               else
               // Äé¸ˉÅí°¡ 1°à§¿¡ àÖ°í, àá°å′ù¸é¼ö¸é Ãæμ1üũÇÏ¿© Ä«¸T¶ó°¡ 1°1ÛืΠ¸ø3a°¡°Ô Ã3¸®ÇÔ
               if( bWaterChkUp )
               {
                       if(vWaterVec.y>fWaterHeight-0.3f)
                       {
                               b1 = TRUE;
                               vDist1 =vWaterVec - *vDest;   
                               break;
                       }
               }
#endif
        }
        D3DXVECTOR3 vIntersect;
        BOOL bRet = IntersectObjLine2(&vIntersect, *vDest, *vPos, TRUE );
        if( bRet )
        {
               b2 = TRUE;
               vDist2 = vIntersect - *vDest;         // »ç¶÷¿¡¼* ±3Â÷ᡱîáöàÇ 1æÇao¤Åí
//             *vOut = vIntersect;
        }
        FLOAT   fDist1,fDist2;
        if( b1 == TRUE && b2 == TRUE ) // áöÇüàì¶û ¿àoêá§Æ® ¸eμÎ ±3Â÷Çß′ù
        {
               fDist1 = D3DXVec3LengthSq(&vDist1 );
               fDist2 = D3DXVec3LengthSq(&vDist2 );
               if( fDist1 < fDist2 )          // ±×áß °¡±î¿î3eืΠ¾¸
               {
                       *fLength =D3DXVec3Length( &vDist1 );
                       *vOut = tempVec2;
               }
               else
               {
                       *fLength =D3DXVec3Length( &vDist2 );
                       *vOut= vIntersect;
               }
               return TRUE;
        } else
        if( b1 )       //áöÇü¿¡¸¸ oÎμúÇû′ù.
        {
               *fLength = D3DXVec3Length(&vDist1 );         
               *vOut = tempVec2;
               return TRUE;
        } else
        if( b2 )       //¿àoêá§Æ®¿¡¸¸ oÎμúÇû′ù
        {
               *fLength = D3DXVec3Length(&vDist2 );         
               *vOut = vIntersect;
               return TRUE;
        }
        // ¾Æ1«μ¥μμ oÎμúè÷áö ¾ê¾ò′ù.
        *fLength = length;
        return FALSE;
}
! I' L* i1 o( M
下面插入
Code:
#ifdef __CLIENT
boolCWorld::IsNight(){
return (g_GameTimer.m_nHour-1 <= 6 || g_GameTimer.m_nHour-1 >= 18 );
}
FLOATCWorld::GetRealTime()
{
FLOAT nRlTime = 0;
nRlTime =(FLOAT)(g_GameTimer.m_nHour-1)*2;
if(g_GameTimer.m_nMin < 30 )
--nRlTime;
if(g_GameTimer.m_nHour-1 == 23 && g_GameTimer.m_nMin > 45 )
nRlTime+=0.5F;
if( nRlTime >24 )
{
return((-1)*(nRlTime - 48 ));
}
return nRlTime;
}
#endif
8 i$ p* a' E* |0 P( F$ E
dadrunter set ihr
Code:
voidCWorld::SetLight( BOOL bLight )

# L$ H" H( E3 k- P! u. U4 f5 ]* c' \& ~
在这个函数研究了
Code:
                       pLight->SetDir(m_v3LightDir.x, m_v3LightDir.y, m_v3LightDir.z );
                       pLight->Appear(m_pd3dDevice, TRUE );
        
                       DWORD dwR, dwG, dwB;
                       dwR = (DWORD)(pLight->Ambient.r * 255 );
                       dwG = (DWORD)(pLight->Ambient.g * 255 );
                       dwB = (DWORD)(pLight->Ambient.b * 255 );
                       dwAmbient =D3DCOLOR_ARGB( 255, dwR, dwG, dwB );
               }
        }
        else
        {
0 Q/ I$ p' x& Q; _$ S  Z3 _
后面添加
Code:
#ifdef __DAY_NIGHT
if( !m_bIsIndoor){
m_fFogStartValue =10.0F;
m_fFogEndValue = 70.0F + GetRealTime() * 30.0F;
m_fFogDensity = 0.0F;
m_v3LightDir.x = 0.0F;
m_v3LightDir.y = -1.0F;
m_v3LightDir.z = 0.0F;
}
#endif //__DAY_NIGHT
, ?4 C& S, L* [  t& U
现在你搜索
Code:
if( m_bIsIndoor )
        {
               if( pLight )
               {              
                       // ཿμ oˉè*
                       pLight->Diffuse.r =((m_dwDiffuse>>16) & 0xff) / 255.f;
                       pLight->Diffuse.g =((m_dwDiffuse>>8) & 0xff)  /255.f;
                       pLight->Diffuse.b =((m_dwDiffuse) & 0xff)     / 255.f;
+ x3 \  @6 E+ ^. Q2 J
后面补充
Code:
        if( m_bIsIndoor
#ifdef __DAY_NIGHT
|| IsNight()
#endif //__DAY_NIGHT
)
        {
               if( pLight )
               {              
                       // ཿμ oˉè*
                       pLight->Diffuse.r =((m_dwDiffuse>>16) & 0xff) / 255.f;
                       pLight->Diffuse.g =((m_dwDiffuse>>8) & 0xff)  /255.f;
                       pLight->Diffuse.b =((m_dwDiffuse) & 0xff)     / 255.f;

) i5 C/ F, m. z. x2 o' _
然后在
neuz/versioncommon.h
8 {1 l+ o4 U5 B" Y' h1 x6 w添加定义:
Code:
#define__DAY_NIGHT

8 V- z' S# a" D5 u& y. F
Fertig
+ w; h4 P5 t# W1 L- n! S% _
& \/ G6 |) l, N% |6 h; `8 x

0 B8 B. K; D7 v8 j. P3 `9 f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|飞飞世界技术论坛  

GMT+8, 2025-5-1 20:37 , Processed in 0.063217 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表