看了猫的计划,虽说大半看不懂,也足够我反省一下了。虽然我每天都还蛮充实,但是没有像猫一样明确接下来几周的任务。正好殿下也布置了任务,这次完全按计划走就可以了,要职业化一点。
对我来说,现在最重要的是FamilyBlock,我必须在三周内把它拿出来。有点想不通是怎么碰撞检测的。不多写了,干事情了。
posted @
2008-11-11 20:47 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(161) |
评论 (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 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(83) |
评论 (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 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(172) |
评论 (0) |
编辑 收藏
摘要: 咳嗽……那个,大家好……我是新来的……请多多关照……
介绍了一下我未来的一段时间的中期计划
然后是没有什么可汇报的今天的成果汇报……
阅读全文
posted @
2008-11-10 23:31 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(127) |
评论 (0) |
编辑 收藏
我是标题党
今天除了看视频以外还去开了主席团的例会,可佳学长曰,出席是很好的习惯,表扬自己一下。
Windows API没有想象的那么难,我觉得现在只要给我一个vc和msdn,我就能自己写个开窗口,接受键盘和鼠标的程序,当然还不太熟练,这个需要慢慢练。
C++也没有想象中的那么难,什么封装继承虚函数的,往往我们听到这些名词被它吓住导致阻碍前进的步伐。也可能我现在只是知道语法,知道语法和用的帅肯定相当有差距,那么让我加油吧。
我在犹豫是不是真的要深入学习C++,怕时间不够,得赶紧的把Family Block做出来,时间压死人啊。
posted @
2008-11-10 22:23 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(175) |
评论 (0) |
编辑 收藏
不知道从什么时候开始没有了做作业的习惯,反正在我的记忆当中,已经很久没有做作业了。作业能拖多久就尽量拖多久,网络作业好几周之前就已经布置了,老师说过这次的作业比较多,可以过一段时间在交。本以为上周是最后期限,都准备写了的,结果课代表说了一句:“下周交”。结果又拖到了这一周,直到上课才慌慌忙忙的把作业Copy了,整整的Copy了两节课。图形学的作业也已经好久没交过了,自从那一次我不知道布置作业之后就一直拖着,拖着,拖到了现在。现在已经有五个程序要交上去了,可是到现在都还没有写。唉,无奈了。几乎每天都想着要写作业,可几乎从来都没按时完成过作业。
(...............)
posted @
2008-11-10 21:48 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(118) |
评论 (0) |
编辑 收藏
最近都没怎么写日志额。。貌似我总是n久之后突然发现然后道歉。。。要改正。。就像昨天敏敏说我学东西比较急一样。。好多毛病哦。。今天换了漂亮裙子换心情~~加油努力~~最近好像除了看书之外就是p了图。。有点低效率额。。加油糖糖
posted @
2008-11-10 18:35 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(88) |
评论 (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 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(171) |
评论 (2) |
编辑 收藏
今天总结一下前天发生的事情,把我们新的游戏设计图文显示出来。大家拍砖扔鸡蛋。正常的话明天定稿分析功能需求简要想一下怎么实现。
游戏名称暂定为“去你的”因为他最直白的表达出了这个游戏的目的。下面将图文并茂地介绍这个游戏。
简要的游戏界面如上图。。游戏开始出现一个小人脖子上拴一根绳子如图所示。界面上还需要初始我们的地图,也就是灰色部分显示,初始地图的不同也就决定了我们的Level。黄色的东西是小人需要到达的地方,也就是过关。游戏的基本思想就是玩家是用右块提供的砖块搭建他回家的路。但是不同于其他的是我们需要用键盘操作,即用键盘在绿色的块中选择需要下落的砖块,然后屏幕最上方就会掉下一块,玩家通过鼠标方向键操作摆好它的位置。原理同俄罗斯方块,也就是他会落到不能再落才会停下,但是永远不会消去。一块儿搭完了之后就可以继续选择绿色部分的方块。直到玩家认为小人可以沿着他搭建的路回家就好,这时候玩家选择Play然后就会是一个演示,一把剪子剪掉小人脖子上的绳子,刮起了风,小人就向右走。。向下掉。这是一种模式。砖块的同时还是管道,也就是说玩家搭完砖块之后发现通过风吹的方式到不了目的地,那他可以选择按空格键把地图翻转,小人就进管道里面了,但是之前搭好的砖块由于重力原因需要落到另一半,也就是天空变成了Ground。这样翻转之后他可以通过方向键进行攀登和跳跃在管道里面达到目的地。更缺德的设计是我们把管道设计成单方向的,也就是每一种砖块都由四个小方块组成,每个小方块之间都有一个门,然后门是单方向开的,这样子更折磨玩家了。
大致的就是这么个意思。哦了
posted @
2008-11-09 21:39 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(240) |
评论 (0) |
编辑 收藏
从我们的博客开篇到昨天已经是整整一个月了,从玛丽医生的截止日期到昨天也已经好几天了,而自己的玛丽医生还依旧遥遥无期。自己一直在Java与OpenGL中间徘徊,当王婷婷邀请我加入OpenGL学习小组的时候
我就问过,我们为什么不学Java呢?她当时的回答我也记不太清楚了。当时我只是犹豫了一下就答应了学习OpenGL,因为我认为无论学什么只要用心去学就能学会,但是令我失望了,虽然我很努力,OpenGL的程序抄了很多,但是依旧还没进入OpenGL的大门。已经一个多月过去了,我徘徊在OpenGL和Java之间真的有点累了,当昨天王婷婷提出让我在OpenGL和Java中选择一个的时候,我选择了Java。当我做出着一个选择的时候我深深地松了一口气,这个包袱压在我的身上已经很久了,毕竟我当时信誓旦旦的对王婷婷说我会坚持学习OpenGL的。下面这句话是对OpenGL说的:虽然我现在在那时放弃了你,但是我相信我们还会再见的,不是单独的和你相见,而是在Java中。
好了,玛丽的截止日期已经过了但是我还会继续写的,毕竟这是我们小组的第一个任务。
目标:两周之内Java写出一个玛丽医生。请各位先生和女士监督。
posted @
2008-11-08 22:05 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(157) |
评论 (0) |
编辑 收藏