1.Device Context
//取得DC
HDC GetDC(HWND hWnd)
//釋放DC
int ReleaseDC(HWND hWnd,HDC DC名稱);
2.GDI對象:建立->選用->刪除
//建立畫筆
HPEN CreatePen(int 樣式,int 寬度, COLORREF 顏色);
//建立陰影畫刷
HBRUSH CreateHatchBrush(int 樣式,COLORREF 顏色);
//建立單色畫刷
HBRUSH CreateSolidBrush(COLORREF 顏色);
//選用GDI對象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ GDI對象);
//刪除GDI對象
BOOL DeleteObject(HGDIOBJ GDI對象);
3.
//畫線
//移動畫筆至線條起點
BOOL MoveToEx(HDC hdc,int x,int y,LPPOINT 目前座標);
// 畫線條到指定座標
BOOL LineTo(HDC hdc,int x,int y);
//畫矩形
BOOL Rectangle(HDC hdc,int x1,int y1,int x2,int y2);
//畫多邊形
BOOL Polygon(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);
BOOL PolylineTo(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);
BOOL Polyline(HDC hdc,CONST POINT 點數組指標,int 多邊形點數);
typedef struct tagPOINT{
LONG x;
LONG y;
}POINT;
//畫橢圓形
BOOL Ellipse(HDC hdc, int x1,int y1,int x2,int y2);
//畫圓角矩形
BOOL RoundRect(HDC hdc,int x1,int y1,int x2,int y2,int 圓角上橢圓長,int 圓角上橢圓高);
//畫扇形
BOOL Pie(HDC hdc,int 外圍矩形左上點x座標,int 外圍矩形左上點y座標,int 外圍矩形右上點x座標,int 外圍矩形右上點y座標,int x1,int y1,int x2,int y2);
//畫弓形
Chord(hdc,300,210,550,340,50,50,600,300);
4.字串
int x=LOWORD(lParam);
//設定字串顏色
SetTextColor(hdc,#ff0000);
char str[20]="";
sprintf(str,"X座標:%d",x);
//輸出字串
BOOL TextOut(HDC hdc, int x座標,int y座標,LPCTSTR 字串指標,int 字串長度);
5.繪製位元影像
(1)載入位元影像
HANDLE LoadImage(HINSTANCE 來源實體,LPCTSTR 名稱,UINT 位元影像類型, int 載入寬度,int 載入高度,UINT 載入方式);
位元影像類型:IMAGE_BITMAP、IMAGE_CURSOR、IMAGE_ICON
載入方式:從檔案中載入LR_LOADFROMFILE
(2)建立記憶體DC
HDC CreateCompatibleDC(HDC hdc);
DeleteDC(HDC hdc);
(3)選用位元影像對象
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ GDI對象);
(4)貼圖
BOOL BitBlt(HDC destDC,int destX,int destY,int destWidth,int destHeight,HDC srcDc,int srcX,int srcY,DWORD 貼圖方式);
貼圖方式:
SRCCOPY 將來源位元影像貼到目的DC上
SRCAND 將來源位元影像與目的DC做“AND”運算
SRCPAINT 將來源位元影像與目的DC做“OR”運算
6.透明處理
(1)透明效果
SelectObject(mdc,bg);
BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);
SelectObject(mdc,dra);
BitBlt(hdc,280,320,85,99,mdc,85,0,SRCAND);
BitBlt(hdc,280,320,85,99,mdc,0,0,SRCPAINT);
(2)半透明效果
半透明色彩=前景圖色彩*不透明度+背景圖色彩*(1-不透明度)
a.取得位元影像結構
int GetObject(HGDIOBJ GDI對象,int 結構大小,LPVOID 結構變數);
結構變數typedef struct tagBITMAP{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
}BITMAP;
GetObject(bitmap,sizeof(BITMAP),&bm);
b.建立暫存數組
unsigned char *px = new unsigned char [bm.bmHeight * bm.bmWidthBytes];
c.取得位元影像位值
LONG GetBitmapBits(HBITMAP 位元影像,LONG 取得的Byte數,LPVOID 儲存的數組指標);
GetBitmapBits(bitmap,bm.bmHeight*bm.bmWidthBytes.px);
d.合成像素顏色值
e.重設位元影像顏色
LONG SetBitmapBits(HBITMAP 位元影像,DWORD 顏色數組大小, CONST VOID 數組指標);
(3)透明半透明效果
//建立位元影像
HBITMAP CreateCompatibleBitmap(HDC hdc,int width,int height);
7.定時器
UINT SetTimer(HWND hWnd,UINT 定時器代號, UINT 時間間隔, TIMERPROC 處理器響應函數);
UINT 定時器代號在同一個視窗中必須是唯一的,且不為0
//刪除定時器
BOOL KillTimer(int 定時器代號);
8.遊戲迴圈
DWORD tPre,tNow;
WinMain裡
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
tNow=GetTickCount();
if(tNow-tPre>=40)
MyPaint(hdc);
}
}
InitInstance裡
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
bufdc = CreateCompatibleDC(hdc);
HBITMAP bmp=CreateCompatibleBitmap(hdc,640,480);
SelectObject(mdc,bmp);
dra=(HBITMAP)LoadImage(NULL,"dra2.bmp",IMAGE_BITMAP,760,198,LR_LOADFROMFILE);
bg=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
num=0;
x=640;
y=360;
MyPaint(hdc);
int frame=0;
int tCheck=0,fps;
void MyPaint(HDC hdc)
{
if(num==8)
num=0;
SelectObject(bufdc,bg);
BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);
SelectObject(bufdc,dra);
BitBlt(mdc,x,y,95,99,bufdc,num*95,99,SRCAND);
BitBlt(mdc,x,y,95,99,bufdc,num*95,0,SRCPAINT);
BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
tPre=GetTickCount();
num++;
//顯示文字
frame++;
if(tNow-tCheck>=1000)
{
fps=frame;
frame=0;
tCheck=tNow;
}
char str[40]="";
sprintf(str,"每秒鐘顯示%d個畫面 ",fps);
TextOut(hdc,0,0,str,strlen(str));
}
9.動畫顯示問題
排序貼圖
10.背景動畫設計
a)單一背景滾動
b)迴圈背景滾動
c)多背景迴圈動畫
11.
1)
//設定擷取視窗外的滑鼠訊息
HWND SetCapture(HWND hWnd);
//釋放擷取視窗外的滑鼠訊息
BOOL ReleaseCapture(VOID);
2)
//設定滑鼠游標位置,注意:(x,y)對應的是螢幕座標而不是視窗座標
BOOL SetCursorPos(int x,int y);
//視窗座標轉換為螢幕座標
BOOL ClientToScreen(HWND hWnd, LPPOINT 視窗點座標);
//螢幕座標轉換為視窗座標
BOOL ScreenToClient(HWND hWnd, LPPOINT 螢幕點座標);
POINT pt;
pt.x=0;
pt.y=0;
ClientToScreen(hWnd,&pt);
SetCursorPos(pt.x,pt.y);
3)顯示或隱藏滑鼠
int ShowCursor(BOOL true或false);
4)
//限制滑鼠游標移動地區
BOOL ClipCursor(CONST RECT 移動地區矩形);
//釋放保留
BOOL ClipCursor(NULL);
typedef struct RECT{
LONG left;
LONG top;
LONG right;
LONG bottom;
}RECT;
//取得視窗外部地區矩形
BOOL GetWindowRect(HWND hWnd,LPRECT 矩形結構);
//取得視窗內部矩形地區
BOOL GetClientRect(HWND hWnd,LPRECT 矩形結構);
例如:要限制滑鼠游標移動地區
RECT rect;
POINT lt,rb;
GetClientRect(hWnd,&rect);
lt.x=rect.left;
lt.y=rect.top;
rb.x=rect.right;
rb.y=rect.bottom;
ClientToScreen(hWnd,<);
ClientToScreen(hWnd,&rb);
rect.left=lt.x;
rect.top=lt.y;
rect.right=rb.x;
rect.bottom=rb.y;
ClipCursor(&rect);
12.AI
類神經網路
基因演算法
模糊邏輯
1)怪物追逐
if(怪物HP>200)
{
p=rand()%3;
if(p!=1) //有2/3的機率能正確的朝向玩家
{
if(怪物X>玩家X)
怪物X--;
else
怪物X++;
if(怪物Y>玩家Y)
怪物Y--;
else
怪物Y++;
}
}
else
怪物HP+=5;//怪物不動,休息補血
2)躲避移動
if(怪物X>玩家X)
怪物++;
else
怪物X--;
if(怪物Y>玩家Y)
怪物Y++;
else
怪物Y--;
3)模式移動:追逐、躲避、隨機、固定移動等
4)怪物行為
a.普通攻擊
b.施放攻擊魔法
c.使盡全力攻擊
d.補血
e.逃跑
if(生命值>20)
{
if(rand()%10!=1) //普通攻擊機率為9/10
普通攻擊;
else
施放魔法攻擊;
}
else
{
switch(rand()%5)
{
case0:
普通攻擊;
break;
case 1:
施放魔法攻擊;
break;
case 2:
使盡全力攻擊;
break;
case 3:
補血;
break;
case 4:
逃跑;
if(rand()%3==1) //逃跑成功幾率為1/3
逃跑成功;
else
逃跑失敗;
break;
}
}
}