2003/12/26

聖誔遊戲

這次macromedia網站上的site of the Day是遊戲。
大家看看吧
Merry Christmas Games
我覺得做得不錯,shockwave game

2003/12/12

碰撞反應

同樣是FLASH MX Game Design Demystified這本書的筆記,今天終於搞定第六章 碰撞反應,這裏牽扯到一些物理知識,有興趣的同好可以參考看看,並歡迎共同討論。

Chapter 6. Collision Reactions
.所有範例檔下載
*這裏分的節次,並不是書中的節次。只是方便我自己整理書中重點及個人心得而分的。(所以說是筆記嘛)

第一節 點跟矩形
範例檔:collisionReaction_1.fla

這節算是我自己加的,書中並沒有此節
為了循序漸進,所以我先用上一章第八節來改。在ch5筆記的第八節中,其碰撞偵測非常簡單
//以比大小方式,判斷點是否在矩形裏
if (x>x1 and x< x2 and y>y1 and y< y2 ) {
trace("碰到了!!");
}

而我們要做碰撞反應的話,最簡單的方式就是:
當 點碰到上邊界時 --> y位移量 乘以 -1 (就是往反方向彈的意思)
當 點碰到下邊界時 --> y位移量 乘以 -1
當 點碰到左邊界時 --> x位移量 乘以 -1
當 點碰到右邊界時 --> x位移量 乘以 -1
所以上述的函式我們必需拆開變四部份才行:
if (x < x1 ) {
point.xmov *= -1;
point.tempx = x1;
}
if (x>x2) {
point.xmov *= -1;
point.tempx = x2;
}
//碰到上下邊界
if (y < y1 ) {
point.ymov *= -1;
point.tempy = y1;
}
if (y>y2) {
point.ymov *= -1;
point.tempy = y2;
}

原則大概就這樣吧


第二節 pong試做
範例檔:collisionReaction_2.fla

pong是一套經典且古老的電玩(關於它的歷史可能要另外寫一篇),應該很多人看過,如下圖

左右各一個上下移動的板子,碰到球就反彈,利用之前學過的技巧,這種遊戲是能夠很簡單地做出來的。
這部份我是以延用上一節的檔案來改的,跟原書中的寫法不太一樣,不過原理大致相同。

1.球跟周圍場景的互動跟上一節一樣,只是當碰到左邊界時,右方得一分,碰到右邊界時,左方得一分,並讓球回到場地中央重新開始。
2.球跟板子的互動,其實跟場景的互動原理類似,只是場景是把球框在裏面,而板子是把球彈在外面,因此將碰撞偵測的寫法修改一下:當發現球跟板子重疊時,就是碰到了。且碰到後,馬上將球的x位移量* -1。
3.玩家是操縱左邊板子,左板主要是跟隨滑鼠的y位置而定,另外加上"別讓板子超出場景"的預防措施
4.右板是代表電腦,電腦就直接跟隨球的y值,以範例中的ai設定,電腦幾乎是不會輸球的。不過沒差,這章不是要講ai,所以不用計較太多。

第三節 自由落體小球collisionReaction_3.fla

這節只是要做一個自由落體小球,落到地面上,又彈起,又落下,且速度一直衰減到靜止狀態
其實這個範例在前幾章就提過了(如果你也有看這本書的話就知)
不過這裏再複習一下而已。
我想這個練習的重點在於,位移量(速度)的動態變化吧

先做好球跟地板,再寫好球跟地板的碰撞,因為只有y值的變化,所以很簡單。
之後只要在ymov時,隨著時間累加一個g值(重力),
並在碰到地時,多乘一個衰減值。(否則球彈起高度跟落下高度太相近,感覺像在太空中)
如此而已。

由於這個範例在前面的章節就教過了,所以我就直接自己寫了,因此會跟書中內容不太一樣,不過原理是相同的。


第四節 球與線的碰撞反應
範例檔:collisionReaction_4.fla

前幾節討論的,都是水平、垂直的線條,我們只要比比xy值的大小就行了,但並不能應用於斜線上,這節的重點就是這個。
如果我的理解沒錯,我想原則在於:
先把球的前進向量拆解成兩個相互垂直的向量,其中一個向量與碰撞目標線平行,另一條則與它垂直。當發生碰撞後,垂直那條將會反轉。
圖解會是這樣吧

上圖是當球與線發生碰撞的瞬間,綠色線的方向及長度,代表球的前進向量。

上圖是表示,我們可以將綠色那條向量拆解成藍色那兩條相互垂直的向量,並注意一點,其中一條與碰撞目標線(粗黑)是平行的。

上圖,當發生碰撞後,與目標線垂直的那條向量會變反相,而平行的不變。反應後,可組成一條新的向量,即是球碰撞後的反射軌跡。

所以這部份的解題步驟應該是:
球的前進向量-->拆成與目標線平行、垂直兩部份-->將垂直那條反向-->組成新的前進向量
但是由於我們目前在as中,位移的方式是以xmov、ymov這種方式,而不是直接用向量的方式,所以這部份就變得更麻煩些:
球原本的xy位移量-->各別拆成與目標線平行、垂直兩部份-->將垂直那部份反向-->組成新的x y位移量
//函式:反應
function ballLineReaction(tempLine, point, x, y) {
//起始設定
var lineDecay = tempLine.lineDecay;
var alpha = tempLine.radian;
var cosAlpha = Math.cos(alpha);
var sinAlpha = Math.sin(alpha);
//取得球的x向量及y向量
var vyi = point.ymov;
var vxi = point.xmov;
//轉換為與目標線垂直之向量
var vVp = vyi*cosAlpha-vxi*sinAlpha;
//轉換為與目標線平行之向量
var vHp = vxi*cosAlpha+vyi*sinAlpha;
//反轉垂直向量
var vVfp = -vVp*lineDecay;
var vHfp = vHp;
//將之轉換回xy位移量
var vVf = vVfp*cosAlpha+vHfp*sinAlpha;
var vHf = vHfp*cosAlpha-vVfp*sinAlpha;
//將結果傳回給point
point.xmov = vHf;
point.ymov = vVf;
point.tempx = point.x+point.xmov;
point.tempy = point.y+point.ymov;
}

*這部份的as code,原書中的變數名稱與我的並不相同,原因是原書中都是用x y來取名,但我在看的時候卻常跟x y位移量搞混,所以都改成v(垂直)跟h(水平)


第五節 Conservation of Momentum and Energy(應該是動量及動能守恆吧?)
*這部份的概念還要多參考一些物理書才行…先挑範例來練習吧
*我的物理知識有限,如有錯,請務必告知

列出會用到的公式
p = mass*v; //動量公式
kinetic energy = (?)*mass*speed*speed //動能公式

假如做兩物體的碰撞
p1i = m1*v1i ; //物體1動量,碰撞前(i代表碰撞前)
p2i = m2*v2i //物體2
Pi = p1i+p2i //碰前動量總和

ke1i = (1/2)*m1*v1i*v1i //物體1碰撞前動能
ke2i = (1/2)*m2*v2i*v2i //物體2
KEi = ke1i+ke2i //碰撞前動能總和

