增加了角色移動的功能,感覺上還蠻順暢的,不過好趕,有種在亂寫的感覺
移動的影片,實做角色移動的部份,因為Webcam是固定焦距,太遠又暴光過 度,所以只能這樣拍,看起來像近視一樣= = 不過感覺上滑動還蠻順暢的
話說,有誰知道哪裡可以找到免費的八個方向角色走路的圖…. 我想要找來測試一下都不知道從何找起 orz
美術白痴的我要畫大概是不太可能
增加了角色移動的功能,感覺上還蠻順暢的,不過好趕,有種在亂寫的感覺
移動的影片,實做角色移動的部份,因為Webcam是固定焦距,太遠又暴光過 度,所以只能這樣拍,看起來像近視一樣= = 不過感覺上滑動還蠻順暢的
話說,有誰知道哪裡可以找到免費的八個方向角色走路的圖…. 我想要找來測試一下都不知道從何找起 orz
美術白痴的我要畫大概是不太可能
剛才在android上寫了一個最基本的地圖引擎,就只是把地磚拼起來而已,感覺效果然不錯,FPS也在可接受的範圍,HTC Magic上大約能跑到25~30左右,地圖滑動也相當順暢
我在想,Android上面玩MMORPG不知道有沒有搞頭 XD,真的蠻想做做看,不過也要我有時間,心有點癢想繼續寫下去
今天玩了一下在Android寫game,託以前經驗的福,很容易就上手了,和一般的Game沒有太大的差別,但因為Android所謂的main-thread和main-loop都是用來回應UI用的,因此要更新遊戲的邏輯、畫面,需要另外的Thread,參考Android裡的遊戲範例,很快地就隨便寫出一個還稱不上是Game的小程式來玩,只是簡單地移動貼圖,在模擬器跑慢到暴炸,FPS只有1初頭,根本沒辦法進行debug,而在我的HTC Magic下跑FPS可以到30~40左右,所以要在Android開發遊戲似乎實體的手機是必需的,模擬器平時跑一般的程式都可以慢成誇張的地步了,更何況是不停更新的Game,所以非手機或其它硬體支援不可,除非哪天模擬器效能大改進
雖然這小程式沒什麼大問題,但是有件事情讓我很困擾,就是每隔一點段時間就會發生delay,週期性且不斷地發生,這樣的delay會讓玩家感到不爽,難以進行遊戲,糾~竟~是為什麼會有這週期性的delay,我們…繼續看下去
找了一些資料,終於讓我發現這週期性delay的兇手,就是來自於garbage collection的週期性回收垃圾,請看VCR
在Android寫一個簡單的貼圖移動程式,發現會有週期性的delay,原因出在於垃圾回收機制不停地週期性地運作,請看背後LogCat的GC發生的一瞬間,程式的畫面就會delay
我,沒有什麼寫Java經驗的我,new一個物件似乎很輕鬆平常,反正Java有垃圾回收機制,一般寫程式再怎麼丟都有人幫你撿,但是寫Game就是另一回事了,對於寫Game而言,垃圾回收機制是delay的來源,所以在遊戲迴圈內不能有用完即丟的new物件產生,任何物件在遊戲都應該被reference或是重覆利用,不停丟垃圾的下場就是你的遊戲會因為有人一直停下來幫你撿垃圾所以不停的delay
我發現delay似乎還是會發生,想了一想,想到了在這背後還有隱含的new會發生,也就是Java的字串其實骨子裡就是new,只是方便的寫法所以不用特別寫出來,在移除了所有使用到暫時字串的地方後,果然圖片的移動就相當順暢
我想寫一個簡單的地圖引擎實作來看看Android的2D貼圖效能如何,如果不幸的很不夠力,可能就得用OpenGL下去畫2D了
在拿到HTC Magic後,就開始試著寫程式,我有很多點子,不過在一開始對Java不熟還有Android也不熟不是那麼容易實作,就挑了一個簡單一點的題目來做,就是電力座標定位程式,那什麼是電力座標呢? 電力座標其實是台電公司標在電器設備上用來表示座標位置的一種表示法,你可以在住家週圍的電線桿上找到,例如像這樣的電線桿
它的詳細一點的介紹可以在這裡找到
要手動計算電力座標雖然不難,但也很煩,而且還有座標轉換的問題,為此我就寫了這樣一個程式,只要輸入座標就可以自動換算在地圖上標示出來,這程式說起來簡單,不過就代公式而已,但是對於我來說卻一個頭兩個大
不止是公式麻煩,在找到公式前,還得瞭解一大堆背景知識,關於地理、地圖的相關知識,對於讀資工的阿宅我來說,那些資料真的很不好找,讀起來也很痛苦,經過辛苦地在google上打滾,還有好心人的幫助下終於知道怎麼做,其實要把電力座標轉換成TWD67很簡單,只要一些簡單的式子,接著把TWD67轉換成TWD97也不難,最麻煩的就在於把TWD97轉成經緯度,它的式子非常之復雜,這之後另外再寫一篇來介紹
目前程式非常地陽春,我還沒有加任何額外的東西進去,目前就只有輸入和定位如此而已,較細節上的功能會慢慢更新
更新了介面,還有操作方式,讓使用更人性化
修正了座標第六七個字元限制設錯的bug,請下載最新版,否則遇到有E之後的字元都沒辦法輸入
只要在Android Market搜尋電力就可以找到程式,或是如果從android上瀏覽此文章可以點擊此連結前往Android market下載頁面,又或著用你的barcode scanner掃描以下連結
(我都忘了還有QR barcode可以用= =)
有網友在這篇 別讓危險成為預設的行為,讓危險的行為比安全的行為更麻煩 回應裡提到
WiyD-Luck
請問大大寫程式寫多久了
小弟今年大三要升大四了
在無意間近來大大的blog
收穫良多(請受小的一拜
會寫程式.跟會寫一個能用的程式.差別好大…
想問大大那些程式會造成的漏洞.是經過自己研讀還是有人指點才有如今的實力阿
PS.小弟就讀的大學老只有教我怎麼寫程式.並沒有教我寫出一個可以用的程式..
我覺得這是很多人心裡共同的疑問,所以就特地寫了一篇來說說我的看法…
最近我在用wxPython開發某些程式,隨著開發的過程中,難免需要一些直接的測試,改動程式碼來進行測式似乎不是很明智的選擇,即使Python是直譯式的語言,每改一次重新啟動整個程式也是一種浪費,而且狀態每次也會重置,於是我開始想,我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中,如此一來我就可以在開發時直接進行某些測試,對某些特定的模組操作,如此一來開發的效率可以提升,對於程式而言也會更好除錯,但是雖然寫一個console不是什麼太難的事,但也不是什麼太輕鬆的事,為了早點完成程式,於是我就沒有真的去做
當有一天我訂的書: wxPython in action終於來了,這本書要1500元,實在是不便宜,但是我認為卻很值得,我在書中發現我以前一直都沒仔細去注意到的東西,PyCrust,在翻過這章節時我驚訝地發現,這不就是我想做的嗎? 一個控制臺,可以讓我操作、觀察、測試我的GUI,而且整合的方法超簡單,只要一行指令
python pywrap.py main.py
在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去,在我程式中執行的畫面就像這樣
在截圖中我利用pycrust將gui的背景換成了紅色,它不止是一款簡單的GUI,因為他是動態載入模組的name space,和一般IDE不同的是,他的自動完成是動態的,一般的IDE只抓得到靜態的成員,但是即然是動態載入又是在執行中,有什麼成員一清二楚,所以基本上自動完成功能感覺非常地強大,但相對的弱點是對於靜態的部份比較麻煩
它除了可以自動整合到現有的wxPython gui程式中,更可以把裡面各個元件分開來獨立使用
對我來說,PyCrust將會是像神兵利器般好用的工具,像是開發遊戲之類需要大量的調校,一個console或是動態的機制是免不了的,而console提供了立即且互動式的環境,有了PyCrust,就等於有了現成的console可以使用,在遊戲的開發過程中,開發者可以利用這個console動態地改變各種參數來觀察反應等等,當然開發遊戲只是其中一個應用的例子,即使在一般的GUI中也會是很好用的工具
wxPython in action真的是難得一見的好書,有別於一般的書,它使用問句來當做標題,但是不會因為這樣而零散雜亂,相反的,你可以很正式地看完一次,也可以很快速地掃過一次,當你需要什麼東西時,那些問句可以幫助你很快地找到你需要的東西,豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子,或是想像到底是如何運作,如果要學wxPython,我覺得這本書真的是非常值得推薦,做為工具書,這本也是必備的一本
飛行一直是人類的夢想,這對大多數人來說都遙不可及,我們所謂的飛行頂多是搭乘飛機而已,是需要長時間的訓練才能辦到的,但是飛行有相當的風險,沒辦法讓初學者一開始就駕使飛機,為了因應這樣的需求,模擬器被發明了,在進真的駕駛艙飛行前,初學者可以在模擬的環境下安全的學習如何飛行,原本這需要特殊的設備,現在拜由電腦的進步,在家也能夠進行模擬飛行,雖然是模擬的,和現實有一段差距,但是已經相當逼真了,玩家可以透過模擬飛行來飛遍全世界,我們現在就來介紹,微軟所推出的模擬飛行10,以下簡稱FSX
模擬飛行是微軟所推出的一款模擬飛行遊戲,說它是遊戲似乎有點小看它,雖然是遊戲,但是有相當的擬真程度,有很多熱衷的玩家甚至組成了虛擬航線,也就是只存在線上的航空公司,玩家們要通過考試才可以成為機師,我們先來看看它的遊戲畫面
如你所見的,進如眼廉的是複雜的儀表版,就跟現實中你會在飛機的駕駛艙看到的一樣,然後是窗外的景色,在這裡是桃園中正國際機場,沒有錯,FSX收錄了世界各地的機場,台灣的機場當然也在裡面,而這台飛機是波音747-400,基本的東西都跟現實中的差不多,就像開真的飛機似的,所以其實玩這款遊戲,就會發現原來開飛機這麼困難,需要非常非常多的知識,流體力學、通訊、精通英語等等,我個人只是偶爾玩一下,所以都是靠自己的直覺亂飛,偶爾看一下文章找一下資料,在某些程度來說他非常地困難,像是降落就非常地困難,我摔爛幾百架的飛機才漸漸有成功地降落
接著就讓我們來介紹FSX….
一直一來,寫程式是我的專業,但偶爾會有需要撈過界的時候,也是我最頭痛的時候,美術設計,像是網頁程式寫完,要開始把網頁美化,我發現這對我來說比什麼都還來得困難,光是配色就是門很大的學問,以前我對顏色一點概念都沒有,配出來的顏色很常是一些大便色,連我自己看了都想吐,畫圖也是一樣的,畫出來不是很難看,而是根本就不能看,我除了寫程式還得做美術? 我也沒有那樣的時間,或許正因為沒有花時間下去,這個世界是公平的,花多少時間下去,才會有多少的能力,一直一來我腦中響起ptt鄉民最愛講的話之一….
是的,沒有人是萬能的,該交給專業的人時就該這麼做,但是問題出在於,專業的人到底要去哪裡找? 自稱設計師的人滿山遍野,到底要從何找起? 我這陣子逛了不少設計師的網頁,大部份都相當漂亮,有些甚至是美到讓人讚嘆,但是卻大部份都有一個致命的通病….,那就是可用性0分
大部份設計師的網頁開起來都是華麗的Flash滿天飛舞,我們先不論用Flash做網頁對SEO的殺傷性 (搜尋引擎應該是難以找到Flash裡的內容),就只從可用性來看
看網頁要先下載超過20秒以上的Flash是常態,很多我在開啟的過程中不耐煩就把網頁給關了,沒理由的跳出新視窗的更是數不清,經由廣告視窗的訓練,大家對於那種跳出來的視窗很常第一個直覺反應就是關掉它,我也不例外,好好的普通網頁可以用,跳出一個新視窗來到底是要做什麼我也搞不懂,最誇張的還有遇到用Flash擴成全營幕,我真的不知道什麼網站可以偉大到擴成全螢幕讓使用者專心來看你的網頁,如果遇到不知道怎麼跳出的使用者就糗大了,你可能會說,他進入時會顯示"按Esc跳出"阿,是這樣嗎? 以自己的觀點來設計網頁就是失敗之處,我們都認為Esc跳出好像是理所當然的事情,但是如果遇到Esc在哪裡都不知道的使用者呢? 是這樣的話可能會遇到下列情況
使用者不知道要怎樣跳出全螢幕模式,找了三分鐘都找不到,然後罵了:
幹! 爛網站
接著按電腦重開機鈕….
這不是不可能發生的事情,接著還有其它常見的通病,很多網站都喜歡用一些五四三的方式來代替按鈕,人物、物品、動物、阿貓阿狗之類的什麼鬼都有,看起來是很酷沒有錯,但是請問先生,我要怎麼知道哪個東西可以按? 是阿,我可以用滑鼠移過去點點看是嗎? 這似乎也是蠻有趣的驚喜不是嗎? 沒想到這東西居然可以按,呵呵,真有趣
大錯特錯! 如果你做的是遊戲,藏一些異想不到的東西在畫面裡,這還說得通,但可惜我們不是在玩遊戲,使用者也是,沒有使用者有那種美國時間來慢慢品嘗探索你網頁的樂趣,對於使用者來說,他們只想找到他們要的東西,其餘的東西都是雜訊,以這些設計師的網頁來說,我想找到的是他們的作品集,這下可好了,作品集的按鈕到底是哪一個? 一個一個試嗎? 不,關掉網頁,找下一個,這是最快的做法,所以,請不要挑戰使用者的耐心
除了不知所云的按鈕,你追我跑的設計也是頗受歡迎,很多人喜歡讓滑鼠移動靠近某些東西會有不同的變化,像是有些是越靠近圖片越大,我發現我想看那張圖片,但是我非得把滑鼠移到圖片的最中心才能把圖片停住且放到最大的樣子,我只能說我可能走錯網頁了,我以為我來到了CS甩槍訓練的Flash網頁,這只是一個例子,還有很多類似的設計,很酷,但是很難用
我知道想要突破常規是很多設計人的心願,但是在那之前還有一個前提是可用性,如果說做出來的東西是藝術品,只要用眼睛看就好的純欣賞用的作品,那便沒有什麼可用性好說的,但是如果說做出來的是網頁,網頁的目的如果是要讓人使用,那麼天大地大不是台科大,而是使用者,一切都是為了使用者而打造的,使用者必須被擺在第一個順位,賞心悅目、有創意,但是一樣要有可用性,除非你的網頁做出來只是孤芳自賞的藝術網頁
我不是什麼可用性的專家,但是我知道有針對網頁可用性的好書,叫做Don’t make me think,已經算是經典的好書,他的最高原則就是直覺,也就是讓使用者不需要思考就能使用的設計,如果你的網頁在我說的範圍裡,可以參考看看這本書,或是當做沒聽到,以上只是打打嘴砲,請別在意
在很久很久以前,想要擴充Python要使用API來包裝成Python可用的模組才可以,面對囉唆的一堆C API是一件痛苦的事,接著,進入了石器時代,人們開始使用工具,出現了SWIG、boost::python等,讓擴充Python變成一件更簡單的事情,但是即使是如此,這還是笨重的方法,產生了笨重的二進制檔,笨重的編譯工作,對於只是要將c語言的library擴充給Python使用而言這還不夠好,接著,終於有了進化,ctypes出現了,人們想說,與其做出pyd來給python使用這種多此一舉的事情,東西就在那裡,dll就在那裡,為何不能直接使用呢? ctypes的目的就是讓Python可以直接操做c語言寫的dll,這是一個大躍進,到了python2.5 ctypes還成為了標準的模組之一,這表示新的時代的到來
相對於熟悉的事物,面對類似性質但是不同的事物時,總難免有多少疑惑,我在一開始也懷疑這樣能做到什麼地步? 但是在看了它的文件後我瞭解到,大部份dll使用ctypes都可以應用得很好,像是我擔心的callback,ctypes一樣可以提供方法來把python的函數包裝成c語言的callback丟給c語言的dll,運作得很好,其中我最擔心的是多緒的問題,因為有些callback是從其它thread呼叫的,因此如果沒考慮到multi-thread問題的話,callback就廢一半了,但是它一樣也考慮很週到,即使是從不同thread呼叫的python callback,也一樣可以運作得很好 舉個例子
DSPPROC = WINFUNCTYPE(None, HDSP, DWORD, c_void_p, DWORD, c_void_p)
在有了c語言函數的原形建立後,我們就可以使用它來包裝python的函數丟給c語言的dll處理
print BASS_Init(-1, 44100, 0, 0, 0) stream = BASS_StreamCreateFile(False, 'c:\\god know.mp3', 0, 0, 0) print stream def dspProc(handle, channel, buffer, length, user): print handle, channel, buffer, length, user cDspProc = DSPPROC(dspProc) print BASS_ChannelSetDSP(stream, cDspProc, None, 0) BASS_ChannelPlay(stream, False) raw_input()
值得注意的是,因為Python有reference counter,也就是說,當沒有變數指向某個物件時,那個物件可能就會被回收,因此如果我們這樣寫
BASS_ChannelSetDSP(stream, DSPPROC(dspProc), None, 0)
Oops,恭喜你,你的程式很可能隨時會當掉,因為暫時的變數在被回收後,那塊記憶體就不再是c語言的函數,裡面可能塞了一些亂七八糟的東西,你的dll一呼叫那函數,遇到了些亂七八糟的東西會當掉也不是什麼奇怪的事,因此寫ctypes時,必須同時使用Python和C語言的觀點來看,舉另一個例子,如果某個C語言的API的文件上寫到,你傳進來的字串它不會copy,只會留著它的指標,在完成之前那個指標應該都還是要為有效的,這時,你就必須在python用一個變數一直保持著reference到產生出來的c語言字串記憶體空間,防止它被回收
除了callback以外,你可能會想到: "阿,那struct和union怎麼辦?" ,ctypes一樣有辦法,以下就是一個例子
class BASS_INFO(Structure): _fields_ = [ ("flags", DWORD), ("hwsize", DWORD), ("hwfree", DWORD), ("freesam", DWORD), ("free3d", DWORD), ("minrate", DWORD), ("maxrate", DWORD), ("eax", BOOL), ("minbuf", DWORD), ("dsver", DWORD), ("latency", DWORD), ("initflags", DWORD), ("speakers", DWORD), ("freq", DWORD), ]
人們總是覺得,事情還可以更好,事情只成功一半,用手寫ctypes是件很痛苦的事情,看著c語言的header檔複製、貼上、修改的無限迴圈,再也沒有比這個還無聊的事情,電腦的發明就是要解決問題,重覆性如此高和有規則的工作不應該浪費保貴的人力,因此,下一步就是c語言header的parser,理想的狀況是,可以自動parse c語言的header然後產生相對應的python ctypes寫的binding module,如果做到這個地步代表了什麼? 這意味著,Python能用的資源,從本來的常見module一下子突然擴大到了所有的c語言寫的library,這是多麼偉大的進步
我使用ctypes的目的在於寫BASS的python binding,BASS是一套audio library,因為它沒提供Python的binding,所以我只好自己寫,在無聊的複製貼上過程中,我有試著想過寫parser來自動化完成我的工作,但是c語言的parser已經複雜到了一個地步,如果要寫出那樣的parser,會比我直接用手寫還來得麻煩,所以就沒有繼續研究
BASS binding運作得很好,有興趣的朋友可以參考看看
現代的電腦,CPU跑得跟火箭一樣快,但是遺憾的是,就算CPU跑再快,它還得等週邊一大堆烏龜們,我想現在最慢的莫過於硬碟吧,即使容量以驚人的速度成長,但是效能成長還是很差勁,電腦常常需要等像烏龜一樣的硬碟,因此如果現代電腦最慢的組件被換掉了,將會是一大進步,瓶頸也會因此突破很多,以下看看超強用24顆SSD串起來的電腦,串很大~ 串不用錢
真期待SSD的時代到來,就可以跟龜速硬碟說掰掰了