2007年12月24日 星期一

『 Status Update : 20071225 』

Project KFS 將會暫停一陣子

上星期五 city 開到半夜
所以跑去 "伯德書店" 閒晃
隨便翻了幾本有關寫遊戲的書
發現都不太有用 -_O"

只有一本寫的還蠻不錯的
裡面開頭就講... ( 大概意思 )

很多人一開始就想寫出像 DOOM 的遊戲
但成功的機率不大... 因為不切實際
初學者應該先從一些簡單的小遊戲著手
如果幾個禮拜之內能寫出來就該偷笑了

沒錯... 寫程式都是這樣
應該要先有好的規畫
再從最基本的寫起...
等穩定後再照著規畫慢慢的加料

標準訂太高... 到頭來只是一場空 *咚~ 鏘!*

2007年12月20日 星期四

『 Status Update : 20071210 』

反反覆覆... 捉摸不定...

[ 由十六個方塊所組成的人物 ]

[ 不要相信你所看到的... ]

註:還要加 pivot point 要不然一彎就變形了...

2007年7月1日 星期日

『 02.XX - PNG : 20070701 』

這幾天對於解無壓縮的 Indexed PNG 圖檔有了點進展。對於之前畫面會扭曲的原因,後來發現是因為每個讀到的資料區塊的第一個位元都要略過… (別問我為什麼,我只是發現它並非屬於在真正的資料裡頭) 結果就真的,每第一個位元都跳過後,解出來的資料就完全正確!

之後很快的就進行下一步… 解無壓縮的 24 bits RGB 格式圖檔,結果馬上在解資料上就錯了。當時還蠻火大的 ^%$#@! 因為代表之前寫好的解無壓縮的程式碼在 RGB 格式會有錯… 那會不會代表我要針對不同格式都要有一套解壓縮的方法?那哪寫的完…

後來靜下心來,看圖檔的資料… 慢慢的對照… 結果發現是 LEN 給的並不是真正所要讀的長度。天啊~ 之前要跳過每第一個位元,現在又要因為 RGB 而計算真正的資料長度… 為什麼不像 DEFLATE 規格裡寫的那麼簡單?看來我要再找一天來看看 libpng & zlib 的程式碼 (不好懂),看到底是要怎樣寫才對…

最後附上剛剛的成果:顯示一張 24 bits 的 PNG 圖檔。


2007年6月27日 星期三

『 02.03 - PNG : PLTE 』

PLTE (0x50, 0x4C, 0x54, 0x45)


  • RGB (3 bytes)
    Each palette's RGB (Red, Green, Blue) color value (0x00 ~ 0xFF).
    For example:
    0xFFFFFF = White
    0x000000 = Black
    0xFF0000 = Red
    0x00FF00 = Green
    0x0000FF = Blue
整個 PLTE 資料裡只包含 RGB 值,所以總大小應當被 3 除盡。反過來說,將 PLTE 總大小除 3 後將可得到裡頭的的色格 (palette) 數量。之前也提到說 NDS 只支援到 16 bits 的顏色,而 PNG 裡頭的顏色卻是以 24 bits (3 bytes) 來儲存,所以記得顯示時要先將 24 bits 的顏色轉換成 16 bits 的顏色。

#define IX_8B5B(x) ((u8)(((u16)(x) <<>> 8))

以上的 macro 則是將 x 值 * 32 後再 / 256 用途就是把 0 ~ 255 (8 bits) 的數字轉換成 0 ~ 31 (5 bits) 但我也不確定我這做法是否正確,至少目前看起來還算正常。

2007年6月23日 星期六

『 02.XX - PNG : 20070623 』

今天下午終於又繼續寫程式了 (幾天前得重感冒) 但還是沒辦法靜下心來讀 LZ77 的壓縮規格。後來想說這樣下去也不是辦法,所以改向先從沒壓縮的資料下手…基本上還蠻容易的,只要反復的:讀區塊的資料長度,將這長度的資料直接複製到目標…直到最後一個區塊。但之後就開始遇到一些小曲折…

一開始先弄一張全白的 PNG 來試著顯示在畫面上,結果還算成功…


之後就把原本要擺的畫面放進來試著顯示,結果有點淒慘…



不知為何整個顏色都跑掉,圖本身也扭曲了一邊。之後就一直在看是不是程式哪裡沒寫對,還是解讀資料時有誤…到後來才發現顏色會跑掉都是 RGB15 這個 macro 搞的鬼。原因是原本的 PNG 是以 24 bits 為單位來儲存每個像素 (每個 RGB 分別為 8 bits) 但是在 NDS 的 Framebuffer 模式底下則是 15/16 bits 為單位 (每個 RGB 分別為 5 bits) 所以產生色素顏色顯示錯誤的問題。至於解決的方法很簡單…那就是讀 PLTE 時順便將每個 RGB 值 * 5 / 8 來換算成顯示的單位就行了。


至於扭曲的問題,應該跟寬度記算錯誤有關…目前還找不到真正的原因,先暫時偷改了一下正確的程式碼讓它寬度少一格來把圖案調正。


