看了貓的計劃,雖說大半看不懂,也足夠我反省一下了。雖然我每天都還蠻充實,但是沒有像貓一樣明確接下來幾周的任務。正好殿下也布置了任務,這次完全按計劃走就可以了,要職業化一點。
對我來說,現在最重要的是FamilyBlock,我必須在三周內把它拿出來。有點想不通是怎么碰撞檢測的。不多寫了,干事情了。
posted @
2008-11-11 20:47 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(165) |
評論 (2) |
編輯 收藏
11.11 游戲需求分析
11.12 實現思路匯報
11.13 實現思路討論定稿
11.14——11.23 基本功能實現(基本功能包括:材料自由選擇、數目正確減少、磚塊可控制降落、小人控制走動、地圖翻轉實現、重力效果實現)
11.24 匯報展示及修改
11.25——11.30 第一部分附加功能實現(包括:美工頁面、動畫效果、聲音效果)
12.1 匯報展示及修改
12.2——12.7 第二部分附加功能實現(包括:選關、存檔)
12.8——12.9匯報展示及修改
posted @
2008-11-11 18:33 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(88) |
評論 (0) |
編輯 收藏
目的是把DX9、DX10、OpenGL、Software等圖形庫封裝到一個統一的圖形接口,把DInput、WINAPI的輸入控制封裝到一個統一的輸入接口,在用戶機器上自動選擇一個可用的接口使用(譬如Vista默認選擇DX10,XP默認選擇DX9等)。如果以后有必要,也只需要再定義一個接口,就可以把任何的同功能的多個庫封裝到一個統一的接口,并獲取到一個默認的接口使用。另外,當用戶機器上沒有可用庫的時候,可以“優雅”的提示用戶,而不是彈出系統默認的“缺少XXX.DLL,程序無法啟動”。
主函數:
#include "stdafx.h"
#include "FWBase.h"
[
module (name="TestFramework")
];
int _tmain(int argc, _TCHAR* argv[])
{
InitFramework();
CComPtr<IGraphicsLibrary> pGL;
if (FAILED(GetDefaultFrameworkLibrary(&pGL)))
{
wprintf(L"No default graphics library found.");
ATLASSERT(0);
return 1;
}
CComBSTR bsGLName;
if (SUCCEEDED(pGL->GetLibraryName(&bsGLName)))
{
wprintf(L"Default graphics library is: %s", (BSTR)bsGLName);
}
return 0;
}
接口:
[
object,
uuid("914F136A-FCC8-4e1b-9E5D-95797B6DE183")
]
__interface ILibrary : public IDispatch
{
[id(1), helpstring("Init the library. Return E_FAIL if failed.")]
HRESULT InitLibrary();
[id(2), helpstring("Retrieves the name of this library")]
HRESULT GetLibraryName(BSTR *pbsName);
};
[
object,
uuid("9E979A9A-A271-496f-B04E-7A9AE0BAE335")
]
__interface IGraphicsLibrary : public ILibrary
{
//暫時還什么也沒寫
};
Framework接口:
HRESULT InitFramework();
HRESULT RegisterFrameworkLibrary(REFIID idLibaryType, ILibrary *pLibrary);
HRESULT GetDefaultFrameworkLibrary(REFIID idLibraryType, ILibrary **ppLibrary);
template <typename Interface, typename ClassType>
HRESULT RegisterFrameworkLibrary();
template <typename LibraryType>
HRESULT GetDefaultFrameworkLibrary(LibraryType **ppLibrary);
運行效果:
On Vista:
Default graphics library is: Direct3D 10 Library
On XP:
No default graphics library found.
(Direct3D 9接口尚未編寫)
posted @
2008-11-11 09:27 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(184) |
評論 (0) |
編輯 收藏
摘要: 咳嗽……那個,大家好……我是新來的……請多多關照……
介紹了一下我未來的一段時間的中期計劃
然后是沒有什么可匯報的今天的成果匯報……
閱讀全文
posted @
2008-11-10 23:31 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(139) |
評論 (0) |
編輯 收藏
我是標題黨
今天除了看視頻以外還去開了主席團的例會,可佳學長曰,出席是很好的習慣,表揚自己一下。
Windows API沒有想象的那么難,我覺得現在只要給我一個vc和msdn,我就能自己寫個開窗口,接受鍵盤和鼠標的程序,當然還不太熟練,這個需要慢慢練。
C++也沒有想象中的那么難,什么封裝繼承虛函數的,往往我們聽到這些名詞被它嚇住導致阻礙前進的步伐。也可能我現在只是知道語法,知道語法和用的帥肯定相當有差距,那么讓我加油吧。
我在猶豫是不是真的要深入學習C++,怕時間不夠,得趕緊的把Family Block做出來,時間壓死人啊。
posted @
2008-11-10 22:23 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(179) |
評論 (0) |
編輯 收藏
不知道從什么時候開始沒有了做作業的習慣,反正在我的記憶當中,已經很久沒有做作業了。作業能拖多久就盡量拖多久,網絡作業好幾周之前就已經布置了,老師說過這次的作業比較多,可以過一段時間在交。本以為上周是最后期限,都準備寫了的,結果課代表說了一句:“下周交”。結果又拖到了這一周,直到上課才慌慌忙忙的把作業Copy了,整整的Copy了兩節課。圖形學的作業也已經好久沒交過了,自從那一次我不知道布置作業之后就一直拖著,拖著,拖到了現在。現在已經有五個程序要交上去了,可是到現在都還沒有寫。唉,無奈了。幾乎每天都想著要寫作業,可幾乎從來都沒按時完成過作業。
(...............)
posted @
2008-11-10 21:48 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(128) |
評論 (0) |
編輯 收藏
最近都沒怎么寫日志額。。貌似我總是n久之后突然發現然后道歉。。。要改正。。就像昨天敏敏說我學東西比較急一樣。。好多毛病哦。。今天換了漂亮裙子換心情~~加油努力~~最近好像除了看書之外就是p了圖。。有點低效率額。。加油糖糖
posted @
2008-11-10 18:35 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(92) |
評論 (0) |
編輯 收藏
天地之靈16:11:17
然后呢,說一個最最最特殊的消息
天地之靈16:11:21
WM_QUIT
孫婷16:11:22
?
天地之靈16:11:36
這是唯一一個跟窗口沒有關系的消息
天地之靈16:11:44
它表示:這個程序要結束了
天地之靈16:12:14
那么,最外面我們一開始那個循環,就應該結束了
天地之靈16:12:39
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
和
while( true )
{ GetMessage(&msg,NULL,0,0));
TranslateMessage(&msg);
DispatchMessage(&msg);
}
回到婷婷剛才的問題
天地之靈16:13:11
GetMessage的作用就是:等待一個消息。如果這個消息是WM_QUIT,那么返回FALSE。否則返回TRUE
wtt PureMilk16:13:52
明白
天地之靈16:13:54
所以它們的區別就是,前面一個是標準的,當收到WM_QUIT消息的時候,循環結束,正常退出程序。
而后面那個,因為不能接受WM_QUIT消息,所以永遠不會結束
天地之靈16:14:40
WM_QUIT的作用糖糖明白了嗎
wtt PureMilk16:14:52
等一下又不明白了
天地之靈16:14:57
孫婷16:15:08
恩呢
天地之靈16:15:16
哪里不明白了
wtt PureMilk16:15:30
在我們的WindowProc里面是不會出現WM_QUIT的是嗎
天地之靈16:15:37
是的。
天地之靈16:15:43
WM_QUIT是唯一一個與窗口無關的消息
wtt PureMilk16:15:44
那它是怎么來的呢
孫婷16:15:52
WM_QUIT。。是不是就相當于我按下esc或者alt+f4的時候然后處理消息就推出了。。關了窗口了
天地之靈16:15:56
它的來源是PostQuitMessage函數
天地之靈16:16:05
糖糖:不完全是。
wtt PureMilk16:16:09
啊我知道了
天地之靈16:16:18
其實,當你按下Alt+F4的時候,分為三個步驟
wtt PureMilk16:16:20
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的結束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
天地之靈16:16:35
1、系統發出WM_CLOSE,表示用戶試圖關閉窗口
天地之靈16:16:49
當然,這時候你可以彈一個提示確認一下
wtt PureMilk16:16:57
MessageBox(hwnd,"是否真的結束?","weixin",MB_YESNO))
天地之靈16:17:13
2、DestroyWindow,真的關閉窗口,發出一個WM_DESTORY
天地之靈16:17:32
3、如果這個窗口關閉就意味著程序結束,那么處理函數里發出一個PostQuitMessage
天地之靈16:17:42
然后GetMessage返回FALSE,程序結束
wtt PureMilk16:18:06
徹底明白
孫婷16:18:36
太神奇了
天地之靈16:18:52
好,還有兩個內容,第一節課就結束了
天地之靈16:19:07
內容1是:DefWindowProc
天地之靈16:19:32
實際上系統發出的消息非常非常的多,種類十分十分復雜
天地之靈16:19:40
而我們實際上只關心我們需要關心的消息
天地之靈16:19:56
而對于我們不關心的消息,如果我們不做處理,有時候就會出問題
天地之靈16:20:12
比如
case WM_CLOSE:
return;
窗口就關不掉
天地之靈16:20:33
對于這一類消息,我們通常是希望讓Windows幫我們處理
天地之靈16:20:42
換句話說,“一般的窗口應該怎么做,就怎么做”
天地之靈16:20:53
這就是DefWindowProc的作用
天地之靈16:21:08
舉例來說,它會在WM_CLOSE的時候自動DestoryWindow
wtt PureMilk16:21:15
真的耶
wtt PureMilk16:21:22
原來還是關掉了
天地之靈16:22:22
另外,DefWindowProc也是一個標準的WindowProc
天地之靈16:22:53
換句話說,如果你什么消息都不想自己處理,你可以直接把DefWindowProc作為窗口類的WindowProc
天地之靈16:23:25
內容2:PeekMessage
天地之靈16:23:39
我們知道GetMessage的意思是“等著一個消息的發生”
天地之靈16:23:57
而我們在還沒有消息發生的時候就什么也不能做了
天地之靈16:24:36
而對于游戲來說,我們要求在沒有消息發生的時候,不斷地重新畫整個畫面
天地之靈16:25:01
所以我們不能被GetMessage占住
wtt PureMilk16:25:15
有道理
天地之靈16:25:21
PeekMessage的意思是:
如果有消息需要處理,返回TRUE,否則返回FALSE
天地之靈16:26:07
另外它的參數有很多種,比如這個被取出的消息是否從消息隊列中清除
天地之靈16:27:21
所以,我們可以寫
while (true)
{
if (PeekMessage(xxxx, xxx, PM_REMOVE))
{
Tranlate
Dispatch()
}
else
{
doSomething();
Sleep(0);
}
}
天地之靈16:27:43
Sleep(0);的目的是讓出CPU控制權,使得其他程序可以流暢運行,詳細的內容以后再講解
wtt PureMilk16:28:03
耶,那豈不是又像我剛寫的那樣關不掉了
天地之靈16:28:12
是的
天地之靈16:28:29
PeekMessage的一個不同的地方就是,它收到WM_QUIT時不會做什么特殊處理
天地之靈16:28:40
我們要自己來做這個處理
天地之靈16:28:57
while (true)
{
if (PeekMessage(xxxx, xxx, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
Tranlate
Dispatch()
}
else
{
doSomething();
Sleep(0);
}
}
天地之靈16:29:56
另外,我讀過的代碼里,有許多程序沒有這個else。婷婷能分析下這樣會有什么不好么?
天地之靈16:30:16
while (true)
{
if (PeekMessage(xxxx, xxx, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
Tranlate
Dispatch()
}
doSomething();
Sleep(0);
}
他們這么寫
wtt PureMilk16:30:24
cpu占用率比較高?
天地之靈16:30:29
不是
天地之靈16:30:34
仔細想想
天地之靈16:31:13
答案是,這樣的代碼每次只能處理一個消息
天地之靈16:31:19
然后就進入了doSomething
wtt PureMilk16:31:44
哦……
天地之靈16:31:47
1、如果doSomething是個非常慢的函數,比如渲染圖形,那么對消息的處理也會很慢很慢
wtt PureMilk16:31:56
知道了
天地之靈16:32:02
積壓的消息不能及時處理,就容易被windows認為沒有響應
wtt PureMilk16:32:04
啊好有意思啊
天地之靈16:32:14
2、最壞的情況,如果doSomething里每次都發出了一個消息
天地之靈16:32:30
那么消息就永遠處理不完了,最后程序就會出現錯誤
wtt PureMilk16:32:38
嗯~
wtt PureMilk16:33:02
哇貓我自己學的話要學多久才能明白這一點哦
天地之靈16:33:19
while (true)
{
if (PeekMessage(xxxx, xxx, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
Tranlate
Dispatch()
}
else
{
doSomething();
Sleep(0);
}
}
while (true)
{
while (PeekMessage(xxxx, xxx, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
Tranlate
Dispatch()
}
if (msg.message == WM_QUIT) break;
doSomething();
Sleep(0);
}
這兩段代碼卻是等價的
天地之靈16:34:05
第二段代碼里把if改為了while,意思就是:把所有的消息處理完,然后才做我想做的事情
wtt PureMilk16:34:24
嗯~~明白
天地之靈16:34:39
另外,if/while (PeekMessage(xxxx, xxx, PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
這個比較有時候比較討厭,我們可以更“優雅”的來寫
wtt PureMilk16:35:00
怎么個優雅法?
天地之靈16:35:23
if/while (PeekMessage(xxxx, xxx, PM_NOREMOVE))
{
if (GetMessage(xxx, xxx))
{
Tranlate
Dispatch
}
else
break;
wtt PureMilk16:35:50
wow
天地之靈16:35:55
注意PeekMessage的參數變為了不移出
天地之靈16:36:03
然后繼續利用GetMessage的返回值
孫婷16:36:18
這樣有什么好處呢?
天地之靈16:36:23
比較帥
wtt PureMilk16:36:25
漂亮
孫婷16:36:27
- -0
天地之靈16:36:30
這個技巧我是在我遺留的早期代碼里學到的
孫婷16:36:31
很好
天地之靈16:36:37
我已經忘記早期的我在哪里學到的了
wtt PureMilk16:36:40
是很漂亮,漂亮多了
天地之靈16:37:25
天地之靈16:37:36
關于消息、消息循環的所有內容都已經講完了
wtt PureMilk16:37:58
貓我好崇拜你喔
天地之靈16:38:14
孫婷16:38:24
哇卡卡卡~~~我今天會失眠。。
wtt PureMilk16:40:58
天地之靈(402740419) 16:22:53
換句話說,如果你什么消息都不想自己處理,你可以直接把DefWindowProc作為窗口類的WindowProc
這句話的意思是,什么消息都自己動手寫代碼嗎
天地之靈16:41:09
不是
天地之靈16:41:23
如果你想寫一個“非常標準”的窗口,什么消息你都不需要知道
wtt PureMilk16:41:24
那是什么都不自己動手寫
天地之靈16:41:32
對,你就可以什么都不寫
wtt PureMilk16:41:45
哦哦哦我明白了
孫婷16:41:47
為什么呢?
wtt PureMilk16:41:49
看錯了
孫婷16:42:12
自己寫的和標準窗口是不一樣的么?
wtt PureMilk16:42:16
就是連WindowProc都不要了對吧
天地之靈16:42:18
恩
wtt PureMilk16:42:28
誰的恩?
孫婷16:42:33
那我怎么在這個窗口做什么啊。。
天地之靈16:42:33
恩婷婷的
天地之靈16:42:54
有時候就什么也不做啊
天地之靈16:43:19
一般在游戲里寫WindowProc就是為了一個WM_CLOSE一個WM_DESTORY
天地之靈16:43:28
在很特殊的時候也許會連這兩個也用不著
posted @
2008-11-09 22:10 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(175) |
評論 (2) |
編輯 收藏
今天總結一下前天發生的事情,把我們新的游戲設計圖文顯示出來。大家拍磚扔雞蛋。正常的話明天定稿分析功能需求簡要想一下怎么實現。
游戲名稱暫定為“去你的”因為他最直白的表達出了這個游戲的目的。下面將圖文并茂地介紹這個游戲。
簡要的游戲界面如上圖。。游戲開始出現一個小人脖子上拴一根繩子如圖所示。界面上還需要初始我們的地圖,也就是灰色部分顯示,初始地圖的不同也就決定了我們的Level。黃色的東西是小人需要到達的地方,也就是過關。游戲的基本思想就是玩家是用右塊提供的磚塊搭建他回家的路。但是不同于其他的是我們需要用鍵盤操作,即用鍵盤在綠色的塊中選擇需要下落的磚塊,然后屏幕最上方就會掉下一塊,玩家通過鼠標方向鍵操作擺好它的位置。原理同俄羅斯方塊,也就是他會落到不能再落才會停下,但是永遠不會消去。一塊兒搭完了之后就可以繼續選擇綠色部分的方塊。直到玩家認為小人可以沿著他搭建的路回家就好,這時候玩家選擇Play然后就會是一個演示,一把剪子剪掉小人脖子上的繩子,刮起了風,小人就向右走。。向下掉。這是一種模式。磚塊的同時還是管道,也就是說玩家搭完磚塊之后發現通過風吹的方式到不了目的地,那他可以選擇按空格鍵把地圖翻轉,小人就進管道里面了,但是之前搭好的磚塊由于重力原因需要落到另一半,也就是天空變成了Ground。這樣翻轉之后他可以通過方向鍵進行攀登和跳躍在管道里面達到目的地。更缺德的設計是我們把管道設計成單方向的,也就是每一種磚塊都由四個小方塊組成,每個小方塊之間都有一個門,然后門是單方向開的,這樣子更折磨玩家了。
大致的就是這么個意思。哦了
posted @
2008-11-09 21:39 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(265) |
評論 (0) |
編輯 收藏
從我們的博客開篇到昨天已經是整整一個月了,從瑪麗醫生的截止日期到昨天也已經好幾天了,而自己的瑪麗醫生還依舊遙遙無期。自己一直在Java與OpenGL中間徘徊,當王婷婷邀請我加入OpenGL學習小組的時候
我就問過,我們為什么不學Java呢?她當時的回答我也記不太清楚了。當時我只是猶豫了一下就答應了學習OpenGL,因為我認為無論學什么只要用心去學就能學會,但是令我失望了,雖然我很努力,OpenGL的程序抄了很多,但是依舊還沒進入OpenGL的大門。已經一個多月過去了,我徘徊在OpenGL和Java之間真的有點累了,當昨天王婷婷提出讓我在OpenGL和Java中選擇一個的時候,我選擇了Java。當我做出著一個選擇的時候我深深地松了一口氣,這個包袱壓在我的身上已經很久了,畢竟我當時信誓旦旦的對王婷婷說我會堅持學習OpenGL的。下面這句話是對OpenGL說的:雖然我現在在那時放棄了你,但是我相信我們還會再見的,不是單獨的和你相見,而是在Java中。
好了,瑪麗的截止日期已經過了但是我還會繼續寫的,畢竟這是我們小組的第一個任務。
目標:兩周之內Java寫出一個瑪麗醫生。請各位先生和女士監督。
posted @
2008-11-08 22:05 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(166) |
評論 (0) |
編輯 收藏