////以下為碰撞後(f代表碰撞後)
p1f = m1*v1f
p2f = m2*v2f
Pf = p1f+p2f

ke1f = (1/2)*m1*v1f*v1f
ke2f = (1/2)*m2*v2f*v2f
KEf = ke1f+ke2f

///由於動量動能守恆
Pi = Pf = P
m1*v1i+m2*v2i = m1*v1f+m2*v2f
KEi = Kef
(1/2)*m1*v1i*v1i+(1/2)*m2*v2i*v2i = (1/2)*m1*v1f*v1f+(1/2)*m2*v2f*v2f

///整理後可導出
//**這個整理過程需要用到 (A*A-B*B)=(A-B)*(A+B)
v1i-v2i = v2f-v1f
V = v1i-v2i

//所以

v1f = v2f-V

//而我們最後需要的是

v2f = (P+V*m1)/(m1+m2)
v1f = v2f-v1i+v2i


(天啊,自己都快不知道自己在寫啥了,還是快找範例來練吧)


第六節 兩方塊的水平碰撞反應
範例檔:collisionReaction_5.fla

如果不計較物理理論的話,就直接引用上面的公式,放到as code中使用吧
在碰撞上,直接引用上一章的筆記中的矩形碰撞,而在偵測到碰撞後,呼叫這個函式就行了
//函式:碰撞反應
function reaction(a, b) {
var m1 = a.mass;
var m2 = b.mass;
var v1i = a.xmov;
var v2i = b.xmov;
var V = v1i-v2i;
var P = m1*v1i+m2*v2i;
//求碰撞後,物體b之速度
var v2f = (P+m1*V)/(m1+m2);
//求碰撞後,物體a之速度
var v1f = v2f-v1i+v2i;
//將答案傳回給各obj
a.xmov = v1f;
b.xmov = v2f;
//更新各obj之temp位移值
a.tempx = a.x+a.xmov;
b.tempx = b.x+b.xmov;
}

