What have you found for these years?

2007-09-01

tower defense?

從 star craft 到 war craft 3, 甚至是現在一堆的 flash td,
我一直很喜歡這種型態的遊戲,也一直想要自己做一個,當然也一直都沒有
完成過。開始一點點這種事,倒是發生過很多次。稍微記錄一下需要哪些東西
好了﹍。

1. grid based, 不要類比地圖,安排位置時會覺得很麻煩。
2. wave control, 能狂按才會有爽度。
3. no air/ground difference, 敵人請一致。
4. 變賣打折嗎?可以移動嗎?
5. 可以跟敵人共享道路嗎?可以的話,需要 blocking algorithm.
6. 升級差異不要過大,讓群眾與精英都有一份空間。
7. 具有攻擊力的敵人(來自 war craft 3 tower war)

tower attribute:
hit points(HP)
damage
armor
range
fire rate(1/cool-down)
area of effect(AoE) e.g., circle, line, single, etc.
armor-piercing
cost(positive)

enemy attribute:
all above.
speed
size
cost(negative)

不知為何沒力起來,就寫到這﹍。

2007-08-31

Timer(setInterval) && ENTER_FRAME(onEnterFrame)

在 ActionScript 中,要讓一個物體定期執行某些事情,大致上有兩種做法,
當然,就是標題上這兩種。前者是 time based, 後者是 frame based.
以往我都是使用 onEnterFrame, 以 frame based animation 來說,
這種做法非常直覺,不過他有兩個很大的缺點:

1. 很難算時間,要用 FPS 去算才行。至於真實時間?抓不到,要靠別的方式。
2. 如果有兩者以上的行為,該怎麼辦?如某物體同時往上也同時往右,全部寫在
同一個 function 中嗎?行為多怎麼辦?其中一個行為改變怎麼辦?設 flag?

第一個問題還是小問題,因為都選擇了 frame based 的方式,時間其實通常
不是那麼重要,差不多就可以了。第二個問題就真的是很嚴重的問題了,這在
碰到二維迴圈展開時會變得非常嚴重,寫起來不只是彆手彆腳,非常恐怖。

在 as2 中,要使用 frame based 的做法,最簡單的方式就是對 onEnterFrame
賦值。如果有 Loki(或 ludy? ccc)的話,靠著 chain 可能還算容易,
沒有的話就真的是很煩。但在 as3 中,一律統一使用 event dispatcher 的做法,
也就是說,其實註冊多個 ENTER_FRAME 事件就可以了。沒搞錯的話,其實
as2 應該也可以這樣做才對,只是在 as3 中統一了做法。

至於 Timer 和 setInterval 呢?setInterval 可能是從 java-script
繼承而來的,簡單地說就是定時會被喚起。優點當然是算時間非常容易,但是缺點
其實還滿多的。

1. thread-safety?
2. CPU 被拖慢時,時間變得非常不準,有關係嗎?

好像只有兩個問題,我也沒碰過 thread-safety 的問題,但是總覺得會有,
而這個有問題的話,就是天大的難題了。至於第二點,時間不準了,用 timer 有意義?

所以雖然 Timer/setInterval 應該是比 ENTER_FRAME 方便得多,
我覺得大部份的情況還是應該使用 ENTER_FRAME, 可以少掉很多可能的問題。
這在遊戲中尤其是如此,太多 critical 的問題需要考量。不過一些比較簡單的東西,
我想還是可以用 Timer/setInterval 去做,例如真正的 FPS 報告,用
ENTER_FRAME + getTimer 的方式計算產生,一些和 domain 無關,或是
可以「非常肯定絕對不會」delay 的狀況,例如運算極少也沒什麼圖形的 flash.
因為如果一 delay 了,還真不敢想像狀況會變多慘,再加上要用 flash 跑出
會 delay 的程式,高達八成啊 XD

當然小小的程式就都在例外就是了。

2007-08-30

ActionScript 3.0

其實我也忘記為什麼了,忽然就毅然而然決定 port 到 as3 上。
可能是因為看到 dcat 上說 flash player 9 佔有率已經非常高,
且就我自己的觀察也確實是如此吧?