暫時先這樣了,明天有時間再好好研究問題所在…

2007年6月16日 星期六

『 環 境 畫 面 』

最近忙著看 DEFLATE 的規格 (因為 PNG 裡的 IDAT 是用這方法壓縮的) 所以都沒什麼太大的更新。想說附上一張我寫程式的畫面給大家看看…

[ 註解 ]
左邊:Programmers Notepad (寫程式碼)
右上:DevkitPro MSys (編譯程式)
中上:iDeaS 模擬器 (目前只有除錯訊息)
右下:Firefox (很多規格都在網上找的)

就這樣嘍~ 下次見!

2007年6月7日 星期四

『 02.02 - PNG : IHDR 』

IHDR (0x49, 0x48, 0x44, 0x52)
  • Width (4 bytes)
    Image width in pixels.
  • Height (4 bytes)
    Image height in pixels.
  • Bit Depth (1 byte)
    Number of bits per sample or palette index. Valid values are 1, 2, 4, 8, 16.
  • Color Type (1 byte)
    Defines PNG image type. Valid values are 0, 2, 3, 4, 6.
    0 = Greyscale.
    2 = Truecolor.
    3 = Indexed-color.
    4 = Greyscale with alpha.
    6 = Truecolor with alpha.
  • Compression Type (1 byte)
    0 = Deflate/inflate compression with a sliding window of at most 32768 bytes.
  • Filter Method (1 byte)
    0 = Adaptive filtering with five basic filter types.
  • Interlace Method (1 byte)
    0 = No interlace, 1 = Adam7 interlace.

2007年6月4日 星期一

『 00.01 - PNG : General 』

PNG File Header

大小:8 bytes
內容:0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A

PNG Chunks
  • Chunk Length
    4 bytes unsigned integer specifying "Chunk Data" size. Valid value = 0 ~ 2^31-1
  • Chunk Type
    4 bytes of uppercase and lowercase ASCII letters.
    Byte
    1: Uppercase = Critical, Lowercase = Ancillary.
    Byte 2: Uppercase = Public, Lowercase = Private.
    Byte 3: Reserved, must be uppercase.
    Byte 4: Uppercase = Unsafe to copy, Lowercase = Safe to copy.
  • Chunk Data
    Can be zero length.
  • Chunk CRC
    4 bytes of CRC calculated on the preceding Chunk Type + Chunk Data.
資料來源

2007年6月1日 星期五

『 研 發 環 境 』

以下是我目前的研發環境…

基本環境
作業系統:Windows XP SP2
程式編寫:Programmers Notepad (DevKitPro)
繪圖軟體:Adobe Photoshop CS

軟體開發套件 (SDK)
名稱:DevKitPro
版本:1.4.3
網址:[http://www.devkitpro.org]
簡介:目前網路上最有人氣的免費套件,有支援 NDS/GBA、NGC 和 PSP。

模擬器 (Emulator)
名稱:iDeaS
版本:1.0.1.5
網址:[http://spazioinwind.libero.it/linoma/ideas.html]
簡介:相容性高也有在持續更新。最新版有修正 3D 顯示的問題,也支援遊戲儲存的功能。

2007年5月29日 星期二

『 前 序 』

當年…應該還是國中時代,跟兩位好友合買了「Ultima VIII Part 2: Serpent Isle」(創世紀七第二部:蛇島)。這遊戲算是我第一個最迷的電腦遊戲,也讓我們玩得沒天沒夜,從此我也開始好奇著寫遊戲的世界…當時每天坐在電腦前開著 QBASIC 就是想弄出個什麼東西,但都毫無結果。

高中畢業之後,因著網路漸漸普遍,我開始在網路上尋找別人分享出來的寫遊戲文章。就這樣自己一邊摸索,用 C 寫程式,用小畫家畫圖…很奇妙的我竟然寫出一小段在 DOS VGA 底下跑的遊戲!內容很簡單,由上往下的視角、方向鍵控制人物走動、背景捲動、還有搞笑的隱形牆。雖然只是很小的東西卻讓我高興的不得了。當然也有秀給我一些朋友看,他們也是蠻驚訝的!

然而夢想卻在這時暫停了…學業煩忙加上放假打工,一直都沒再有時間給自己。雖然之後的幾年也是有陸陸續續的寫些小程式 (WinCPK = 即時雪花產生器、etBIOS = 小飛機,DirectX Demo) 但總沒有一個是真正完成的遊戲…

2007 年 04 月很突然的親自玩到 NDS 後就被它迷上了…雖然主機已經推出來幾年了,硬體上也沒 PSP 來的強,但它的雙螢幕 + 觸碰功能卻能讓遊戲有了新的發展空間。之後這幾天就一直在網路上找著 NDS 的研發環境…腦海裡也有了一個遊戲的構想。為了這次不再半途而廢,決定開個部落格來記載進度與心得,也希望能藉此認識有共同興趣的來彼此交流。

我 會 努 力 邁 著 夢 想 前 進 !