2007年10月2日 星期二

下載檔案如何不造成lag?

前言:這篇想要寫的盡量簡單易懂,所以用了一些技術上不太正確的譬喻,高手看到請鞭小力一點。


劇情:小明在外租屋,房東家裡裝了一條ADSL網路,免費分給各位房客用。小明的朋友阿喵架了一個FTP站,在上面放了一些電影。有一天,小明在阿喵的FTP上抓電影時,房東的兒子打網路遊戲突然變的很不順,下達一個攻擊指令後過三秒才會有反應。房東的兒子和房東說了這樣的情況,於是房東就把房客們的網路線拔掉了...如果有在網路上下載檔案(FTP, BT, eMule)的人,應該常常會有這種經驗...打BBS或網路遊戲突然變的很lag(指網路回應時間很慢)。要怎麼避免這種狀況呢?

Wordpress忘記密碼的解決方法

此處指自己架的wordpress,並非wordpress.com提供的service。

第一種方法:在login畫面點選forget password,會寄送一封信到你的信箱,附帶一個可以更改密碼的link,但要是這方法失效的話...

進phpmyadmin,修改wp_users table,將使用者的密碼欄位清空 (原本會看到一串16進位的數字),打上新的密碼,並點選MD5。phpmyadmin會幫你把密碼用MD5 hash後存入資料庫,收工。

事實上sql指令夠熟的話,直接去console下sql...

UPDATE `xxx_blog`.`wp_users` SET `user_pass` = MD5( 'password' ) WHERE `wp_users`.`ID` =2 ;

參考http://codex.wordpress.org/Resetting_Your_Password

2007年3月19日 星期一

遊戲中常見的幾種音樂格式

這篇是貼我自己以前寫的文章。



介紹這些格式的文章應該不少,但我想大多過於專業
我試著用自己的話,盡量簡單地描述四種遊戲最常見的音樂格式

  1. MIDI:通常副檔名為mid,MIDI是Music Instrument Digital Interface的簡寫
    特色是檔案很小,非常小

    簡單的這麼解釋好了:

    mid檔就像是樂譜,記錄著「第5.02秒鋼琴要彈下sol、第6.31秒吉他要彈下ra」這樣的資訊
    然而mid檔裡本身並沒有吉他、鋼琴的音色。這也就是為何mid檔案小的原因

    那當我們的電腦撥放mid檔時,怎麼知道吉他、鋼琴的音色呢?
    這是因為mid檔通常遵守一種叫「General MIDI」的格式
    「樂器1」表示鋼琴、「樂器25」表示尼龍弦的古典吉他
    然而我們的音效卡上有一個「MIDI音源器」,負責按照這些樂器編號,把聲音撥放出來
    (當然有軟體音源這個例外,但不在此討論)

    單純使用mid檔的話有一些限制

    1. 音色是看使用者電腦上的音源,不同的電腦撥放出來的效果可能會不同
      (大部份的人應該都是爛爛的AC97音效卡)
    2. 音色有限,只有General MIDI提供的音色 (我記得是128種,不知道有沒有記錯)
    3. 效果有限,沒辦法自由的調整迴音、各種效果(equalizer, echo, reverb, flanger等....多不勝數)


  2. Wave:通常副檔名為wav
    特色是檔案很大,非常大

    大家可以把他想像成忠實的把聲音記錄下來的檔案格式

    音質最好,所以花費的空間多
    (大家可以把他想像成圖檔中的bmp檔)

    許多商業遊戲都是用CD音軌的方式來儲存音樂
    CD音軌其實也是屬於Wave的無失真儲存方式
    (CD音軌的資訊其實就等於Sample rate=44,100Hz 雙聲道的Wave檔)


    很常見的編曲方式就是:使用MIDI編曲軟體+自己的軟/硬體音源 => 混音成wave檔

    然後再看要不要做壓縮之類的
    和單純使用General MIDI比起來,這樣可以使用很多種的效果,處理上也有很大的彈性


    Wave和以下的mp3, ogg...等真正儲存聲音的,通稱為數位音訊檔
    接下來只是把Wave壓縮過的格式,我就不詳細介紹了
    主要的目的只是跟大家講數位音訊和mid檔之間的差別

  3. mp3:
    相信大家都很熟悉吧 XD


    mp3是將wave失真壓縮(註)後的一種格式

  4. ogg:
    可以參考維基百科: Ogg Vorbis

    一樣是失真壓縮
    據說同樣壓縮比下的音質比mp3還好,我自己倒是沒試過
    在一般使用者間這個格式還是沒有比mp3被廣為使用