所以儘管對 as3 沒什麼好感(好像只改 lib 嘛?),還是決定試試看。
不過我想最重要的一點是,as3 的錯誤訊息比 as2 多太多了,
有一次我有個 bug 怎麼樣都看不出來在哪,換成 as3 一 compile 就知道了。
既然如此,何不 give it a try?

事實證明,好在這隻程式我才剛開始寫,不然想從 as2 port 到 as3,
我看還是重寫比較快﹍﹍。雖然語言層面上並沒什麼修改,但是不只是 lib 大修,
整體設計的 framework 架構已經完全不同了嘛﹍﹍。

什麼?沒有 _root? 沒有 attachMovie? 沒有 createEmptyMovieClip?
沒有 XML#load? 沒有 removeMovieClip? 沒有 loadMovie? 天啊,
我不信這些功能會沒有,只是怎麼全部換個樣了??google 了半天,總算上了軌道,
感覺如何?有些東西變得太煩了,非常 java style, 而我是算很討厭 java 的,
這點讓我感到不太舒服。以前簡單的 XML#load 現在除了需要 XML 外,
又要 URLLoader, URLRequest, 甚至又有 XMLDocument, XMLList,
一堆 XML 開頭的東西,都搞不清楚要用什麼了。

不過撇開這些討厭的東西不談,as2 原本一些非常愚蠢的設計,總算都拿掉了。
同時這也表示,as3 沒那麼「簡單」了,對於所謂 designer, 門檻變得高很多,
因為他跟 java 真的是越來越像,連架構都很像了。早期我看過不少人的 flash code
別說 as2 了,恐怕還停留在 as1 吧?想叫他們換種寫法,卻發現有些東西解釋起來
還真的是有點困難,一路講下去就很想說你還是砍掉重練吧﹍﹍。

這些跳過不提了。總之最讓我高興的兩點,第一個是我終於不用再給愚蠢的 dummy name,
想這些用不到的名字實在是很煩,還要擔心產生的名字會不會重複,真的很想
Math.rand().toString() 下去,雖然我好像也還沒真的這樣幹過。

另一個就是我終於不用再寫更愚蠢的:parent.getNextHighestDepth() 了。
除了一直要打很煩外,名字又長,highest 我又老是打成 hightest 之類的。
也不用再去搞那個煩中之煩的 swap depth... 那確實是相當 chaotic.

還有 Delegate.create, 好像也不用了,但我不是很確定,只是文件上這樣寫。
也就是說,應該不會再有這種 dynamic scope 的問題了﹍吧?這就讓我想到
higher-order ruby 專欄上的一段敘述。在 perl 中,你必須多做一步才能讓
事情正確;在 ruby 中,你必須多做一步才能讓事情錯誤。這表示 perl 與 ruby
都很強大,大部份的事情都可以做到,只是預設的方式不同 :p

as3 我覺得似乎就沒有那麼強大了。我還是去找了 lib 來用,沒有 sprintf,
也沒有 hash map. 是有 Dictionary, 不過既然有人用 dictionary 去
做 hash map, 表示這個 dictionary 也有所不足吧?另外我記得這好像是
python 的命名習慣?

還有他的 package 限制好像比 java 還多,這也很煩。但整體說起來,
應該還是好處多些,因為壞處就只是煩而已,但好處是可以減少很多的混亂,
使得一些演算法上的設計可以不用那麼複雜。

btw, 我前幾天看到有人完全用 ecma-script 的方式寫 as2...
到處都是 prototype @@ 這作者大概跟 ecma-script 很熟吧?
要我這樣寫肯定會受不了的,雖然就可以做些比較有趣的 hack...
還是沒 ruby 那麼方便就是了。動態語言目前還是 ruby 最簡潔又強大。

靜態語言下次應該試 scala, 看看他有多 functional. 我覺得,
要玩 functional 似乎還是需要靜態語言,動態語言很多 function
特性會變得很難做又不直覺。

結果失敗了

早睡的計畫失敗了,真令人傷心。

...也只能沉默了。

2007-08-29

重要的

