
將代碼移稙去WIN10, 係Visual Studio报
error LNK2001: 無法解析的外部符號 __imp_glBegin |
調用OpenGL函式,冇鏈结OpenGL庫引起, 係『.H』文檔加入下列代碼即可.
#pragma comment(lib, “OpenGL32.lib”) |
#pragma comment(lib, “GLu32.lib”) |
BOOKCARD
OpenGL/OpenGL ES
2D游戲動画幀, 由多幅關鍵幀(keyFrame) 組成. 逐幀渲染產生動画卡通.『幀動画』亦哎呌『紋理』texture. 将多幅『幀動画』存放係單壹紋理.OpenGL可提高渲染速度, 係显存記憶體1MB年代可能冇用. 事因渲染皆係電脑記憶體運作.
係显存記憶體大幅增長, OpenGL渲染係显存記憶體完成. 减小『紋理』載入量, 單壹紋理存放多幅『幀動画』,可提高渲染速度.
係3D游戲亦可用相同技術提飛渲染效率.
void zoom_textcoord_model3D(TEXTURE_PTR texture,int index,int size,VECTOR2D_PTR dest,VECTOR2D_PTR sour,int count,int flag) |
texture | 紋理 |
index | 關鍵幀索引 |
size | 關鍵幀寬高解像 |
dest | 纹理隊列 |
sour | 原始纹理隊列 |
count | 纹理頂點量 |
計單元格
int cell = texture->width / size; |
計索引
int i = index % cell;// 橫索引 |
int j = index / cell;// 行索引 |
計缩放率0.0f < zoom < 1.0f
float zoom = (float)size / (float)texture->width; |
計『幀』偏移.
float offsetX = (float)zoom * (float)i; |
float offsetY = (float)zoom * (float)j; |
遍歴UV紋理頂㸃
for (int p = 0; p < count; ++p){ |
缩細後移動
dest[p].u = sour[p].u * zoom + offsetX ; |
dest[p].v = sour[p].v * zoom + offsetY; |
纹理返转
if (flag & MODEL3D_TEXTURE_FLIP)
dest[p].v = 1 – (sour[p].v * zoom + offsetY);} |
『天幕SKYBOX』指巨立方體, 係內籠貼天幕紋理,『天幕紋理』可能係『地平線』『室內』『宇宙』. 『天幕SKYBOX』原㸃與3D相機位置重合. 係遠睇時正确.
由陸幅紋理『顶』『底』『前』『後』『左』『右』組成. 以前『天幕SKYBOX』紋理分陸幅位圖存檔.
陸幅位圖存係單壹『紋理』效率更高. 将『紋理』平分拾陸等分. 足够擺两組『天幕』紋理. 『日頭』『晚黑』各壹. 似上圖咁.
紋理索引:0~15 | 『日頭』 | 『晚黑』 |
顶up | 0 | 8 |
底dn | 1 | 9 |
前ft | 7 | 15 |
后bk | 5 | 13 |
左lt | 6 | 14 |
右rt | 4 | 12 |
定義『天幕SKYBOX』
typedef struct SKYBOX_TYP { | |
VECTOR3D pos; | 位置 |
VECTOR3D rot; | 旋轉 |
TEXTURE_PTR texture; | 天幕纹理 |
float size; | 天幕大细 |
//TEXTURE_REGION region[16]; | 纹理区域 |
VECTOR3D vertex_array[36] ; | 天幕顶点 |
VECTOR2D texCoord_array[36] ; | 天幕紋理 |
}SKYBOX, *SKYBOX_PTR; |
手エ构建『天幕SKYBOX』立方體『3D頂㸃』同『UV紋理』. 正方形以两三角形組成. 紋理左上角[u0, v0], 紋理右下角[u1,v1].天幕大细『size』.
天『UV紋理』 | 『xyz頂㸃』 |
texCoord[0]=[u1, v1] | vertex_array[0]=[-size, size, -size] |
texCoord[1]=[u0, v1] | vertex_array[1]=[size, size, -size] |
texCoord[2]=[u0, v0] | vertex_array[2]=[size, size, size] |
texCoord[3]=[u1, v1] | vertex_array[3]=[-size, size, -size] |
texCoord[4]=[u0, v0] | vertex_array[4]=[size, size, size] |
texCoord[5]=[u1, v0] | vertex_array[5]=[-size, size, size] |
地『UV紋理』 | 『xyz頂㸃』 |
texCoord[6]=[u1, v1] | vertex_array[6]=[size, -size, -size] |
texCoord[7]=[u0, v1] | vertex_array[7]=[-size, -size, -size] |
texCoord[8]=[u0, v0] | vertex_array[8]=[-size, -size, size] |
texCoord[9]=[u1, v1] | vertex_array[9]=[size, -size, -size] |
texCoord[10]=[u0, v0] | vertex_array[10]=[-size, -size, size] |
texCoord[11]=[u1, v0] | vertex_array[11]=[size, -size, size] |
前『UV紋理』 | 『xyz頂㸃』 |
texCoord[12]=[u0, v0] | vertex_array[12]=[-size, -size, -size] |
texCoord[13]=[u1, v0] | vertex_array[13]=[size, -size, -size] |
texCoord[14]=[u1, v1] | vertex_array[14]=[size, size, -size] |
texCoord[15]=[u0, v0] | vertex_array[15]=[-size, -size, -size] |
texCoord[16]=[u1, v1] | vertex_array[16]=[size, size, -size] |
texCoord[17]=[u0, v1] | vertex_array[17]=[-size, size, -size] |
后『UV紋理』 | 『xyz頂㸃』 |
texCoord[18]=[u0, v0] | vertex_array[18]=[size, -size, size] |
texCoord[19]=[u1, v0] | vertex_array[19]=[-size, -size, size] |
texCoord[20]=[u1, v1] | vertex_array[20]=[-size, size, size] |
texCoord[21]=[u0, v0] | vertex_array[21]=[size, -size, size] |
texCoord[22]=[u1, v1] | vertex_array[22]=[-size, size, size] |
texCoord[23]=[u0, v1] | vertex_array[23]=[size, size, size] |
右『UV紋理』 | 『xyz頂㸃』 |
texCoord[24]=[u1, v0] | vertex_array[24]=[size, -size, size] |
texCoord[25]=[u1, v1] | vertex_array[25]=[size, size, size] |
texCoord[26]=[u0, v1] | vertex_array[26]=[size, size, -size] |
texCoord[27]=[u1, v0] | vertex_array[27]=[size, -size, size] |
texCoord[28]=[u0, v1] | vertex_array[28]=[size, size, -size] |
texCoord[29]=[u0, v0] | vertex_array[29]=[size, -size, -size] |
左『UV紋理』 | 『xyz頂㸃』 |
texCoord[30]=[u1, v0] | vertex_array[30]=[-size, -size, -size] |
texCoord[31]=[u1, v1] | vertex_array[31]=[-size, size, -size] |
texCoord[32]=[u0, v1] | vertex_array[32]=[-size, size, size] |
texCoord[33]=[u1, v0] | vertex_array[33]=[-size, -size, -size] |
texCoord[34]=[u0, v1] | vertex_array[34]=[-size, size, size] |
texCoord[35]=[u0, v0] | vertex_array[35]=[-size, -size, size] |
『觸屏坐標』『x,y』坐標轉『正交投影』坐標, 『視錐體解像』寬高, 比例需手機解像寬高比壹致.
計屏幕寬高比
float aspect_ratio = (float)cam->real_width / (float)cam->real_height; |
『視錐體解像』寬高,此時定義『高』800pix
float frustum_width = 800 *aspect_ratio; |
float frustum_height = 800 ; |
『正交投影』代碼
重置視區尺寸, 值係手機解像寬高
::glViewport(0,0,real_width,real_height); |
設定投影矩陣
::glMatrixMode(GL_PROJECTION); |
載入單位矩陣
::glLoadIdentity(); |
正交投影, 游戲坐標原點(0,0,0)為於屏幕中心
glOrthof(frustum_width / 2, frustum_width / 2, -frustum_height / 2, frustum_height / 2, pos.y – 10, far_clip_z); |
設定模型視圖矩陣
::glMatrixMode(GL_MODELVIEW); |
載入單位矩陣
::glLoadIdentity(); |
手指触摸手機屏幕onTouch() 所得坐標需轉游戲世界坐標,正交投影OpenGL游㱆+Z軸指向屏幕深處.
float touch3Dx = (touch2Dx / real_width) * frustum_width ; |
float touch3Dz = (touch2Dy /real_height) * frustum_height ; |
計3D相機位置
touch3Dx = touch3Dx + camPosX; |
touch3Dz = touch3Dz + camPosX; |
游戲坐標原點(0,0,0)為於屏幕中心
touch3Dx = touch3Dx – (frustum_width / 2.0f); |
touch3Dz = touch3Dz – (frustum_height / 2.0f); |
『漢字字庫』同 『ASCII字庫』原理同, 字庫『竪排』, 漢字『32*32』pixel, 『竪』32漢字.
由上至下,由右至左排列.可填1024字符,每色8Bit. 即『索引色』『調色板』.
准備庫位圖
Photoshop轉為『索引色』
止時圖檔『調色板』共有三色『黑』『白』『透明』.
IMAGE-SIZE | 1024*1024 |
FONT-SIZE | 30pt |
FONT | 衡山毛筆フォント |
FONT-PIXEL | 32pixel*32pixel |
影像-模色 | 索引色 |
色盤 | 正確 |
顏色 | 3 |
强制 | 黑白 |
透明 | 勾選 |
『調色板』結构同DirextX唔同, 將flags存alpha『透明值』0~255,0係『透明』,255係『實心』
typedef struct PALETTE_TYP {
BYTE red; BYTE green; BYTE blue; BYTE flags;//alpha } PALETTE,COLOR,* PALETTE_PTR,*COLOR_PTR; |
設置『調色板』顏色
#define INIT_PALETTE(palette,r,g,b,a) {(palette).red=(r); (palette).green=(g); (palette).blue=(b); (palette).flags=(a);} |
黑字『調色板』設置
index | red | green | blue | Alpha |
253 | 0xff | 0xff | 0xff | 0x00 |
255 | 0x00 | 0x00 | 0x00 | 0xFF*0.5f |
白字『調色板』設置
index | red | green | blue | Alpha |
253 | 0x00 | 0x00 | 0x00 | 0x00 |
255 | 0xff | 0xff | 0xff | 0xFF*0.5f |
半透明,激活混合
glEnable(GL_BLEND); |
設混合模式, 渲染時Alpha值混合.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
激活透明测试
glEnable(GL_ALPHA_TEST); |
Alpha=0時, 過濾背影色
glAlphaFunc(GL_GREATER, 0); |
初台Android手機己采用『單點』触摸, 直至Android2.0(SDK version 5) 先支持『多點』触摸.
static class TounchListener implements OnTouchListener{ |
@Override
public boolean onTouch(View v, MotionEvent event) { |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) |
MultiTouch(v, event); else |
SingleTouch(v, event); |
return false;} |
private static TounchListener Tounch_Listener = new TounchListener() ; |
view.setOnTouchListener(Tounch_Listener); |
MotionEvent.getX() | X軸指右 |
MotionEvent.getY() | Y軸指下 |
MotionEvent.getAction() | |
MotionEvent.ACTION_DOWN | 手指撳屏 |
MotionEvent.ACTION_POINTER_DOWN | 手指撳屏 |
MotionEvent.ACTION_UP | 手指鬆离 |
MotionEvent.ACTION_POINTER_UP | 手指鬆离 |
MotionEvent.ACTION_CANCEL | 手勢鬆 |
MotionEvent.ACTION_MOVE | 移動手指 |
public static int ACTION_UP = 1; | 鬆 |
public static int ACTION_DOWN = 2; | 撳 |
public static int ACTION_DRAGGED = 3; | 拖 |
處理『單點』触摸
static void SingleTouch(View v, MotionEvent event){ |
int action = event.getAction() & MotionEvent.ACTION_MASK; |
if(action == MotionEvent.ACTION_DOWN ||
action == MotionEvent.ACTION_POINTER_DOWN) |
Lib.setTouch(ACTION_DOWN,event.getX(),event.getY());else |
if(action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_CANCEL) |
Lib.setTouch(ACTION_UP,event.getX(),event.getY());else |
if(action == MotionEvent.ACTION_MOVE) |
Lib.setTouch(ACTION_DRAGGED,event.getX(),event.getY());} |
處理『多點』触摸
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT; |
MotionEvent.getX(index) | X軸指右 |
MotionEvent.getY(index) | Y軸指下 |
int action = event.getAction() & MotionEvent.ACTION_MASK; |
int Pointer_Index = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK)>>MotionEvent.ACTION_POINTER_ID_SHIFT; |
int Pointer_Count = event.getPointerCount(); |
for(int i=0; i< Pointer_Count; ++i) { |
if (action != MotionEvent.ACTION_MOVE && i != Pointer_Index)
continue; |
if(action == MotionEvent.ACTION_DOWN ||
action == MotionEvent.ACTION_POINTER_DOWN) |
Lib.setTouch(ACTION_DOWN,event.getX(i),event.getY(i));else |
if(action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_CANCEL) |
Lib.setTouch(ACTION_UP,event.getX(i),event.getY(i));else |
if(action == MotionEvent.ACTION_MOVE) |
Lib.setTouch(ACTION_DRAGGED,event.getX(i),event.getY(i));} |
係C++緩存『触屏』信息Lib.setTouch();
typedef struct TOUCH_STR{ | |
int action; | 触屏類型 |
int x,y; | 触屏坐標 |
}TOUCH,*TOUCH_PTR; |
『触屏座標』轉『熒屏座標』
void TouchToScreen(CAMERA2D_PTR cam,VECTOR2D_PTR touch){ |
touch->x = (touch->x / (float)cam->real_width) * cam->frustum_width * cam->zoom; |
touch->y = (1-touch->y /(float)cam->real_height) * cam->frustum_height * cam->zoom; } |
係游戲渲染文本,『點陣字體』係遠古技術, 係位圖繪畫ASCII字符, 哎『位圖字符glyph』,標准ASCII字符128,有96拉丁字母可渲染,從32到126.『32』係『吉格』.
位圖每行16字符. 位圖寬高符合2n.位圖『256256』每字符『1616』像素, 位圖『512512』每字符『3232』像素.
定義位圖字符
typedef struct FONT_TYP{ | |
TEXTURE_PTR texture; | 字庫紋理 |
DWORD flag; | 頂點標記 |
TEXTURE_REGION region[96]; | 紋理區域 |
}FONT, * FONT_PTR; |
for(int index = 0; index < 96; ++index){ |
Init_Region_Texture(&font->region[index],font->texture,x,y, width, height); |
x = x + width; |
if(x >= offsetX + width * row){
x = offsetX; y = y + height;} |
渲染位圖字庫
VECTOR2D vertex_array[6 * 1024] ; |
VECTOR2D texCoord_array[6 * 1024] ; |
glEnable(GL_TEXTURE_2D); |
glDisable(GL_NORMALIZE); |
glEnable(GL_ALPHA_TEST); |
glAlphaFunc(GL_GREATER, 0); |
TEXTURE_PTR texture = font->texture;
glBindTexture(GL_TEXTURE_2D, texture->ID); |
glEnableClientState(GL_VERTEX_ARRAY); |
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
因為OpenGL『2D相機』原點『0,0』係『左下角』, 返䡛Y軸.
y = Font_frustum_height – y – height; |
for(int index = 0; index < length; ++index ){ |
int c = text[index] – ‘ ‘; |
if(c < 0 || c > 96) continue; |
TEXTURE_REGION_PTR region = &font->region[c]; |
Init_VECTOR2D(&vertex_array[0 * 3 + 0], x, y + height);
Init_VECTOR2D(&vertex_array[0 * 3 + 1], x + width, y + height); Init_VECTOR2D(&vertex_array[0 * 3 + 2], x + width, y); Init_VECTOR2D(&vertex_array[1 * 3 + 0], x, y + height); Init_VECTOR2D(&vertex_array[1 * 3 + 1], x + width, y); Init_VECTOR2D(&vertex_array[1 * 3 + 2], x, y); |
Init_VECTOR2D(&texCoord_array[0 * 3 + 0], region->u1, region->v2);
Init_VECTOR2D(&texCoord_array[0 * 3 + 1], region->u2, region->v2); Init_VECTOR2D(&texCoord_array[0 * 3 + 2], region->u2, region->v1); Init_VECTOR2D(&texCoord_array[1 * 3 + 0], region->u1, region->v2); Init_VECTOR2D(&texCoord_array[1 * 3 + 1], region->u2, region->v1); Init_VECTOR2D(&texCoord_array[1 * 3 + 2], region->u1, region->v1); |
glVertexPointer(2, GL_FLOAT, 0, vertex_array); |
glTexCoordPointer(2, GL_FLOAT, 0, texCoord_array); |
glDrawArrays(GL_TRIANGLES, 0, 2 * 3 ); |
if(VH == FONT_HORIZONTAL)
x = x + width; else if(VH == FONT_VERTICAL) y = y + height;} |
glDisable(GL_ALPHA_TEST); |
glPopMatrix(); |
ASCII數字 | 字符 |
0–31 | 控制字元,用于控制印表機等周邊設備 |
32-126 | 鍵盤字符 |
127 | DELETE 命令 |
48-57 | 0-9 |
65-90 | A-Z |
97-122 | a-z |
128-255 | 擴展ASCII,增加特殊符號字符, 歐語字母和圖形符號 |
Photoshop位圖字符glyph | |
Pixel | 32*32 |
Font | Terminal Regular |
Size | 4pt |
mid | |
Aa |
十進制(DEC) | 十六進制(HEX) | ASCII字符 | 簡介 |
0 | 0x00 | 空格NUL(null) | |
1 | 0x01 | 標題開始 SOH(start of headling) | |
2 | 0x02 | 正文開始 STX (start of text) | |
3 | 0x03 | 正文結束 ETX (end of text) | |
4 | 0x04 | 傳輸結束 EOT (end of transmission) | |
5 | 0x05 | 請求 ENQ (enquiry) | |
6 | 0x06 | 收到通知 ACK (acknowledge) | |
7 | 0x07 | 響鈴 BEL (bell) | |
8 | 0x08 | 退格 BS (backspace) | |
9 | 0x09 | 水準跳位字元 HT (horizontal tab) | |
10 | 0x0A | 換行鍵 LF (NL line feed, new line) | |
11 | 0x0B | 垂直跳位字元 VT (vertical tab) | |
12 | 0x0C | 換頁鍵 FF (NP form feed, new page) | |
13 | 0x0D | 回車鍵 CR (carriage return) | |
14 | 0x0E | 不用切換 SO (shift out) | |
15 | 0x0F | 啟用切換 SI (shift in) | |
16 | 0x10 | 資料連結轉義DLE (data link escape) | |
17 | 0x11 | 設備控制1 DC1 (device control 1) | |
18 | 0x12 | 設備控制2 DC2 (device control 2) | |
19 | 0x13 | 設備控制3 DC3 (device control 3) | |
20 | 0x14 | 設備控制4 DC4 (device control 4) | |
21 | 0x15 | 拒絕接收 NAK (negative acknowledge) | |
22 | 0x16 | 同步空閒 SYN (synchronous idle) | |
23 | 0x17 | 傳輸塊結束 ETB (end of trans. block) | |
24 | 0x18 | 取消 CAN (cancel) | |
25 | 0x19 | EM (end of medium) | |
26 | 0x1A | 替補 SUB (substitute) | |
27 | 0x1B | 溢出 ESC (escape) | |
28 | 0x1C | 檔分割符 FS (file separator) | |
29 | 0x1D | 分組符 GS (group separator) | |
30 | 0x1E | 記錄分離符 RS (record separator) | |
31 | 0x1F | 單元分隔符號 US (unit separator) | |
32 | 0x20 | 空格 (space) | |
33 | 0x21 | ! | 嘆號 |
34 | 0x22 | “ | 雙引號 |
35 | 0x23 | # | 井號 |
36 | 0x24 | $ | 美元符 |
37 | 0x25 | % | 百分號 |
38 | 0x26 | & | 和號 |
39 | 0x27 | ‘ | 閉單引號 |
40 | 0x28 | ( | 開括弧 |
41 | 0x29 | ) | 閉括弧 |
42 | 0x2A | * | 星號 |
43 | 0x2B | + | 加號 |
44 | 0x2C | , | 逗號 |
45 | 0x2D | – | 減號/破折號 |
46 | 0x2E | . | 句號 |
47 | 0x2F | / | 斜杠 |
48 | 0x30 | 0 | |
49 | 0x31 | 1 | |
50 | 0x32 | 2 | |
51 | 0x33 | 3 | |
52 | 0x34 | 4 | |
53 | 0x35 | 5 | |
54 | 0x36 | 6 | |
55 | 0x37 | 7 | |
56 | 0x38 | 8 | |
57 | 0x39 | 9 | |
58 | 0x3A | : | 冒號 |
59 | 0x3B | ; | 分號 |
60 | 0x3C | < | 小於 |
61 | 0x3D | = | 等號 |
62 | 0x3E | > | 大於 |
63 | 0x3F | ? | 問號 |
64 | 0x40 | @ | 電子郵件符號 |
65 | 0x41 | A | |
66 | 0x42 | B | |
67 | 0x43 | C | |
68 | 0x44 | D | |
69 | 0x45 | E | |
70 | 0x46 | F | |
71 | 0x47 | G | |
72 | 0x48 | H | |
73 | 0x49 | I | |
74 | 0x4A | J | |
75 | 0x4B | K | |
76 | 0x4C | L | |
77 | 0x4D | M | |
78 | 0x4E | N | |
79 | 0x4F | O | |
80 | 0x50 | P | |
81 | 0x51 | Q | |
82 | 0x52 | R | |
83 | 0x53 | S | |
84 | 0x54 | T | |
85 | 0x55 | U | |
86 | 0x56 | V | |
87 | 0x57 | W | |
88 | 0x58 | X | |
89 | 0x59 | Y | |
90 | 0x5A | Z | |
91 | 0x5B | [ | 開方括號 |
92 | 0x5C | \ | 反斜杠 |
93 | 0x5D | ] | 閉方括號 |
94 | 0x5E | ^ | 脫字元 |
95 | 0x5F | _ | 下劃線 |
96 | 0x60 | ` | 開單引號 |
97 | 0x61 | a | |
98 | 0x62 | b | |
99 | 0x63 | c | |
100 | 0x64 | d | |
101 | 0x65 | e | |
102 | 0x66 | f | |
103 | 0x67 | g | |
104 | 0x68 | h | |
105 | 0x69 | i | |
106 | 0x6A | j | |
107 | 0x6B | k | |
108 | 0x6C | l | |
109 | 0x6D | m | |
110 | 0x6E | n | |
111 | 0x6F | o | |
112 | 0x70 | p | |
113 | 0x71 | q | |
114 | 0x72 | r | |
115 | 0x73 | s | |
116 | 0x74 | t | |
117 | 0x75 | u | |
118 | 0x76 | v | |
119 | 0x77 | w | |
120 | 0x78 | x | |
121 | 0x79 | y | |
122 | 0x7A | z | |
123 | 0x7B | { | 開花括弧 |
124 | 0x7C | | | 垂線 |
125 | 0x7D | } | 閉花括弧 |
126 | 0x7E | ~ | 波浪號 |
127 | 0x7F | 刪除DEL(DELETE) | |
128 | 0x80 | Ç | Ccedil |
129 | 0x81 | ü | uuml |
130 | 0x82 | é | eacute |
131 | 0x83 | â | circ |
132 | 0x84 | ä | auml |
133 | 0x85 | à | agrave |
134 | 0x86 | å | aring |
135 | 0x87 | ç | ccedil |
136 | 0x88 | ê | ecirc |
137 | 0x89 | ë | euml |
138 | 0x8A | è | egrave |
139 | 0x8B | ï | iuml |
140 | 0x8C | î | icirc |
141 | 0x8D | ì | igrave |
142 | 0x8E | Ä | Auml |
143 | 0x8F | Å | ring |
144 | 0x90 | É | Eacute |
145 | 0x91 | æ | aelig |
146 | 0x92 | Æ | AElig |
147 | 0x93 | ô | ocirc |
148 | 0x94 | ö | ouml |
149 | 0x95 | ò | ograve |
150 | 0x96 | û | ucirc |
151 | 0x97 | ù | ugrave |
152 | 0x98 | ÿ | yuml |
153 | 0x99 | Ö | Ouml |
154 | 0x9A | Ü | Uuml |
155 | 0x9B | ¢ | 美分(cent) |
156 | 0x9C | £ | 英磅(pound) |
157 | 0x9D | ¥ | 日元(yen) |
158 | 0x9E | ₧ | |
159 | 0x9F | ƒ | |
160 | 0xA0 | á | aacute |
161 | 0xA1 | í | iacute |
162 | 0xA2 | ó | oacute |
163 | 0xA3 | ú | uacute |
164 | 0xA4 | ñ | ntilde |
165 | 0xA5 | Ñ | Ntilde |
166 | 0xA6 | ª | |
167 | 0xA7 | º | |
168 | 0xA8 | ¿ | |
169 | 0xA9 | ⌐ | |
170 | 0xAA | ¬ | |
171 | 0xAB | ½ | |
172 | 0xAC | ¼ | |
173 | 0xAD | ¡ | |
174 | 0xAE | « | |
175 | 0xAF | » | |
176 | 0xB0 | ░ | |
177 | 0xB1 | ▒ | |
178 | 0xB2 | ▓ | |
179 | 0xB3 | │ | |
180 | 0xB4 | ┤ | |
181 | 0xB5 | ╡ | |
182 | 0xB6 | ╢ | |
183 | 0xB7 | ╖ | |
184 | 0xB8 | ╕ | |
185 | 0xB9 | ╣ | |
186 | 0xBA | ║ | |
187 | 0xBB | ╗ | |
188 | 0xBC | ╝ | |
189 | 0xBD | ╜ | |
190 | 0xBE | ╛ | |
191 | 0xBF | ┐ | |
192 | 0xC0 | └ | |
193 | 0xC1 | ┴ | |
194 | 0xC2 | ┬ | |
195 | 0xC3 | ├ | |
196 | 0xC4 | ─ | |
197 | 0xC5 | ┼ | |
198 | 0xC6 | ╞ | |
199 | 0xC7 | ╟ | |
200 | 0xC8 | ╚ | |
201 | 0xC9 | ╔ | |
202 | 0xCA | ╩ | |
203 | 0xCB | ╦ | |
204 | 0xCC | ╠ | |
205 | 0xCD | ═ | |
206 | 0xCE | ╬ | |
207 | 0xCF | ╧ | |
208 | 0xD0 | ╨ | |
209 | 0xD1 | ╤ | |
210 | 0xD2 | ╥ | |
211 | 0xD3 | ╙ | |
212 | 0xD4 | Ô | |
213 | 0xD5 | ╒ | |
214 | 0xD6 | ╓ | |
215 | 0xD7 | ╫ | |
216 | 0xD8 | ╪ | |
217 | 0xD9 | ┘ | |
218 | 0xDA | ┌ | |
219 | 0xDB | █ | |
220 | 0xDC | ▄ | |
221 | 0xDD | ▌ | |
222 | 0xDE | ▐ | |
223 | 0xDF | ▀ | |
224 | 0xE0 | α | 阿爾法(Alpha) |
225 | 0xE1 | ß | 貝塔(beta) |
226 | 0xE2 | Γ | Gamma |
227 | 0xE3 | π | 圓周率(pi) |
228 | 0xE4 | Σ | sigma |
229 | 0xE5 | σ | sigma |
230 | 0xE6 | µ | mu |
231 | 0xE7 | τ | tau |
232 | 0xE8 | Φ | PHi |
233 | 0xE9 | Θ | Theta |
234 | 0xEA | Ω | 歐米伽(Omega) |
235 | 0xEB | δ | Delta |
236 | 0xEC | ∞ | 無窮 |
237 | 0xED | φ | phi |
238 | 0xEE | ε | epsilon |
239 | 0xEF | ∩ | |
240 | 0xF0 | ≡ | |
241 | 0xF1 | ± | |
242 | 0xF2 | ≥ | |
243 | 0xF3 | ≤ | |
244 | 0xF4 | ⌠ | |
245 | 0xF5 | ⌡ | |
246 | 0xF6 | ÷ | |
247 | 0xF7 | ≈ | |
248 | 0xF8 | ≈ | |
249 | 0xF9 | ∙ | |
250 | 0xFA | · | |
251 | 0xFB | √ | |
252 | 0xFC | ⁿ | |
253 | 0xFD | ² | |
254 | 0xFE | ■ | |
255 | 0xFF | ÿ |
係2D游戲位圖愛蒞做動畫, 要過濾『背景色』, 係Android OpenGL ES用alpha屏蔽『背景色』, 壹法位圖『A分量』Alpha = 0, 貳法黑色定為『背景色』係載入時將『A分量』Alpha = 0. 所以兩法要係『GL_RGBA』模式運運作.
RGBA8888位圖,RGB占24bit, Alpha 值A占8bit, 透明度範圍『0~255』. 『0』通透.『 255』實體.
設Alpha值 | 通透 | 實體 |
glAlphaFunc() | 0.0 | 1.0 |
glAlphaFuncx() | 0 | 255 |
若位圖冇Alpha 值, OpenGL ES 係載入時將Alpha值設1.
BGRA8888/ARGB8888 | Alpha = 0 |
RGB656,RGB888,index | R=0,G=0,B=0, 黑色 |
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width , height , 0, GL_RGBA, GL_UNSIGNED_BYTE, image); |
glEnable(GL_ALPHA_TEST); |
glAlphaFunc(GL_GREATER, 0); |
glAlphaFuncx(GL_GREATER, 0); |
OpenGL有『平行投影』同『透視投影』, 2D相機係『平行投影』生成方盒『視體』, 愛蒞剪裁物體, 唔係『視體』內唔『渲染』. 愛蒞『等比例游戲』『平面游戲』
OpenGL『2D相機』原點『0,0』係『左下角』, z軸遠端係負,近端正.
Android『熒屏』原點『0,0』係『左上角』,
glMatrixMode(GL_PROJECTION); |
glLoadIdentity(); |
glViewport(x, y, window_width, window_height); |
glOrthof (left,right,bottom,top,near,far); |
glOrthof (0, frustum_width, 0, frustum_height, 1, -1); |
glOrthof (x- width/2, x+width/x, y-height/2, y+height/2, 1, -1); |
glOrthof() | |
『left, bottom』 | 左下角『0, 0』 |
『right, top』 | 右上角『width, height』 |
near | z軸近端剪裁面 |
far | z軸遠端剪裁面 |
glMatrixMode(GL_MODELVIEW); |
glLoadIdentity(); |
示例
void Projection_Camera2D(CAMERA2D_PTR cam){
// 重置視區尺寸 ::glViewport(0,0,cam->real_width,cam->real_height); // 設爲投影矩陣 ::glMatrixMode(GL_PROJECTION); // 載入單位矩陣 ::glLoadIdentity(); // 正交投影 glOrthof (0, cam->frustum_width, 0, cam->frustum_height, 1, -1); // 設定模型視圖矩陣 ::glMatrixMode(GL_MODELVIEW); // 載入單位矩陣 ::glLoadIdentity(); } |
係『Android OpenGL ES』用『SurfaceView』蒞畀『OpenGL ES』渲染. 之前『SurfaceView』代碼擺係『MainActivity.java』.更佳方法係『SurfaceView』『Runnable』『SurfaceHolder.Callback』封裝成單獨『GameView calss』.以保持代碼『簡潔』同埋『重用』.
『File->New->Java Class』 |
public class GameView extends SurfaceView implements Runnable,SurfaceHolder.Callback{ |
int view_width,view_height;
public SurfaceHolder surfaceHolder; public Surface surface;//用蒞渲染 |
public GameView(Context context) {
super(context); init(context);// 設置渲染 } |
public GameView(Context context, AttributeSet attrs) {
super(context); init(context);// 設置渲染 } |
public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context); init(context);// 設置渲染 } |
public void init(Context context){
this.surfaceHolder = getHolder(); this.surfaceHolder.addCallback(this); this.surface = surfaceHolder.getSurface(); } |
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder){ new Thread(this).start(); } |
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height){ view_width = width; view_height = height; } |
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } |
@Override
public void run() { AssetManager assetManager = getContext().getAssets(); Lib.init(assetManager, surface, view_width, view_height); while (true) {// 請求渲染 Lib.update(); } } |
你必須登入才能發表留言。