只看程式的話,好像滿簡單的。但背後的理論,還是不懂
(問了一些朋友,發現還會扯出一些"功"、"力"之類的,愈聽愈模糊-_-")


第七節 多個方塊的水平碰撞反應
範例檔:collisionReaction_6.fla

承接前一節範例,做成四個方塊的碰撞,並將四個方塊的質量設成不同的,可得到不同的碰撞反應速度
基本上,上一節的會寫的話,這節就沒什麼問題了,只是為了方便撰寫,用了一些回圈。
這個範例跟書中所附的不太一樣,因為我照書裏的寫(看懂別人寫的,比自己寫,來得更花時間)
不過原書的範例只花了七十多行,我倒寫了100行整-_-"。有書的人可對照參考看看…

第八節 球-球的碰撞反應
範例檔:collisionReaction_7.fla

用簡單點的方式來做筆記好了
1.球的碰撞偵測引用之前做的"不受限制的球球碰撞偵測"
2.碰撞反應則用類似之前做的"球與線的碰撞反應",將球與球的碰撞面當成之前的碰撞線,就差不多了:
將前進向量轉換為與碰撞面平行及垂直兩種。
將兩球的垂直的向量,以之前的一維碰撞的方式去解。平行的先不管。
垂直的算出結果後,再回來跟平行的結合並轉換回新的 x y 向量。


第九節 重力模擬
範例檔:collisionReaction_8.fla

照理說,碰撞反應教到這裏就差不多了,但書中最後還加了一個重力模擬的練習,拿來練練也不錯

我再次以自己的方法改寫,直接引用上一節的檔案,加了兩個東西
*因為要加很多球,所以先把大部份函式改以迴圈來跑
1.加上球跟四周的碰撞,這部份很簡單,當發現球超出場景時,反轉他碰到牆的那個向量
2.加上引力公式(又開始物理課了)
萬有引力公式: F=G*m1*m2/(d平方) F:引力,G:萬有引力常數,m1m2:兩物各別質量,d:兩物體距離
加速度公式:F=m*a ,所以 a1=F/m1 a2=F/m2 a:加速度
所以引力的函式會變這樣
//引力
function gravitation() {
for (var i = 1; i< =game.numBalls; i++) {
for (var j = i+1; j<=game.numBalls; j++) {
var ballA = eval("game.ball"+i);
var ballB = eval("game.ball"+j);
var dx = ballA.xpos-ballB.xpos;
var dy = ballA.ypos-ballB.ypos;
var d = dx*dx+dy*dy;
var F = G*ballA.mass*ballB.mass/d;
ballA.amov = F/ballA.mass;
ballB.amov = F/ballB.mass;
var angle = Math.atan2(dy, dx);
var sinAng = Math.sin(angle);
var cosAng = Math.cos(angle);
ballA.xmov -= ballA.amov*cosAng;
ballA.ymov -= ballA.amov*sinAng;
ballB.xmov += ballB.amov*cosAng;
ballB.ymov += ballB.amov*sinAng;
}
}
}

另一點特別要注意的是,由於這個範例又有引力又有碰撞等等因素,所以要特別注意資料更新的順序,否則會出現球跟球疊在一起,或是球卡在牆壁等靈異現象

後來回去看書中範例,發現它反而是用較簡便的寫法,就是沒有用 "不受frame限制"的那種…(被騙了)

另一個未解決的疑點,就是我寫的這個範例,必需以player6 做publish才能正常,若以player7做publish會在球碰到球後當住,語法都檢查過了,但還是不知原因…希望有人能給予指點…

讀後心得
這裏算是我個人的心得,與各位同好分享之
看到這邊總算看完這兩章了,我想這裏教的碰撞偵測及反應已可應付許多需要碰撞功能的遊戲了。
不過理論歸理論,真的用起來的實用性如何,倒還沒試過,(我指真的用在要開發的遊戲上)
例如一些動作遊戲在執行時,不會是只有一、兩個或三、四個物件要測碰撞的,可能是數十個或以上。
那麼跑起來的速率如何呢?跟最簡單的hitTest比呢?
我希望在下一個遊戲作品中確實用進去看看。
下個章節是要教tile-based的遊戲製作,很想繼續看下去,但最近要趕論文,只好暫時作罷 (-_-")

*關於物理方面的知識,個人推薦兩本書:

針對開發電玩程式會用到的物理知識做講解,天瓏有賣,600多。

.一生受用的公式
應該可以當方便的小手冊,天下網站賣144。

2003/12/8

FLASH的碰撞偵測

最近讀完FLASH MX Game Design Demystified這本書的Chapter 5. Collision Detection,這章節主要是介紹一些hitTest()所做不到,或有限制的碰撞。以下是我的筆記,有興趣的朋友可以參考看看。
.所有範例檔下載

前言
經常使用hitTest()的人應該都知道,hitTest有著一些限制,例如矩形範圍限制,即使hitTest(x,y,true)也只是解決一半的問題;還有frame by frame的限制,例如當位移量大於被偵測物時,那碰撞事件就會被忽略了。
總之這個章節是讓我們練習不用hitTest,自己手工打造碰撞偵測的方法。

第一節 點對圓的碰撞
範例檔:collision.fla

點對圓的碰撞是相當簡單的,因為你只要知道點跟圓的距離,及圓本身的半徑就能測到兩者是否碰撞了。
只要 點跟圓的距離 小於 圓的半徑 那麼就表示有碰到,反之則否。
這個範例中,如上圖的描述,我們放了兩個點,一個在圓內,一個在圓外,各別計算他們離圓心的距離,再跟圓的半徑比大小,就能知道是否碰撞了。

//碰撞函式
function collision(pointMc, cycleMc) {
var dx = cycleMc.x-pointMc.x;
var dy = cycleMc.y-pointMc.y;
var distance = Math.sqrt(dx*dx+dy*dy);
trace(pointMc.name+"離圓心的距離為:"+distance);
if (distance>cyc.radius) {
trace(pointMc.name+"沒碰到圓。");
} else {
trace(pointMc.name+"碰到圓了!");
}
}

第二節 圓對圓的碰撞
範例檔:collision2.fla

這節除了判斷碰撞外,還加上了圓的運動狀態。
圓跟圓的碰撞原理也是相當容易的。
同樣先取得兩圓心間的距離,再來只要比對兩圓半徑的和。
當 兩圓心間距離 小於 兩圓半徑的和 則表示有碰到。

//碰撞函式
function collision(obj1, obj2) {
var dx = obj1.x-obj2.x;
var dy = obj1.y-obj2.y;
var distance = Math.sqrt(dx*dx+dy*dy);
if (distance>(obj1.radius+obj2.radius)) {
trace("沒事");
//cFlag = false;
} else {
trace("啊!!!!!!!!!!!撞到了!");
//cFlag = true;
}
}

第三節 圓對圓-不受frame限制
範例檔:collision3.fla

我所謂的frame限制,是指在flash中的移動,是一個個frame來動的,例如你設的位移量可能是10,那麼在flash中,就是一次10px地跳躍式前進。但真實世界中可不是這樣的,真實世界中的移動是連續性的,而不是一秒跳多少公分這樣算的。但這種限制是無可避免的,因為flash就是這樣一套建立於frame基礎上的軟體。我們只能儘量地擺脫並模擬真實世界,但其最根源還是frame by frame的。

前兩節都有受限於這樣的frame限制,下面這個範例就是要來嘗試擺脫它了
它大概的原理是,在畫面上的圓要移到下一個位置時,事先算好是否會碰撞
也因此程式會比上述的麻煩些。它把時間因素加進去算,然後用一元二次方程式的公式去解。

//預先測碰撞
function collision(obj1, obj2) {
//設解答變數,若無解則為1
collisionTime = 1;
//設定位移變數
var xmov1 = obj1.xmov;
var ymov1 = obj1.ymov;
var xmov2 = obj2.xmov;
var ymov2 = obj2.ymov;
//設舊的位置變數
var xold1 = obj1.xpos;
var yold1 = obj1.ypos;
var xold2 = obj2.xpos;
var yold2 = obj2.ypos;
//定義公式所需之各小變數
var R = obj1.r+obj2.r;
var a = -2*xmov1*xmov2+xmov1*xmov1+xmov2*xmov2;
var b =-2*xold1*xmov2-2*xold2*xmov1+2*xold1*xmov1+2*xold2*xmov2;
var c =-2*xold1*xold2+xold1*xold1+xold2*xold2;
var d =-2*ymov1*ymov2+ymov1*ymov1+ymov2*ymov2;
var e =-2*yold1*ymov2-2*yold2*ymov1+2*yold1*ymov1+2*yold2*ymov2;
var f =-2*yold1*yold2+yold1*yold1+yold2*yold2;
var g = a+d;
var h = b+e;
var k = c+f-R*R;
//計算公式
var sqRoot = Math.sqrt(h*h-4*g*k);
var t1 = (-h+sqRoot)/(2*g);
var t2 = (-h-sqRoot)/(2*g);
//若第一個根小於1且大於0
if (t1>0 && t1< =1) {
collisionTime = t1;
cycleCollided = true;
}
//若第二根小於1且大於0
if (t2>0 && t2< =1) {
//且第二根小於第一根或是無第一根,則以第二根為解
if (collisionTime == null || t2<=t1) {
collisionTime = t2;
cycleCollided = true;
}
}
if (cycleCollided) {
//發出碰撞訊號
trace("碰到了!!");
}
}
二元二次就是像: aX平方+bX+c=0這種的 而解法是: 2a分之 -b 加減 根號 b平方-4ac (因為不會打數學符號,其實看圖比較清楚) 前面AS碼中,t1及t2代表兩個根 若這個根大於0且小於1的話,就代表他們有碰到了。 若兩個根都符合條件,那就取小的為答案。 照書中的範例弄出來的結果會像下圖 但我個人認為有個小缺失,就是它雖然脫離了frame的限制,抓到了碰撞訊號,但畫面中的球仍是疊在一起。也就是雖然抓到了訊號,也抓到了正確的碰撞時間,但最後沒有畫出正確的碰撞位置。 因此我加了小小的改進。把算出的碰撞時間,乘以其位移量,畫出正確的碰撞位置。 結果變成下圖 我想該書作者不是不知道啦… 也許是有別的考量,因此沒有在這?討論這個問題。 第四節 線與斜率 範例檔:collision4_drawLine.fla 這一節也是相當簡單,就是從已知的y軸截點b,及斜率m,畫出一條線。 斜率的公式我想大概是高中的吧 (沒讀過高中…這部份如果講錯,請指正) 斜率公式:斜率(m)=直邊(y)/橫邊(x) 斜率公式2:y=m*x+b (b為線與y軸之交界點y值) 然後用
_root.createEmptyMovieClip("clip", 1);
clip.lineStyle(0, 0x000000, 100);
line1 = {};
line1.m = 1;
line1.b = 100;
function findY(line, x) {
var y = line.m*x+line.b;
return y;
}
function drawLine(line) {
//決定一個 x
var x = 200;
//求得y
var y = findY(line, x);
//線的起點
clip.moveTo(x, y);
//決定另一個x
var x = 100;
//求另一個y
var y = findY(line, x);
//畫出線
clip.lineTo(x, y);
}
drawLine(line1);
可畫出來 相當容易的一個練習 第五節 線與線的交叉 範例檔:collision5_drawLine2.fla 當兩條的斜率不同,則此兩線將會交叉 這一節就是要做這個練習,先在場景中畫出兩斜率不同的線, 並求出其交叉點的位置 畫線的部份就如同上一節 求交叉點的部份原理如下 已知:y=m1*x+b1 y=m2*x+b2 所以:m1*x+b1=m2*x+b2 m1*x-m2*x=b2-b1 x=(b2-b1)/(m1-m2) 改寫成as code就是:
function findIntersection(line_a, line_b) {
var x = (line_b.b-line_a.b)/(line_a.m-line_b.m);
var y = line_a.m*x+line_a.b;
dot._x = x;
dot._y = y;
}
第六節 判斷碰撞是否發生 範例檔:collision6_drawLine3.fla 這一節仍是上一節的延伸, 上一次知道當斜率不同時,此兩線將會交叉,但不能得知這個交叉是否發生了。 一切也是延用上一節的做法,只是最後再判斷一下交叉點有沒有在線上。 而這個判斷法也只是用x、y值比比大小而已,所以不會太複雜。 所謂 兩線將會交叉,但目前未發生,就像 而目前已交叉會像 這樣應該很清楚了 重點如下
//判斷目前是否發生交叉
function collision(lineA, lineB) {
if ((dot._x>=lineA.x1 and dot._x< =lineA.x2) ||
(dot._x<=lineA.x1 and dot._x>=lineA.x2) || 
(dot._y>=lineA.y1 and dot._y< =lineA.y2) ||
(dot._y<=lineA.y1 and dot._y>=lineA.y2)) {
lineA.collision = true;
}
if ((dot._x>=lineB.x1 and dot._x< =lineB.x2) ||
(dot._x<=lineB.x1 and dot._x>=lineB.x2) ||
(dot._y>=lineB.y1 and dot._y< =lineB.y2) ||
(dot._y<=lineB.y1 and dot._y>=lineB.y2)) {
lineB.collision = true;
}
if (lineA.collision and lineB.collision) {
trace("目前發生碰撞了!!!!");
} else {
trace("目前沒事。");
}
}
第七節 球與線的碰撞 範例檔:collision7_cycleLine.fla 這節的主旨是偵測移動中的球與線之間的碰撞,書中提出四個步驟: step1.找出球的運動路徑與線的交叉點 step2.運用三角函數,找出球碰到線時的位置 step3.同上,找出球跟線碰到的接觸點 step4.計算從目前位置到碰觸位置所需的frame數(時間),若大於0小於等於1,則表示碰撞發生。 配合下圖解釋: 重點如下:
function getFrames(tempLine, point) {
//========Step 1============
//球路徑斜率
var slope2 = point.ymov/point.xmov;
//預防斜率無限大(垂直線)或無限小(水平線)狀況
if (slope2 == Number.POSITIVE_INFINITY) {
var slope2 = 1000000;
} else if (slope2 == Number.NEGATIVE_INFINITY) {
var slope2 = -1000000;
}
//球路徑的y軸截點b2
var b2 = point.y-slope2*point.x;
//求出球路徑與線的交叉點
var x = (b2-tempLine.b)/(tempLine.slope-slope2);
var y = tempLine.slope*x+tempLine.b;
//===========Step 2===============
//球路徑的角度
var theta = Math.atan2(point.ymov, point.xmov);
//球路徑與線之夾角
var gamma = theta-tempLine.angle;
//碰觸時,"球圓心"與"球路徑及線交叉點"之距離
var sinGamma = Math.sin(gamma);
var r = point.radius/sinGamma;
//求出碰觸時圓心座標 x, y
var x = x-r*Math.cos(theta);
var y = y-r*Math.sin(theta);
//==================Step 4================
//求出碰觸所需之frame數
var dis =Math.sqrt((x-point.x)*(x-point.x)+(y-point.y)*(y-point.y));
var vel =Math.sqrt(point.xmov*point.xmov+point.ymov*point.ymov);
var frames = dis/vel;
//======================Step 3=================
//找出碰觸點
//求tempLine.slope的垂直線=slope2a
var slope2a = -1/tempLine.slope;
var b2a = y-slope2a*x;
//碰觸點座標xa,ya
var xa = (tempLine.b-b2a)/(slope2a-tempLine.slope);
var ya = slope2a*xa+b2a;
//檢查碰觸點是否在線段上
if ((xa>tempLine.x1 && xa< templine .x2) ||(xa< tempLine.x1 && xa>tempLine.x2) ||((ya>tempLine.y1 && ya<templine .y2) ||(ya<tempLine.y1 && ya>tempLine.y2))) {
//是
} else {
//否
//讓frame數到1000
var frames = 1000;
}
return frames;
}
function getTempPositions() {
ball.tempx = ball.x+ball.xmov;
ball.tempy = ball.y+ball.ymov;
}
function bankCollisionDetect() {
for (var i = 0; i< linearray .length; ++i) {
var frame = getFrames(lineArray[i], ball);
if (frame<=1 && frame>0) {
//碰到了
trace("撞到了!!");
}
}
}
Step1就像之前介紹過的求兩線交叉點的方法。 Step2之所以會寫成這樣,可能就要看一下圖了
var theta = Math.atan2(point.ymov, point.xmov); //先求得theta角
var gamma = theta-tempLine.angle; //進而求得gamma角
var sinGamma = Math.sin(gamma);
var r = point.radius/sinGamma; //利用gamma角及圓半徑,取得r之長度
var x = x-r*Math.cos(theta); 
//利用r之長度,及之前找到的球路徑與線交叉點座標,來取得球碰撞時的圓心座標
var y = y-r*Math.sin(theta);
Step4 很簡單,只要知道目前離碰撞點的距離,除以每frame位移距離,就能得知目前到碰撞所需的frame數 Step3 要先知道,球跟線碰撞時,碰撞點跟圓心連成的那條半徑,必定是跟碰撞線形成垂直關係的。 所以我們把那條半徑算出來,再用之前介紹的線與線碰撞偵測,就能方便算出碰撞點的座標了。 最後再檢查這個點有沒有在碰撞線上,就大功告成了。 第八節 點跟矩形的碰撞偵測 範例檔:collision8_pointRectangle.fla 這節比上述幾節簡單許多,只用單純的比較x y大小而已 重點函式如下:
function pointRectangleDetection(point, rectangle) {
//點的位置
var x = point.x;
var y = point.y;
//矩形的左右邊界
var x1 = rectangle.x;
var x2 = x1+rectangle.width;
//上下邊界
var y1 = rectangle.y;
var y2 = y1+rectangle.height;
//以比大小方式,判斷點是否在矩形?
if (x>x1 && x< x2 && y>y1 && y< y2) {
trace("碰到了!!");
}
}
有一點值得討論一下 書中範例在最後執行的部份是這樣
EnterFrame = function() {
getTempPositions();
pointRectangleDetection(point1, rectangle1);
render();
};
所以當第一次發出碰撞訊號時,黑點其實已經畫到碰撞的下一格位置了。 要修正這點,我想可能要在render()之前做個判斷,或是乾脆把碰撞偵測跟render寫成一個function吧 不過這只是個範例,所以也不是那麼重要吧… 第九節 矩形跟矩形的碰撞偵測 範例檔:collision9_2rectangle.fla 矩形之所以簡單,是因為都是直角,也就是能夠直接用x y 值比一比就行了 (去年做的橫向捲軸demo,就是用這種方式) 這節也是用類似上一節的方式。比較兩矩形邊界的X Y值,來判斷是否碰撞。 後續討論 此章節主要內容大概就到這邊了,後面加了一些討論,順便記在這裏: 關於多邊形的碰撞呢?例如一個八角形跟一個球的碰撞該如何做? 用上述討論的球與線的碰撞,做八次就可以了 同理我們也可以做六角形、五角形、星形等複雜圖形的碰撞。 ch5總算k完了,接著ch6才是碰撞反應,趁這幾天有點空,一次把這兩章k完才算完整。

日本NBK株式會社社歌



這原本只是一家折屋公司的社歌,也許是太熱血了,於是便開始有人幫他畫人物設定op分鏡等等,最後還將它做成flash動畫,之後甚至還有英文版,更可怕的是還有"逆再生"版

滿搞笑的。

2003/12/1

3D FLASH WORLD競賽


由ElectricRain及thomasglyn合辦。

ElectricRain就是出swift3d及optimaze那家軟體公司。
thomasglyn(不知是一個人還是一個團體),專門製作具互動性的3d flash作品(用as去模擬)。

此比賽的目的,便是要結合上述兩單位的優點,希望參賽者能用render好的美美圖,加上flash的as程式去做控制,製作具互動性的3D FLASH作品。

Flash 3D Cheats Most Wanted

有興趣可以看看。
書本介紹範例觀看原始檔下載

感謝阿超介紹

Sound.ID3測試

所謂id3,各位聽過mp3的人都知,id3是儲存歌曲相關資訊的標籤格式,以winamp為例,在歌單上點選歌名,按右鍵選"檔案資訊",就可看到此歌的id3資訊。
在flash中也可調用id3資訊,透過下列方式:


就可得到歌名

*注意:中文不支援,即使用了System.useCodepage = true;也一樣。
*04/11/30追加:亂碼問題解決方案by云開

上面songname是一種屬性,其所有屬性如下

comment:註解
album:專輯
genre:類型
songname:歌名
artist:歌手
track:曲目
year:年份

以上是一個簡單的介紹,但若深入去研究它的help,會發現很多限制跟問題…
在Reading ID3 tags in MP3 files章節中提到:
Flash Player 7 supports version 1.0, 1.1, 2.3, and 2.4 tags; version 2.2 tags are not supported.

而取得id3資訊的指令也分兩種:大寫跟小寫,
例如:
my_sound.id3.comment

my_sound.ID3.COMM

其差別在於
小寫用於id3 version 1.0, 1.1 ,flash player6.0 r40後可用
大寫用於version 2.3 及2.4,flash player7後可用
小寫可用屬性如上述七種
大寫可用屬性有40種(真多啊~~)

所以請注意你的mp3的id3版本為何,有些是不支援的,像我的winamp是2.80中文版的,其ID3面板打開會分左右兩半,左半上面寫id3v1右半是id3v2,但測試結果,我用小寫的指令,卻抓到右半的id3v2,若我用大寫的指令,則抓不到東西。真是非常之奇怪

第二點很奇怪的
在help檔中,Sound.onID3單元中提到:
Description
Event handler; invoked each time new ID3 data is available for an MP3 file that you load using Sound.attachSound() or Sound.loadSound().
我想大概是說,這個onID3可用在以loadSound或attachSound載進的mp3檔案上,
但實驗結果是,只有loadSound的檔案叫得到id3,attachSound無效。

以上是我遇到的一些問題,如有人找出原因,麻煩指點一下。

2003/11/24

X3D常見問題集

今天不小心逛到,但看不習慣簡體字,所以順手轉成繁體版,有需要的人可以看看。

X3D常見問題集- X3D (Extensible 3D) FAQ:
英文版簡體中文版繁體中文版

補充一個
VRML虛擬實境線上教學by中央資管系吳振宇
http://www.ncu.edu.tw/~center21/vrml/vrml.html

古老的大鐘-陶笛演奏版-Flash MV



最近為風潮唱片製作了一部Flash動畫短片。與他們合作的過程相當愉快,因為他們沒有給予太多限制,一切自由發揮。
這次主要負責腳本及動畫製作。
腳本上第一次嘗試感人的題裁。
動畫上嘗試點陣圖與向量圖混合運用。

作品年份:2003年11月
使用軟體:Painter8/FlashMX2004
片長:217.6秒
尺寸:550*400px
檔案size:3.2MB
風潮下載

2003/11/22

123Flash Chat


123Flash Chat是一套Java基礎,flash介面的聊天室系統。功能算滿齊全的,還有多國語言介面可選(含中文),預設介面長得很像msn6^^
據?面的人透露,製作小組共5人。

目前提供線上demo、試用下載等,有興趣的人可去瞧瞧
123Flash Chat官網

2003 Max Awards announced


2003 Max Awards於11/20公佈得獎名單了。

詳細名單在此

共分八大類,除了各類一名得獎者外,還有一名People's Choice獎項。
每個參賽網站都有一份breeze的線上說明簡報,英文聽力好的人應該會很有收獲吧?

2003/11/20

台灣世紀回味系列




「台灣世紀回味」全套三冊
今天在市圖找資料,無意間翻到這其中一本,一個字,讚!
內容很豐富,圖文並茂,許多老照片、舊海報、漫畫
…每一頁都是珍貴的台灣記錄。

全套三鉅冊,包含20類主題、3000張珍貴圖片、
40萬字、耗資千萬
文史專家莊永明老師總策劃
特級精裝,大菊8開(30cm×23cm×6cm),150磅精印雪銅全彩
定價4,500元

即使特價也要3300,一個字,貴!
但還是很想敗來…

CSS的一些入門

很早以前便接觸過css了,但從沒好好學過
以前只有拿來做些簡單的連結字小特效
從沒想過要學更進階的…(因為flash更吸引我吧)
最近為了自己的blog的版型,只好再度學習css

從網站百寶箱找到些教學,先記在這裏:
CSS Box模型
CSS定位(1)
CSS定位(2)
CSS定位(3)

2003/11/15

幾本關於遊戲設計的原文書

最近"堵"到幾本關於遊戲設計的原文書的電子檔。

我想該先調查他們的來歷,評估其參考價值,順便列在這裏…

2003/11/14

大師談遊戲設計"筆記-ch9動作遊戲

大師談遊戲設計


今天讀完第九章"動作遊戲"
做個筆記…

§CH9動作遊戲§

9.1動作遊戲類型
9.1.1射擊遊戲
9.1.2非射擊遊戲
這是從遊戲的過程來分的吧,而且算是個廣泛的分類,其各自都可以再細分…
心得:雖然名稱上是"射擊",但從他的內文中可以知道,他的分類並不一定是要有"射擊"行為才算,反而比較像是以"暴力",或是否強調"反應力""手眼協調"為分野。
(應該弄一本原文的來對照才是-_-")

9.2設計元素
9.2.1規則
.關卡
通常動作遊戲都可以關卡的概念來分析(通常,不一定全部)。大多會以BOSS或是任務的型式來區隔。而關卡有時也會以數個小關合成一個大關(主題)的方式呈現。

.檢查點(我們常說的接關點、記錄點)
有三種方式:
起點(關卡起點、遊戲起點)
死地復生,或是死前最後一個安全處
預設分段點

.生命數(幾台或幾隻)
通常開始時會是3~5之間。而增加方式可透過"寶物"或"達到一定分數"兩種;而生命數為0的時候則game over。有時生命數也會配合能量(血)運用,當能量為0時,生命數才扣1,像洛克人就是。

.能量(血)
血、hp之類的,通常也是用"寶物"之類的方式增加,有些遊戲的能量是可讓使用者調配的,例如護盾與燃料間是用同一個能源系統,玩者就必需有效地分配才能過關(ex.xwing,tie fighter...)
心得:除了寶物能加血,有時也可用"昇級"、"過關"等條件讓玩家補滿血。而有些遊戲,血量多寡也被拿來當作一種條件判斷,例如滿血時才能用出某些招式,如超任的?爾達、真三三都有這種設計。

.時間
三種用法
-限制時間內過關,剩下沒用完的時間剩上某常數,成為分數的一部份。
-倒數計時器,當倒數結束時,將觸發某個event(通常是對玩家不利的)
-時間限制的寶物,例如超級瑪利的無敵星星,小精靈的大力丸

.分數
在動作遊戲中,分數常常是一個重要指標。(我想是可以給予玩者除了破關之外的另一個回饋吧)
因此遊戲中應該設置"能讓玩家取得高分的高難度途徑"(我整理的不太好,總之就是要想一些得高分的方式放進遊戲?,而這些方式最好是較高難度或較具挑戰性的)。

.寶物
大略可分為"永久型"跟"限制型",限制型也可分為時間限制或次數限型。通常愈強的寶物限制愈多。
"組合招"算是寶物中的特例,通常只出現在格鬥遊戲,(且是必備的吧!!),透過複雜的輸入,或是一定時間的低防衛力做為代價,以換取較強較有效的攻擊動作。
心得:將組合招歸類為寶物的一種,真是有趣,也滿有道理的。我想寶物的原則應該是:「玩者要付出一定代價,取得對自己有利的物品或狀態,而愈有利的寶物其代價需求愈高。」這樣定義的話,寶物跟組合招就可以算同一類了。

.收集物
一些無意義的物品,可以設計為當集滿一定數量或某些特定物品時,可觸發特定關卡、特定寶物或是一個分數回饋。
心得:像魔鬼剋星的字母收集就是。我想這通常要玩家的熟練度到一定程度時,才會注意這部份吧。

.精靈炸彈(大爆炸、大絕招)
一種讓玩家可瞬間清除畫面上所有敵人的動作。而其數量要稀少才能強調出此一機制
心得:我想他的重點是,最好設計一些讓玩家可自救的途徑。方便玩家做策略性的運用。不過目前看來大爆炸的設計大還是用在飛行射擊遊戲上較多吧。其他類的動作遊戲要自救的話,不一定是大爆炸,也不一定瞬間清光敵人,甚至沒有明顯的自救機制,因為我想這也關係到遊戲敵人潮的設計吧。

.超空間
另一種自救機制,不同的是,它不會清光敵人,只是讓玩家瞬間移到另一個位置,有時新的位置也許更危險…
心得:這種倒是很少見…個人覺得也不是很好用…

.敵人潮
有固定跟隨機兩種
固定式就是所有的敵人出現時間、方式都是事先設計好的,且不變的。
隨機式就是隨機出現,通常會再設計一演釋法則來維持遊戲的難度發展。
心得:我想固定式會比較好做,但也不見得比較爛,因為透過固定的配置,玩家才能有"成長"的機會,透過一次次的玩,他才能熟悉關卡,才能不斷過關。
隨機式的,會比較有變化,但若無法設計出良好的難度控制法則,我覺得不如不要隨機。

.大頭目
必需與小兵有所區隔,例如較強的攻擊、較長的血,較特殊的攻擊才能令它受傷…等。
設計上有幾種方式。
-與主題背景一致(洛克人最常見)
-小兵放大版(可以讓玩家容易熟悉)

.萬用敵人
脫離小兵及boss以外的另一種敵人,它可能在任何時間出現,並擁有特殊攻擊模型。它的優點是可以突破敵人可預測的侷限性。
心得:像侍魂2的黑子裁判

.鎖上的門及鑰匙
不一定是door跟key的型態出現。總之就是當玩家付出一定努力後,即可通過某個障礙的概念。
心得:這個概念其實很多遊戲都有,我想rpg是最多的了。
.怪物產生器
不斷產生敵人的機制,分為可摧毀的跟不可摧毀兩種。產生上也可分為一定數量或無限量兩種。以及產生一種或產生多種敵人的區別。
這機制要仔細評估遊戲的困難度,如果是無限量的,最好就要讓它是可摧毀的。
心得:書上是舉doom為例,不過我想有些飛行射擊遊戲也有類似的機制。

.地城出口與跳關
出口通常是一種場景的轉換,一般來講是順著關卡次序來按排,但部份出口是可以跳關的,像超級瑪利,但通常跳關會屬於秘技部份。

.迷你地圖
心得:我想這部份屬於導覽的部份,不同的遊戲型態,自然有不同的地圖配置,也自然有不同的小地圖系統

9.2.2勝利條件
重要原則:簡單且清楚
心得:有時候也有"騙人"的情節,尤其是有故事性的,例如本來A是魔王,但當A打死後,才突然瞭解B才是大魔王。這倒是讓情節更有變化…不過想想,也不過是絛件的轉換,A跟B都要打仍是不變的…

9.2.3互動模型
書中這?指的是操作吧,動作遊戲通常以反應及手眼協調為主要訢求,因為簡單直覺的操作是相當重要的。

9.2.4視角
原則是要提供玩家足夠資訊的良好視角/視野。
這對3D遊戲來說是滿重要的,因為他們通常會有攝影機如何安排的問題。也因此作者強調一點,3D不一定會比2D好玩。因為3D常常會有視角不良的問題產生。
心得:同意!!

9.2.5使用者界面設計
原則:KISS(keep it simple,stupid)
這?指的界面不單單只有一些屬性欄位,也包含了整個畫面的設計,這?有很多東西是可讓我們選擇的。例如主角與敵人與背景的色系區別、主角在畫面上的固定位置等等…透過很多小地方的不同,讓玩家很容易地區別出主角、敵人、寶物、背景等。
心得:可調配的屬性真的很多,像色系、位置、閃爍…我想這些可以從很多遊戲中觀察到。

9.3動作遊戲的特殊設計考量
這?討論了一個"容許犯錯度"的問題,其實跟困難度有關係。有些遊戲設計是無情的,一個小錯誤就令玩家失去一條命;而有些遊戲設計是親和的,會在危險時給予適當的補救機會。這中間的區別還是在於目標市場的不同。
心得:總歸一句,設計之前,先明確定好目標市場是很重要的。

9.4總結
總結這段還是環繞在遊戲核心的本質,無論聲光效果的呈現,遊戲性才是遊戲最重要的核心。

Flash冒險遊戲引擎-F.A.C.E

F.A.C.E. :: Flash Adventure Construction Engine - Version 0.7

德國人做的吧。
以flash打造的冒險遊戲引擎。
號稱不用寫任何as就能輕鬆製作個人的冒險遊戲。
有興趣的人可以試試

2003/11/13

我們的競爭力在哪?

現在申請失業,政府會安排失業者去上一個就業保險的說明課程。而且是強制的。
為了順利領取失業補助,只好去了…
本以為只是無聊的法令宣導,不過其實講師們都滿用心的講的,也不會太無聊。
坐在我前面的是一位中年失業的主官,他是一位美國留學的博士,在國外生活了十多年,至到近幾年才回台工作,最近因公司合拼才被裁的。我們就在課餘休息時間聊起天來了…
就這麼聊著聊著,聊到台灣跟大陸的將來,我們都認為大陸目前的進步是飛快的,台灣的競爭力將會倍受威脅。
而通常聊到這方面話題時,且對方又剛好是前輩的話,我就會問:「那請問你認為將來我們台灣的優勢會在哪?」這位先生倒給了我一個莫可奈何的表情,我想他的意思是:「完全沒有!」吧。
以前問這種問題,我通常得到的答案是什麼"創意"、"核心技術"等等諸如此類的,這麼直接答案倒是第一次聽到。
也許是有點悲觀吧,不過換個角度想,若不這樣時時驚惕自己,真的是會愈來愈沒競爭力。
正談到此,上課鐘響,於是我們只好打住話題。但我仍不自覺思索這個話題…忽然有個想法(其實也只是我們之前談的另一個話題吧)。我突然想到,與其思索台灣與大陸之間的競爭力,還不如想想台灣在世界上的競爭力。以做一個flasher來說,也許要想想若世上有個全球flasher的排名,自己能排第幾呢?
從這樣去想的話,什麼台灣還有哪些優勢、大陸的威脅,都將變得微不足道了…

安裝多國語言flash2k4

先裝英文版,再裝其他語言的版本,
再來啟動flash時,按著shift鍵,就會出現切換語言的視窗了。

via Danger'sBlog
在一?系?上安?多?言Flash MX 2004的方法
Flash MX 2004 support multilanguage installation

2003/11/12

swf轉fla軟體

AVE IMPERATOR

傳說中的swf2fla終於軟體出現了!
詳情及demo下載請至上面官網。

或到7dev.net抓,會比較方便

Gold Yard

用FLASH做的冒險遊戲,畫面挺精緻的,內容也滿用心的,但就是太短了。

Gold Yard

Kyle's Flash Blog看來的。

2003/11/8

台灣民間故事-廖添丁

看來看去,還是覺得義賊的故事較吸引人。

這裏蒐集了網路上關於廖添丁的一些資料

台灣民間故事.義賊廖添丁的故事
最常見的版本

歷史報告:”廖添丁”
感覺像是一篇作業,有提到正史、野史、背後意涵及文獻來源。

郭長城老師的 廖添丁廟 相片集
很多廖添丁廟的相關照片,裏面漢民祠紀略上的碑文,我想可以當作野史版的依據。

廖添丁先生的故事
簡單中肯的敘述,倒是對「青腳巾」這項武功做了點詳細說明。

.廖添丁是邪神 廖添丁廟是邪廟
原網頁已不見了,不過用google找論壇,還是以看到不少罵廖添丁的文章

俠盜正傳-遊戲
oh my god,原來廖的game早有人做了,還是有得過獎的學生作品哦。
口古月 遊戲製作小組官方網頁
先下載來玩看看再說,天啊~158mb耶!


暫停,先記錄一下心得先

以做論文來看,我想我需要正史一部、野史一部。
正史的話,目前我還沒找到詳細資料,但得到一些關鍵字:
「從日本原始檔案看廖添丁其人其事」一文,作者李季樺
“廖添丁傳奇”九歌出版社

這些書改天要到圖書館找來看看

野史的話,版本很多,每個環節都有好幾種版本,

從出生,有孤兒版、父母遭迫害版
學武,有跟廟裏的和尚廟祝學的,有跟阿福伯(誰啊?)學的
武功,青腳巾版、長布巾版,相同的是腰巾是一定有的,名稱不同而已,而且腰巾不過是他多才多藝中的一項罷了
少年時期,有做長工的、有牧童的,反正他小時候就是沒讀書,開始工作就對了

各種做案過程,我想這是本系列故事最吸引人之處,也是版本最多的地方,但也有一些是相同的,例如他偷過日本總督官印、搶過林本源、辜顯榮等等。

結局,都是死在八里的山洞裏,但有自己累死的、跟被人陷害兩種,其中陷害人有分紅毛仔跟姓楊的兩種版本

關於野史我想漢民祠紀略的碑文可以當做一個參考
另外我想吳樂天的說書版也是較知名的代表,
但問題是,這其中大多可能是吳先生自由編撰的。在可信度上不知會否有問題。
(不過說實在,若我確定採用民間版,那麼就應該可以自由發揮,又何來可信度之問題)

廖添丁故事的部份就先探討到這裏,我想我比較需要的是正史的相關資料,以証明論文參考文獻上的完整,而野史部份我想其實都差不多的。
===========================================
嘿嘿,找到音樂了
專輯名稱:馬水龍:廖添丁管弦樂組曲/Ma Shui-lung: The Liao Tian-ding Orch
出版:上揚唱片
曲目:
http://www.sunrise-records.com/sunrise/index.cgi?t=mall_view&ID=308
*市圖 西湖分館借得到 索書號 A CD 912.3 7110

由 maso 於 2003年12月01日 下午22時37分發表
===========================================
找到吳樂天版了
臺灣英雄廖添丁
著者 吳 樂天
索書號: 857.458 2621 78
出版地: 臺北市
出版者: 時報
出版日期: 民78
敘述: 325面 圖 19公分
央圖臺灣分館 857.458 2621 78 臺灣資料室 館內借閱


由 maso 於 2003年12月01日 下午22時43分發表
===========================================
http://netcity2.web.hinet.net/UserData/kant1/tai/ds/story.htm
這裏有廖添丁的照片,沒記錯的話,是日據時期,日日新朝報上的通緝照。

由 maso 於 2003年12月11日 上午00時32分發表
台灣的“羅賓漢”傳奇
3月25日的參考消息刊登了台灣《自由時報》文章《俠盜廖添丁 傳奇說不盡 真偽漸分明》(作者 張瑞楨)
03/25/2003/00:00 華夏經緯網
http://big5.huaxia.com/2003627/00018927.html
這裏提到滿多有關考証的東西,但到自由時報網站上,卻沒找到這篇,找時間再到圖書館查看看。

由 maso 於 2003年12月12日 上午00時19分發表
===========================================
會想看看這篇
鄭政誠 (民90):虛構或真實?從漫畫《俠王傳》談影視史學與臺灣史研究的交集〉,《台南師院學報》,第34期,民國90年6月,頁367-387。

鄭老師著作:
http://web.ntntc.edu.tw/gac630/%E5%A4%A7%E5%AD%B8%E9%83%A8/%E8%80%81%E5%
B8%AB%E6%94%BF%E8%AA%A0-%E9%A6%96%E9%A0%81.htm


由 maso 於 2003年12月13日 下午21時45分發表
===========================================
關於吳樂天的錄音帶或cd

據說這裏買得到:
台灣ㄝ店
http://www.legend.net.tw/abcbbs/store/index.htm

yahoo有人在賣
卡帶//----吳樂天師範大學演講錄音--[廖添丁出世篇]-全新未拆--199元
http://tw.f2.page.bid.yahoo.com/tw/auction/b6604005?aucview=search

這位老師的"台灣有聲資料"裏有
但不知怎麼借
http://192.192.2.24/

由 maso 於 2003年12月13日 下午23時11分發表
===========================================
自由時報網站上有該篇報導
如果找不到 可以把你的電子郵件信箱給我
我email報導全文給你

由 red-cat 於 2004年02月01日 下午23時00分發表
===========================================

台灣民間故事-學術文獻

關於台灣民間故事、文學的相關文獻,記錄在這裏。
突然想到,以台灣文化做為論文有個好處,可以避掉看外文文獻的痛苦。^^"

.台灣民間文學採錄的意義與方法
主講人:陳益源/中正大學中文系副教授

.淺論臺灣民間故事發展概況
彭衍綸(景文技術學院國文科專任講師)

.李文牯與邱罔舍
溫秀雯?新竹師院台研所碩士生

.臺灣閩南語故事之命運觀
蔡月娥 國立台北大學/民俗藝術研究所/91/碩士

.中國民間文學中財神的研究
周啟松 中國文化大學/中國文學研究所碩士在職專班/90/碩士
(看了這篇才知,原來廖添丁也算是財神)

先休息一下~

台灣民間故事

由於論文的關係,要開始蒐集關於台灣民間故事或是台灣文化方面的資料,於是就記在這?吧。
這次主要是找"故事內容",先把這些台灣故事看一看。

.大紀元文化網-台灣民間故事
幾篇不錯的:
義賊廖添丁
蘭嶼--情人洞
練膽
螞蟻的由來—好鼻獅
劍潭

.台灣民間故事-南天宮媽祖金傳奇

.宜蘭縣鄉土教材資料庫-本土語教學
有很多民間故事,還有MP3說書

.台灣咁仔店-台灣民間故事
日月潭的由來
半屏山的傳奇
白賊七仔傳奇
邱罔舍的故事
義賊廖添丁的故事

.漫談白賊七故事
這是一本書,如果最後選做白賊七的話,這本書就用得上了

2003/11/6

關於Maso'sBlog...

關於這個blog,我想會記錄一些關於FLASH、關於GAME的事物,以及一些網路上的所見所聞吧。

開張囉~

Maso'sBlog正式成立。
說起來真是汗顏,這應該算是我第五、第六次架blog了吧,由於我的虛擬空間只支援asp,所以試過幾套asp的blog,但大多不支援中文,或是有問題;於是我也申請過幾個免費的blog或是能跑mt的免費空間,但不是嫌廣告太刺眼,就是功能太少。

最後索性換一家虛擬空間,於是一切問題都解決了!^^"

2003/11/2

ContextMenu class控制右鍵選單

在MX2004中,針對右鍵選單有了特有的CLASS做控制--ContextMenu
所以只支援FLASH PLAYER 7以上

先看範例(取自ActionScript.org)

沒時間自做一個放上來,自己連過去看吧-_-"
在"M"上面按右鍵試試,就會發現有所不同了。

怎麼做的?請再看下去

在MX2k4之前,我們只能用fscommand("showmenu","false")的方式,讓選單變小,但2k4提供了新的語法,對右鍵選單有更多的控制。

這便是用了2k4的新類別 ContextMenu
*此類別僅適用於flash player7以上版本

使用方法



這樣便能達到跟以前fscommand("showmenu","false")類似的效果
*請注意,是類似,仔細觀察會發現有些許不同

也許會很納悶,以前一行的事,為何要寫三行
如果只是要完全隱藏內建選項的話,用舊的方式明顯會比較快速方便,不過若是要更進階的控制,最好就要用新的方法。

而上述的三行:
第一行是必要的,總是要先建出一個ContextMenu類,才能控制吧
第二行就是你可以大改特改的地方了,你可在此加入各種想要的控制。可以只寫一行,也可以是很多行。後面再做詳細介紹
第三行也是必要的,將你建好的新選單,指定給_root,順帶一提,也可以指定給別的mc。有經驗的人該想到了,沒錯,2k4可以給各個mc或root有不同的右鍵選單哦。

大致架構可分為三個,新建(上述第一行),設定(第二行),指定(第三行)
新建跟指定應該不用太多解釋,不懂的人照抄就是了
接下來講設定的部份,如同上述,你可以寫不只一行的程式去改變它。

接下來介紹有那些指令可做設定

newMenu.hideBuiltInItems();
隱藏所有內建選項

newMenu.builtInItems
指定某特定內建選項的顯示/隱藏
如:newMenu.builtInItems.quality=false;//將"品質"選項隱藏
可設的屬性有:save, zoom, quality, play, loop, rewind, forward_back, print
控制方式用true 或false
*令我納悶的是save是那一個選項,找不到…?

ContextMenu.customItems
自訂選項,可以看成一個array,所以用push的方式加入(其他array方法不知是否也適用?)
如:



這部份要參考ContextMenuItem這個class才算完整

ContextMenuItem
也是一個class,可用兩種寫法加入選單


效果是一樣的

**注意,上述中的hey,是一個function的名稱,也就是這個選項按下後要做什麼動作用的,因此要自行加一個名為hey的function,否則將無法看到自訂選項
例如:



ContextMenu.copy()
故名思義,複制一份
例如:


clone_cm = my_cm.copy();
複制出來的,將繼承原始menu的所有屬性

ContextMenu.onSelect
當右鍵選單觸發時…如


我想也可以當做右鍵訊號的取得吧。

ContextMenuItem.caption
取得選擇選項的名稱,如



ContextMenuItem.copy()
複製一份選單選項,如:


ContextMenuItem.enabled
將選項設為enabled/disabled,如:


*disabled跟隱藏的差別在於,disabled是看得到選不到

ContextMenuItem.onSelect
當選項被選到時,用法類似ContextMenu.onSelect

ContextMenuItem.separatorBefore
畫出分隔線,如

結果會是在myItem2的上面畫出一條分隔線

ContextMenuItem.visible
設定選項的顯示/隱藏,以true/false設定,如

補充,可用menu的地方:

Button.menu, MovieClip.menu, TextField.menu

參考文獻:
Flash MX 2004 introduces the ContextMenu class

2003/11/1

Ultrashock releases MSN6 Tab

Ultrashock做了一個msn的tab

裝了之後可以利用msn直接看到最近20則ultrashock的新聞、新帖或是boomshock

這?下載

相關技術討論(好像跟xml有關的樣子)

有空要來研究一下,要是能做一個自己的tab應該滿好玩的

2003/10/30

奕安的第一次生日



今天是奕安小朋友人生的第一次生日,在這重要的日子裏,他扮成小熊到動物園給動物看…