CEGUI的Event動畫

在以前介紹過CEGUI的Animation部分,在其中的Subscription的Element並未作出解釋,今天我們來解釋一下這個.

先來回顧一個CEGUI帶的Sample的Animation文件:

<?xml version="1.0" ?>
<Animations>

    <AnimationDefinition name="Example1A" duration="0.3" replayMode="once">
        <Affector property="Alpha" interpolator="float">
            <KeyFrame position="0" value="1" />
            <KeyFrame position="0.3" value="0.66" progression="quadratic decelerating" />
        </Affector>
        <Subscription event="MouseLeavesArea" action="Start" />
    </AnimationDefinition>

    <AnimationDefinition name="Example1B" duration="0.3" replayMode="once">
        <Affector property="Alpha" interpolator="float">
            <KeyFrame position="0" value="0.66" />
            <KeyFrame position="0.3" value="1" progression="quadratic accelerating" />
        </Affector>
        <Subscription event="MouseEntersArea" action="Start" />
    </AnimationDefinition>

</Animations>

Subscription是Event動畫的定義,類似於:當發生MouseEntersArea事件的時候,就會觸發這個動畫的Start行為.

Read more »

CEGUI的Event部分

CEGUI的Event部分據說做的比較複雜,但是看到MyGUI的託管機制實現的事件系統覺得貌似MyGUI的應該更複雜一點.

CEGUI的事件還是比較直觀的,下面寫篇小網誌來簡單介紹一下CEGUI的事件系統.

在挂件Window的這個Base Class是繼承了PropertySet和EventSet類的,PropertySet類以前已經介紹過,現在來介紹一下稍微比PropertySet複雜的EventSet.

EventSet負責維護著一個Event的Map,這個Map大概這樣:

std::map<String,Event*> d_events;

其中String表示事件名稱,而Event*則對應事件體.

我們首先來看EventSet的接口,她是如何給一個事件添加一個Event綁定函式的.

EventSet下面有如下接口:

virtual Event::Connection subscribeEvent(const String& name, Event::Subscriber subscriber);
virtual Event::Connection subscribeEvent(const String& name, Event::Group group, Event::Subscriber subscriber);
virtual void fireEvent(const String& name, EventArgs& args, const String& eventNamespace = "");

subscribeEvent表示綁定一個函式指針到某個事件上,而fireEvent則表示執行這個事件綁定的所有函式.

客戶在使用的時候,先調用subscribeEvent綁定了自己的處理事件的函式,然後當這個事件發生的時候便可以自動執行這些函式。
Read more »

CEGUI的動畫解析

CEGUI能夠支援的動畫有很多種,應該說凡是WindowsProperties namespace裡面有的Window的Property,她都能夠支援。這是CEGUI的動畫部分設計的非常靈活導致的.

我們首先來看AnimationManager,這是所有Animation的總管.

她的關鍵的成員變量有如下幾種類型:

std::map<String, Interpolator*> d_interpolators;
std::map<String, Animation*> d_animations;
std::multimap<Animation*, AnimationInstance*> d_animationInstances;

Interpolator類是一個計算器類,用來計算兩個關鍵幀之間的屬性增量值.

Animation是動畫體類,單個動畫體的內容就在這個類裡.

AnimationInstance則用來控制這個Animation的播放和鏈接到Window操作.

首先我們來看Interpolator類,這是一個純虛類,聲明如下:

Read more »

Qt和Ogre的自由結合

Qt和Ogre的結合這個問題在以前做畢設的時候就已經處理過,但是並不是很完美的解決掉.

比如說:Ogre的渲染窗口無法固定大小,會隨著MainWindow的變化而變化.

今天就來解決這個問題.

如果我們有以下的需求:

1.Ogre的渲染窗口必須固定大小,不能隨著MainWindow的變化而變化.

2.當MainWindow的大小變得很小的時候,Ogre的渲染窗口外部有滾動條可以拖動來看到全部的Ogre視野.

這兩個需求可以在Scene Editor裡面並不會用到,因為Viewport的大小並不是那麼重要,所以Ogitor和其他一些常見的Qt Ogre Scene Editor也沒有解決這個問題.

但是在一些特殊的Editor,她可能就有這個需要.

我們先回顧一下Ogre怎麼放到Qt中.

一個class,我們命名為OgreWidget,繼承與QWidget類.

一些初始化Ogre的內容在這裡跳過.

我們來看關鍵的地方:

1.在創建Ogre的RenderWindow的時候要指定參數:

Ogre::NameValuePairList params;
params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
pRenderWindow = mRoot->createRenderWindow("Ogre", width(), height(), false, &params);

Read more »

Crysis 2結束,青春即將散場

今天終於把Crysis 2通關了,終於將這款讓我記憶深刻,情感複雜萬分的Crysis續作延遲了好幾個月之後,通關了.

這對於我來說,是一個複雜的回憶.

Crysis是我對現代遊戲的啟蒙,當年熱愛硬體DIY的我,從雜誌微型計算機上認識到了這款遊戲.

Crysis,最棒的畫面質量,接近照片級的渲染,以及當時聽不懂的全局光照等等技術名詞.這款2007年的遊戲,即使放到現在,其畫面綜合素質也是頂級的.

