前言:這篇想要寫的盡量簡單易懂,所以用了一些技術上不太正確的譬喻,高手看到請鞭小力一點。
劇情:小明在外租屋,房東家裡裝了一條ADSL網路,免費分給各位房客用。小明的朋友阿喵架了一個FTP站,在上面放了一些電影。有一天,小明在阿喵的FTP上抓電影時,房東的兒子打網路遊戲突然變的很不順,下達一個攻擊指令後過三秒才會有反應。房東的兒子和房東說了這樣的情況,於是房東就把房客們的網路線拔掉了...如果有在網路上下載檔案(FTP, BT, eMule)的人,應該常常會有這種經驗...打BBS或網路遊戲突然變的很lag(指網路回應時間很慢)。要怎麼避免這種狀況呢?
2007年10月2日 星期二
Wordpress忘記密碼的解決方法
此處指自己架的wordpress,並非wordpress.com提供的service。
第一種方法:在login畫面點選forget password,會寄送一封信到你的信箱,附帶一個可以更改密碼的link,但要是這方法失效的話...
進phpmyadmin,修改wp_users table,將使用者的密碼欄位清空 (原本會看到一串16進位的數字),打上新的密碼,並點選MD5。phpmyadmin會幫你把密碼用MD5 hash後存入資料庫,收工。
事實上sql指令夠熟的話,直接去console下sql...
參考http://codex.wordpress.org/Resetting_Your_Password
第一種方法:在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日 星期一
遊戲中常見的幾種音樂格式
這篇是貼我自己以前寫的文章。
介紹這些格式的文章應該不少,但我想大多過於專業
我試著用自己的話,盡量簡單地描述四種遊戲最常見的音樂格式
失真壓縮就是指在壓縮的過程中,損失一些原有的資訊
舉大家比較熟悉的圖片來說,bmp就好像wav的角色
png,gif就是一種非失真壓縮(畫質不會變差),jpg就是失真壓縮
介紹這些格式的文章應該不少,但我想大多過於專業
我試著用自己的話,盡量簡單地描述四種遊戲最常見的音樂格式
- MIDI:通常副檔名為mid,MIDI是Music Instrument Digital Interface的簡寫
特色是檔案很小,非常小
簡單的這麼解釋好了:
mid檔就像是樂譜,記錄著「第5.02秒鋼琴要彈下sol、第6.31秒吉他要彈下ra」這樣的資訊
然而mid檔裡本身並沒有吉他、鋼琴的音色。這也就是為何mid檔案小的原因
那當我們的電腦撥放mid檔時,怎麼知道吉他、鋼琴的音色呢?
這是因為mid檔通常遵守一種叫「General MIDI」的格式
「樂器1」表示鋼琴、「樂器25」表示尼龍弦的古典吉他
然而我們的音效卡上有一個「MIDI音源器」,負責按照這些樂器編號,把聲音撥放出來
(當然有軟體音源這個例外,但不在此討論)
單純使用mid檔的話有一些限制- 音色是看使用者電腦上的音源,不同的電腦撥放出來的效果可能會不同
(大部份的人應該都是爛爛的AC97音效卡) - 音色有限,只有General MIDI提供的音色 (我記得是128種,不知道有沒有記錯)
- 效果有限,沒辦法自由的調整迴音、各種效果(equalizer, echo, reverb, flanger等....多不勝數)
- 音色是看使用者電腦上的音源,不同的電腦撥放出來的效果可能會不同
- Wave:通常副檔名為wav
特色是檔案很大,非常大
大家可以把他想像成忠實的把聲音記錄下來的檔案格式
音質最好,所以花費的空間多
(大家可以把他想像成圖檔中的bmp檔)
許多商業遊戲都是用CD音軌的方式來儲存音樂
CD音軌其實也是屬於Wave的無失真儲存方式
(CD音軌的資訊其實就等於Sample rate=44,100Hz 雙聲道的Wave檔)
很常見的編曲方式就是:使用MIDI編曲軟體+自己的軟/硬體音源 => 混音成wave檔
然後再看要不要做壓縮之類的
和單純使用General MIDI比起來,這樣可以使用很多種的效果,處理上也有很大的彈性
Wave和以下的mp3, ogg...等真正儲存聲音的,通稱為數位音訊檔
接下來只是把Wave壓縮過的格式,我就不詳細介紹了
主要的目的只是跟大家講數位音訊和mid檔之間的差別 - mp3:
相信大家都很熟悉吧 XD
mp3是將wave失真壓縮(註)後的一種格式 - 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看看...
疑...不知道怎麼回事的error,但我們見招拆招一下
方法一: 修改範例程式,再include之前加上
方法二: 修改glyt.h第45行,將
兩者任做一項,這樣就可以run囉...
其實我滿推薦寫程式的人不要「只」用微軟的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實作教學的。
先講一下類別的設計:
作用其實很簡單
延伸練習:這只是個小小範例,我的code有滿多問題的,如果你想練習的話...
先講一下類別的設計:
- MovingObject:所有戰場上會移動的物件,Player及Enemy的父類別
- Player:玩家自機,畫面上那個藍點
- Enemy:敵機,不停撞過來的那些小紅點
- GameMaster:管理整個遊戲的迴圈與邏輯
- GameWindow:遊戲視窗
作用其實很簡單
- 建立一個視窗,設定大小為400x400。
- 建立一個Layer,該視窗的主要圖層。
- 然後建立一個GameMaster物件,就這樣。接下來遊戲的進行都交給GameMaster控制。
- 建立fore(前景)圖層,所有遊戲的物件都畫在這個圖層上。
- 建立玩家物件及99個敵人物件,敵人物件用一個陣列(Array)存放。
- 建立一個Timer,每25ms呼叫一次 (理想狀態下40fps),負責玩家、敵機的移動、碰撞判定。
- 之前說過這個範例不要想用到圖檔,所以我們使用正方形來表示自機與子彈。size是邊長,color是顏色
- 繼承Layer物件,建構時將自己放在fore這個圖層上
- 建構時指定顏色(子彈是紅色)及邊長。
- init函式負責初始化敵機 (在畫面的邊緣出現,向畫面內非)
- check_bound函式負責檢查敵機是否出界了,如果是的話,呼叫init來重置敵機。
- update函式負責敵機的移動
- 建構時指定顏色(藍色)
- update函式負責移動,使用System.getKeyState()來判斷方向鍵是否已被按下。
延伸練習:這只是個小小範例,我的code有滿多問題的,如果你想練習的話...
- 我忘了寫Player出界的判定,請補上
- 碰撞判定的公式其實是不對的,你發現了嗎?請修正
- Frame穩速的機制是否有比使用Timer還要好的方式呢?
- 敵機移動的速度目都只是整數,請修改init函式讓敵機的移動速度不要那麼規律。
- 找找看還有沒有其他bug吧 :)
訂閱:
文章 (Atom)