|

楼主 |
发表于 2009-8-16 21:04:00
|
显示全部楼层
Re:使用函数思想,避免多个模块之间的实时数据更新
//Test01.cpp
#include "stdafx.h"
using namespace inst;
using namespace inst::i2d;
Bool g_bExit = False;
Bool g_bMyMsgLoop = True;
SmartPtr<CGameWnd> g_pWnd;
SmartPtr<CBuffer> g_pBuf;
SmartPtr<CSurf> g_pSurf;
SmartPtr<CFont> g_pFont;
const Int ScrW = 800;
const Int ScrH = 600;
void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam);
void Update();
void Render();
void Flush();
void OnReset(){}
void Init();
void Destroy(){}
Bool MsgLoop();
void Init()
{
g_pWnd = new CGameWnd(L"Test Window");
g_pWnd->SetCallback(&Wnd_WndProc);
g_pWnd->Show();
g_pWnd->Activate();
CGraphics::CreateGraphics(ScrW,ScrH,g_pWnd->GetHWnd());
g_pBuf = CGraphics::GetGraphics()->GetBackBuffer();
g_pSurf = new CSurf(ScrW,ScrH);
g_pSurf->FillRect(0,0,ScrW,ScrH,Rgb(0,0,0));
g_pSurf->SetColorKey(Rgb(0,0,0));
g_pFont = new CFont(L"");
}
void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
case WM_KEYDOWN:
break;
case WM_LBUTTONDOWN:
break;
case WM_DESTROY:
g_bExit=True;
break;
case WM_DISPLAYCHANGE:
CGraphics::GetGraphics()->Reset();
OnReset();
break;
case WM_PAINT:
if(False==g_bMyMsgLoop) Render();
break;
}
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
Init();
while(1)
if(MsgLoop()) break;
Destroy();
return 0;
}
Bool MsgLoop()
{
g_bMyMsgLoop = True;
if(g_bExit) return True;
::MSG msg = {0};
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
for(Int i=0; i<50; i++)
{
Update();
Sleep(1);
Flush();
}
Update();
Render();
Flush();
return False;
}
/////////////////////////////////////////////////////////////////
Float64 _t = 0;
Float64 _dt;
const Float64 TScale = 3600*24*7;
Float64 t() { return _t * TScale; }
Float64 dt() { return _dt * TScale; }
typedef MATRIX<Float64,2,1> Vec;
const Float64 AU = 149598000000; // m
const Float64 Year = 31556926;
const Float64 G = 6.67300e-11; // m3*kg-1*s-2
const Float64 M = 1.98892e30; // kg 太?
const Float64 m = 5.9742e24; // kg 地球
const Vec vm0 = {2*PI*AU/Year, 0}; // m/s 地球公?29805m/s
Vec sM = {0, 0};
Vec sm = {0, AU};
Vec vM = {0,0};
Vec vm = vm0;
Float64 R() { return Norm(sM - sm); }
Float64 F() { return (G * M * m) / (R() * R()); }
Vec Fm() { return F() * (sM - sm) / R(); }
Vec FM() { return -1.0 * Fm(); }
Vec sM_next() { return sM + vM * dt(); }
Vec sm_next() { return sm + vm * dt(); }
Vec vM_next() { return vM + (FM()/M) * dt(); }
Vec vm_next() { return vm + (Fm()/m) * dt(); }
Vec _sM_next;
Vec _sm_next;
Vec _vM_next;
Vec _vm_next;
Float64 LogicFps() { return 1/_dt; }
void Update()
{
static Int t1 = timeGetTime();
Int t2 = timeGetTime();
_dt = MIN(t2-t1, 50) / 1000.0;
t1 = t2;
_sM_next = sM_next();
_sm_next = sm_next();
_vM_next = vM_next();
_vm_next = vm_next();
}
void Flush()
{
_t += _dt;
sM = _sM_next;
sm = _sm_next;
vM = _vM_next;
vm = _vm_next;
}
/////////////////////////////////////////////////////////////////
const Int PxPerAU = 200;
const Float64 k = PxPerAU / AU;
Vec ToScreen(Vec world) { return Vec().Set(k*world.x + ScrW/2, ScrH/2 - k*world.y); }
Vec ToWorld(Vec screen) { return Vec().Set(screen.x/k - ScrW/2, - screen.y/k - ScrH/2); }
void RenderStars(CSurfBase *surf, Float color_k)
{
surf->FillEllipse(UNVEC2(ToScreen(sM)), 10, 10, Rgb(UNVEC3(Float3().Set(255,128,0) * color_k)));
surf->FillEllipse(UNVEC2(ToScreen(sm)), 5, 5, Rgb(UNVEC3(Float3().Set(0,128,255) * color_k)));
}
void Render()
{
RenderStars(g_pSurf, 0.75f);
//--------------------------------------------------------------------
g_pBuf->FillRect(0,0,g_pBuf->GetW(),g_pBuf->GetH(),Rgb(0,0,0));
g_pBuf->Blt(0, 0, g_pSurf, 0, 0, g_pSurf->GetW(), g_pSurf->GetH());
RenderStars(g_pBuf, 1.0f);
g_pBuf->DrawLine(ScrW/2, 0, ScrW/2, ScrH, Rgb(0,255,0));
g_pBuf->DrawLine(0, ScrH/2, ScrW, ScrH/2, Rgb(0,255,0));
g_pBuf->DrawLine(ScrW/2, 0, ScrW/2-8, 16, Rgb(0,255,0));
g_pBuf->DrawLine(ScrW/2, 0, ScrW/2+8, 16, Rgb(0,255,0));
g_pBuf->DrawLine(ScrW, ScrH/2, ScrW-16, ScrH/2-8, Rgb(0,255,0));
g_pBuf->DrawLine(ScrW, ScrH/2, ScrW-16, ScrH/2+8, Rgb(0,255,0));
g_pBuf->DrawText(CStr(L"Logic FPS = ") + ToStr((Int)(LogicFps())), 2, 0, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"Space Scale = ") + ToStr(PxPerAU) + L"px : 1 AU", 2, 16, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"Time Scale = 1s : ") + ToStr(TScale) + L"s", 2, 32, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"Time = ") + ToStr(t()), 2, 48, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"sM = (") + ToStr(sM.x) + ", " + ToStr(sM.y) + L")",
2, 64, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"sm = (") + ToStr(sm.x) + ", " + ToStr(sm.y) + L")",
2, 80, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"vM = (") + ToStr(vM.x) + ", " + ToStr(vM.y) + L")",
2, 96, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"vm = (") + ToStr(vm.x) + ", " + ToStr(vm.y) + L")",
2, 112, g_pFont, Rgb(0,255,0), 1);
g_pBuf->DrawText(CStr(L"|F| = ") + ToStr(F()),
2, 128, g_pFont, Rgb(0,255,0), 1);
//--------------------------------------------------------------------
CGraphics::GetGraphics()-> resent();
} |
|