不是為了什麼而心情變糟,而是為什麼那麼容易變糟?
平靜不太下來。
不過我覺得最可怕的還是,想不到任何方法可以減緩,
曾幾何時,打打遊戲這種事也變得如此可怕。

我看還是早點睡好了。

似乎有點想變一言堂的感覺。

其實真的不用特別說狀況不好 XD

因為這個狀況已經持續太久太久,久到我真的不覺得有可能解除。
當然了,程度上還是會有差別,不過我也不覺得似乎有必要強調。

所以就是一片空白,許許多多片片段段的延續,一點一點的,
串成一大片。看過去好像是延續,其實都是片段。

2007-08-28

想收的 CD

有些實在很難買,不知道 neowing 有送到國外的嗎?
有人知道該怎麼做的話請通知我 ccc
幾乎願意高價收購了 O_o

Symphonic Suite AKIRA
芸能山城組が創り上げた劇場版「AKIRA」サウンドトラック・アルバム・リリース!!
映画音楽史上に名を残す名盤として語り継がれている超大作。
http://www.neowing.co.jp/detailview.html?KEY=VICL-23092

我覺得是滿有趣的風格,用 ER4S 聽起來聲音四面八方都有。

*

pf ピアノフォルテ 世界ノ全テ インストゥルメンタルアルバム
たまソフトの人気タイトル『世界ノ全テ』のインストゥルメンタルアルバムがついに登場。
サウンドを手がけるのは人気・実力とも兼ね備えたあの「Energy Field」。ゲームの
世界観を見事にアコースティックサウンドで再現しています。全曲の楽譜(ピアノ譜・
バイオリン譜)を収録したブックレット(全40 ページ)も付属する超豪華仕様。
http://blogger.godfat.org/2007/03/blog-post_06.html
(Amazon.co.jp 曾經東西沒寄給我,又多次 email 毫無下文,拒絕再接觸,
除非他還我錢或 CD...)

上文連結是那次對那片的心得。

*

CLANNAD/智代アフター Piano Arrange Album 「ピアノの森」
沒有連結……好難找,這片也滿不錯的。

*

志方あきこ - 廃墟と楽園 (歌鳴屋)
上次在 95 看到先被拿走﹍﹍(默)

*

Falcom ZWEI!! Super Arrange Version
這應該可以跟 Falcom 訂?上次跟 Falcom 訂過東西。

*

World of WarCraft Burning Crusade OST
我不想買遊戲﹍﹍。

暫時就這先六片﹍﹍。

2007-08-27

ie_hack:

出自 RDoc:

ie_hack: Internet Explorer is the worst piece of crap to have ever
been written, with the possible exception of Windows itself. Since
IE is unable to parse proper XML, we have to provide a hack to
generate XML that IE‘s limited abilities can handle. This hack
inserts a space before the /> on empty tags. Defaults to false.

當使用者可能不會有太多感覺,有在寫程式就會處處發現:ie sucks...
除了自己老是碰到 ie problem 外,像上面那樣的話也真的是看多了,
前幾天才有:This is, of course, a lie.
We know IE7 can’t handle XHTML.

我的 flash 裡面也有好幾個:for_suck_ie 的參數...。還有 script 不能
寫成一行,寫成一行 ie 就會什麼屁都放不出來,整個網頁變成一片空白。
那明明就是 xhtml 標準...。我猜 ie 本身的 html parser 根本就亂七八糟,
才會搞得 ie7 沒辦法修。搞不好是裡面做太多鬼容錯造成的?容錯太高有時候真的
是壞事啊。

2007-08-26

IE 6/7 回來了 XD

做了相當大量的修改與觀察後,IE 6/7 又重新回來了。
好吧,其實我只有測 IE 7, 因為灌完 IE 7 我的 IE 6
就不知道跑到哪裡去了﹍。

anyway, 我灌了這個 plugin: RESTful XHTML
理所當然地,我完全不知道 restful 是什麼意思 XDD
總之這篇看完之後,我才知道原來是我自己誤會前面的那個 plugin,
他做的沒有錯,只是正好 firefox prefer xml over html,
所以才會產生送回 xml 的狀況。這也是我翻了翻 beast src 才發現的,
他很多 action 都有支援回傳 xml 的狀態,有些還有 js 的!