註:失真壓縮
失真壓縮就是指在壓縮的過程中,損失一些原有的資訊

舉大家比較熟悉的圖片來說,bmp就好像wav的角色
png,gif就是一種非失真壓縮(畫質不會變差),jpg就是失真壓縮

2007年3月8日 星期四

GLUT+Code::Blocks+Mingw環境設定

GLUT....不介紹了,反正就是OpenGL的一些Toolkit,讓programmer避免處理low level的視窗控制。

其實我滿推薦寫程式的人不要「只」用微軟的IDE。之前看到某位網友抱怨,他們學校沒有正版的VC教育版,老師還要求要用VC寫作業。多推廣一下免費開源的IDE不是很好嗎?



Code::Blocks+Mingw的安裝可以參考這篇,如果不是要跑OGRE的話,直接去官網下載區抓安裝包應該比較簡單 (with Mingw compiler的)。

原本的GLUT Windows Binary和Mingw似乎不太相容,請抓GLUT for Mingw32,隨便解壓到一個目錄(我放在Mingw下),就可以了。

預備動作就這麼簡單 (不過我灌時試GLUT library試了一陣子,才發現要抓Mingw版的) ,進到Code::Block,New project -> GLUT project -> 到GLUT's location時輸入你安裝GLUT的位置。

這樣開好專案後會出現template的範例程式,compile&run看看...
C:\codeblock\GLUTMingw32\include\GL\glut.h:45: error: redeclaration of C++ built-in type `short'
疑...不知道怎麼回事的error,但我們見招拆招一下
方法一: 修改範例程式,再include之前加上# define _WCHAR_T_DEFINED
方法二: 修改glyt.h第45行,將typedef unsigned short wchar_t;這行給註解掉

兩者任做一項,這樣就可以run囉...

2007年2月21日 星期三

TJS特訓99解說篇

上一篇忘了說,我的架構主要是參考這篇TJS實作教學的。

先講一下類別的設計:
  • MovingObject:所有戰場上會移動的物件,Player及Enemy的父類別
  • Player:玩家自機,畫面上那個藍點
  • Enemy:敵機,不停撞過來的那些小紅點
  • GameMaster:管理整個遊戲的迴圈與邏輯
  • GameWindow:遊戲視窗
GameWindow類別
作用其實很簡單
  • 建立一個視窗,設定大小為400x400。
  • 建立一個Layer,該視窗的主要圖層。
  • 然後建立一個GameMaster物件,就這樣。接下來遊戲的進行都交給GameMaster控制。
GameMaster類別
  • 建立fore(前景)圖層,所有遊戲的物件都畫在這個圖層上。
  • 建立玩家物件及99個敵人物件,敵人物件用一個陣列(Array)存放。
  • 建立一個Timer,每25ms呼叫一次 (理想狀態下40fps),負責玩家、敵機的移動、碰撞判定。
MovingObject類別
  • 之前說過這個範例不要想用到圖檔,所以我們使用正方形來表示自機與子彈。size是邊長,color是顏色
  • 繼承Layer物件,建構時將自己放在fore這個圖層上
Enemy類別
  • 建構時指定顏色(子彈是紅色)及邊長。
  • init函式負責初始化敵機 (在畫面的邊緣出現,向畫面內非)
  • check_bound函式負責檢查敵機是否出界了,如果是的話,呼叫init來重置敵機。
  • update函式負責敵機的移動
Player類別
  • 建構時指定顏色(藍色)
  • update函式負責移動,使用System.getKeyState()來判斷方向鍵是否已被按下。
我就不一行一行的講解程式碼了,有興趣的話可以留言討論。



延伸練習:這只是個小小範例,我的code有滿多問題的,如果你想練習的話...
  1. 我忘了寫Player出界的判定,請補上
  2. 碰撞判定的公式其實是不對的,你發現了嗎?請修正
  3. Frame穩速的機制是否有比使用Timer還要好的方式呢?
  4. 敵機移動的速度目都只是整數,請修改init函式讓敵機的移動速度不要那麼規律。
  5. 找找看還有沒有其他bug吧 :)