我的網誌清單

2013年12月26日 星期四

重寫遊戲繪圖函式

決定重寫我之前有寫過的一套遊戲繪圖函式庫
底下是目前進度
目前是透過一個指令 , 指定遊戲視窗的解析度多少 , 而跳出畫面

使用者要引用我的 lib  跟  dll 

然後註冊視窗訊息

C++ Private 建構式

當使用  建構式放在  private 建構式時 , 代表不讓使用者自己建立

必需透過 static 函式來建立 , 而最有名的例子是 單例模式

2013年12月15日 星期日

C++ 物件指標



/*
*  再重新呼叫一次建構式,再傳回自己本身回去 , 本身的指標不變
*
*/
Gamevector  GameVector::test()
  returm GameVector(100,100);
}
使用則
GameVector s(100,500);
s = s.test();

/*
* 回傳自己本身的參考
*/
Gamevector& GameVector::test()
  return *this;
}
使用則
GameVector *g = new GameVector(10,20);
*g = g->test();

/*
* 同上
*
*/
Gamevector* GameVector::test()
    return this;
}
使用則
GameVector *g = new GameVector(10,20);
g = g->test();

/*
* 產生新的
*/
GameVector* GameVector::test()
{
return  new GameVector(100,100);
}
使用則 , 記憶體位置改變
GameVector *g = new GameVector(10,20);
g = g->test();


C++ operator 運算子 重載

最近工作上 常用到 C++ , 一段時間沒寫有些東西有點忘了

C++ 有提供一個功能讓我們可以定義運算子 就是使用到  operator


最近寫了一個 GameVector  而這個 vector 包含了二個變數 分別是 x ,y

而常用到  GameVector  _a(10,10) , GameVector  _b(50,70)

_a = _a - _b  , 或  _a = _a + _b

所以要怎麼寫呢?

GameVector  operator-   (const GameVector &v) const{return GameVector(x - v.x, y - v.y);}

這裡要注意的是我們這裡寫的  運算子 都是在  右手邊

也就是   傳進來的  v 是在右手邊

所以    _a = _a - _b   ,  這裡的  v 是 _b   , 而 _a  就是此次觸發的物件


所以也可以二個運算子一起合用的
GameVector& operator-= (const GameVector &v) {x-=v.x;y-=v.y; return *this;}


現在用個問題是 如果要乘的話呢?
底下的寫法就可以解決 , 但是因為運算子是在右手邊 
GameVector  operator*   (const int v) const{return GameVector(x * v, y * v);}

所以只能 像這樣的寫法 
        GameVector *g = new GameVector(10,20);
GameVector *m = new GameVector(5,10);
        *g =  *m *2 ;

那如果要右手邊跟左手邊都可以就要

class GameVector{

};
inline GameVector operator*(const float s, const GameVector &v) { return v*s; }

寫成這樣







2013年12月2日 星期一

C++ DLL 設計架構

之前有研究過C++ DLL 這個部份 , 因為要寫一些底層的部份 , 然後把架構拆開

不過呢後來太久沒看有點忘了架構 , 今天有空把他整理起來 , 免得之後又忘了

==============================================================

因為要設計 DLL 架構時主要是先把介面拆出來 , 有了介面再來設計功能

所以會有一個介面 , 以及一個入口程式 ... 



#define CALL __stdcall

#ifdef  DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif


介面
//
class interface
{
public :
    virtual int CALL   ADD(int   value) = 0;
};


//產生 實體
extern "C"{  EXPORT HGE * CALL CreateDll(int ver); }


//實做
class Interface_Impl: public interface{
public:
    static Interface_Impl* _InterfaceCreate();
    virtual int CALL   ADD(int   value) ;
private:
    Interface_Impl();
};

//DLL 裡面會參考到的 物件 指
extern Interface_Impl* pObj;



//使用者用這個建立
interface* CALL CreateDll(int ver)
{
    return (interface*) Interface_Impl::_InterfaceCreate();
}

//實際傳回建立的物件
Interface_Impl* Interface_Impl::_InterfaceCreate()
{
    if (!pObj)pObj= new Interface_Impl();
    return pObj;
}
--------------------------------------------------------------------

實際上使用的方法如下

.h 檔我們還是要引用這個

class interface
{
public :
    virtual int CALL   ADD(int   value) = 0;
};

因為實作實我們是不讓客戶端知道我們實作了那一個

  interface*obj= 0;

    obj= CreateDll(100);
    printf("%i",obj->ADD(100));