然後我才知道,原來 client 還可以送出他 prefer 什麼東西,
接著 server 再根據這清單送出資料,才會有按下 edit 用 ajax call,
會原地展開,而直接去 get 會得到一個全新的頁面。
剛看到我真的很納悶,他該不會自己去 parse 掉中間的內容吧?
原來是還可以有這麼巧妙的方式,同個 get 回傳不同東西。

不過要把這個考量進來的話,每個 browser 就很明顯都不一樣了﹍。
firefox prefer xhtml, opera 吃 xhtml,
safari 吃一半,有些顯示不正常。ie 則是完全不吃.
然後 w3c 的 validator 又不一樣了,他吃 xhtml,
但是他 prefer 不吃 = =b 這真的是很莫名其妙﹍﹍。

很混亂,所以我只講結果好了。最理想的狀況就是用 restful_xhtml 的
want_xhtml? 去判斷,true 則丟 xhtml(xhtml 1.1), false 則丟
html(xhtml 1.0). 可是這種情況就會變成,只有 firefox 吃到 xhtml,
因為只有 firefox(include all gecko based) 會 prefer xhtml...
可是事實上,opera 是吃 xhtml 的,那為什麼不給他?

於是我改了一下,用 google 來的這段程式碼:
@request.accepts.include?( Mime::Type.parse('application/xhtml+xml') )
然後加到 ApplicationController 裡面,取作 accept_xhtml?
這樣的話,opera 就可以吃到 xhtml 了!可喜可賀可喜可賀。

不過 w3c 的 validator 還是不吃﹍﹍。他還是堅持使用 html XD
除非我強迫他使用 xhtml, 否則他一定使用 html, 這實在是很討厭,
畢竟如果我強迫使用 xhtml, 那 safari 就會有一點點不正常,
而 ie 則會完全死掉 XDDD 如果能簡單做點 workaround 就能讓 ie
也能使用的話,其實也沒什麼不好,雖然我討厭他,他跨平台更重要 XD

所以我後來決定,把 DOCTYPE 寫死好了,這樣 validator 才能 validate
xhtml, 雖然會噴 warning, 可是我真的覺得那是他自己不吃的問題,
人家 firefox 和 opera 都好好的﹍﹍。

於是 DOCTYPE 寫死了,firefox 和 opera 可以正確使用 xhtml,
但 safari 和 ie 則是使用有點假的 xhtml XD 至於 validator 那怪狀況,
實在不知道該說他什麼,似乎比較像 bug...

RESTful XHTML 還算不錯,滿方便的,至少 mime-type 的部份處理都正確,
還能輔助產生一些 tag, 比之前那個 plugin 是來得好。不過 restful
究竟是什麼意思啊? XD 是指可以有多種輸出嗎?

所以我最後的 hack 就是把:format.html &block 改成:
xhtml_or_html format, &block
這個 method 寫在 ApplicationController 裡面,
實做則是:accept_xhtml? ? format.xhtml(&block) : format.html(&block)

所有的修改都是遠端操作,所以我用 vim, 天啊,真的很不習慣,
一直出現 500 error 然後調查結果發現是 typo...
而且使用 vim 會讓手一直放在鍵盤上,害我覺得關節有點不舒服。

另外,我後來才知道 port 的 variant 要這樣用,於是我的 vim 和 nano
也終於支援 utf-8 了。
sudo port install vim +big +huge +multibyte +ruby
big huge 不知道是什麼,亂加的 XD 我之前一直試:+multi_byte
+multi-byte 結果都錯,沒想到是全部黏在一起﹍。
sudo port install nano +color +mouse +utf8 +wrap

大概就是這樣了。至於目錄那個首頁嘛,他是靜態檔案耶,要不要為 ie
特別調整我再考慮看看,如果有簡單的方法就可以做,麻煩或是太暴力就算了。

bq. It’s basically saying, “Just give me whatever you’ve got,
I can handle it, no problem!”. This is, of course, a lie.
We know IE7 can’t handle XHTML.



All texts are licensed under CC Attribution 3.0