Crysis啟蒙了我,讓我對現代遊戲開始認識,就像一道門一樣,打開在我面前,讓我走上了遊戲之路.

在那之前,我對遊戲的認識,僅僅局限於仙劍奇俠傳,還有當時各種網路媒體充斥的網游.我似乎對於遊戲的認識,在當時,就以為只有這些的,就好比一個沒接觸科幻小說的人,以為科幻小說只有凡爾納一樣.

五年了,這五年來,我幾乎都把這五年的單機遊戲大作玩遍了,讓我認識到真正代表人類最前沿計算機科學技術的歐美各種單機遊戲大作.也讓自己走上遊戲程式員的道路.

感謝上帝,讓我走上這全新的道路,並且深愛其中.

前段時間在魔都,不知道是什麼原因,玩遊戲的心情並不是很大,所以Crysis 2當時只是玩了一個開頭,便沒有繼續下去了.

現在來到了妖都,前幾天剛剛把Alice:Madness Returns通關了,於是馬上就又重新玩Crysis 2.
我感覺我對玩遊戲的熱情又回來了.

這次玩Crysis 2,腦海中不斷浮現我四年前玩Crysis的時候,當時還把Crysis的一些關卡翻出來不斷的重複玩.
Read more »

CEGUI的XML解析和保存

最近在翻CEGUI的代碼,翻看到了XML的解析和保存這塊.

在System類裡面可以發現一個XMLParser* d_xmlParser成員變量,XMLParer類就是CEGUI的XML解析Base Class.

要說明的是,CEGUI裡面基本上把所有流行的開源的XML解析庫都包含在裡面了..作為她的一個XML解析模塊,這些模塊均繼承與XMLParser類.

很不解為什麼CEGUI要包含這麼多XML解析庫,包括TinyXML,Expat,LibXML,RapidXML以及Xerces.可以在XMLParserModules檔案夾裡面看到其聲明和實現.

XMLParser裡面提供了一個接口virtual void parseXMLFile(參數略) = 0;用來處理XML.同時還有一個成員變量d_identifierString來記錄當前的XML解析庫名稱以及getIdentifierString方法..

我們以TinyXMLParser為例看看CEGUI是如何解析XML的.

在TinyXMLParser.cpp文件裡面,我們甚至可以看到一個新的類TinyXMLDocument.

這個類完成了XML的解析功能,在這個類的構造函數裡有一個XMLHandler參數用來處理具體的XML文件.

每當遇到一個Element標記的時候,都會調用XMLHanlder的elementStart方法,結束則調用elementEnd方法.
XMLHandler是什麼類呢?
Read more »

CEGUI屬性部分

CEGUI的屬性部分顯的比較複雜,下面來看看.

CEGUI的Window類是一切控件的Base Class,這個class繼承與PropertySet類和EventSet兩個class。EventSet是事件管理,這次來說說PropertySet屬性部分.

首先要說明的是,在CEGUI中,每一種屬性都是一個class,待會詳細描述.

一個屬性的基類為Property,這個類定義如下:

class CEGUIEXPORT Property
{
public:
	Property(const String& name, const String& help, const String& defaultValue = "", bool writesXML = true) :
	  d_name(name),
	  d_help(help),
	  d_default(defaultValue),
	  d_writeXML(writesXML)
	{
	}
	virtual ~Property(void) {}
	const String& getHelp(void) const		{return d_help;}
	const String& getName(void) const		{return d_name;}
	virtual String	get(const PropertyReceiver* receiver) const = 0;
	virtual void	set(PropertyReceiver* receiver, const String& value) = 0;
	virtual bool	isDefault(const PropertyReceiver* receiver) const;
	virtual String	getDefault(const PropertyReceiver* receiver) const;
        virtual void writeXMLToStream(const PropertyReceiver* receiver, XMLSerializer& xml_stream) const;

protected:
	String	d_name;		//!< String that stores the Property name.
	String	d_help;		//!< String that stores the Property help text.
	String	d_default;	//!< String that stores the Property default value string.
	bool    d_writeXML; //!< Specifies whether writeXMLToStream should do anything for this property.
};

類裡面有四個成員變量,分別為名稱,幫助信息,默認值和是否寫入到XML檔標記。那麼我們的真正的屬性值存儲在哪裡呢?

Read more »

讓回憶凍結成冰,堅持前行

最近看的電影,有一部讓人印象深刻久久不忘,那就是去年的電影True Grit.

影片的後面,Cogburn抱著Ross在黑夜裡奔跑的畫面讓人難忘。最後的時候,幾十年過去了,Ross再次想找到Cogburn的時候,卻發現Cogburn剛剛去世了三天.

導演似乎打算在這影片的最後,讓觀眾感觸的情緒達到頂峰。看著Ross離去的背影,越來越遠,眼睛久久不能熒幕,心想如果這不是結束多好.

過去的已經過去,前幾天看的今年的電影Paul讓我想到了以前曾經對科幻文學痴迷的歲月.

歷史是無法改變的. — Ted Chiang.

一直對他的這句話念念不忘.

所以讓回憶凍結成冰,無論如何,繼續前行吧.

Page 3 of 5212345678910...20304050...Last »
Get Adobe Flash playerPlugin by wpburn.com wordpress themes