2011年6月30日 星期四

UNITY3D - 控制輸入設定

輸入控制是遊戲最基本的部分,那U3D要怎麼設定輸入控制呢?
首先我們開啟Edit->Project Settings->Input就可以看到Inspector視窗呈現類似的畫面
Axes底下就是各按鍵設定,如果有想要增加按鍵數量的話可以加大Size就會看到下面的按鍵數量增加。
每個按鍵下面都有以下屬性:
Name:用來定義按鍵的名稱,關係到程式呼叫時的對應。
Descriptive Name:玩家在更改輸入控制畫面看到的名字。
Descriptive Negative Name:玩家在更改輸入控制畫面看到的名字(通常為方向控制)。
Negative Button:此輸入所對應的按鍵(通常為方向控制才有用到),程式中取到的值為-1~0。
Positive Button:此輸入所對應的按鍵,程式中取到的值為0~1。
Alt Negative Button:此輸入所對應的替代按鍵(通常為方向控制才有用到),程式中取到的值為-1~0。
Alt Positive Button:此輸入所對應的替代按鍵,程式中取到的值為0~1。
Gravity:設置按鍵恢復的速度。
Dead:調節類比訊號的敏感度(如類比搖桿)。
Sensitivity:調節數位訊號的敏感度。
Snap:勾選後,按反向鍵時會先將數值歸零。
Invert:勾選後,對應的按鍵會相反(通常用於飛行遊戲)。
Type:按鍵的輸入型態(若要改用遊戲手把記得更改此項)。
Axis:此按鍵的軸向。
Joy Num:設定為第幾個手把(若是用遊戲手把的話)。


程式部分:

Input.GetKey (name : string) : bool

用於檢查某特定按鍵是否被按,跟Input的設定無關,會被連續偵測到。

Input.GetKeyDown (name : string) : bool


用於檢查某特定按鍵是否被按下,跟Input的設定無關,只有在被按下的時候才觸發,按鍵不放開重按則無效。

Input.GetKeyUp (name : string) : bool

用於檢查某特定按鍵是否被按下,跟Input的設定無關,只有在被放開的時候才觸發。

Input.GetButton (buttonName : string) : bool

一樣是用來檢查按鍵是否被按,buttonName是Input所設定的名字,會被連續偵測到。

Input.GetButtonDown (buttonName : string) : bool

一樣是用來檢查按鍵是否被按,buttonName是Input所設定的名字,只有在被按下的時候才觸發,按鍵不放開重按則無效。

Input.GetButtonUp (buttonName : string) : bool

一樣是用來檢查按鍵是否被按,buttonName是Input所設定的名字,只有在被放開的時候才觸發。

Input.GetAxis (axisName : string) : float

通常用於方向鍵偵測,回傳值為-1~1,跟Input的設定息息相關。

還有其他的函式可以用,但相信這些就很夠了...

2011年4月1日 星期五

程式設計-從C開始之99乘法表

  1. #include <stdio.h>
  2. main()
  3. {
  4.     int i = 1;
  5.     int j;
  6.     for(j = 1;i <= 9;j++)
  7.     {
  8.         if(j <= 9)
  9.         {
  10.             printf("%d*%d=%2d  ", i, j, i * j);
  11.         }
  12.         else
  13.         {
  14.             printf("\n");
  15.             i = i + 1;
  16.             j = 0;
  17.         }
  18.     }
  19.     system("pause");
  20. }

這段程式碼可以用Dev-C來編譯,編譯出來的結果是一個9*9的乘法表。很簡單的程式但我認為是很好入門的程式。

語句解說:

  1. 第1行是載入C程式的標頭檔,但我們今天先不解釋,照打就好。
  2. 第2行的main()是C程式必寫,用來通知系統執行程式時要從這邊開始,有更複雜的用法以後有機會再提。
  3. 第3行的{跟第20行的}是一對,表示第4行到第19行的內容都是屬於main()。
  4. 第4行int i是指宣告一個變數i為int整數型態並且設為1,型態宣告以後再另開篇幅說明,這裏就先知道i只能用來表示數字,後面的;符號是用來表示一句敘述句結束就跟中文的。一樣。
  5. 第5行跟第4行不一樣在於宣告時沒有設定j是多少,就像過年拿紅包(j)你不知道裡面有多少錢(有可能有一百萬也有可能只有一塊錢),跟直接給你錢(i)的差別。
  6. 第6行的for是C程式的重複結構,以for(A;B;C)為例:
    • A為一般敘述如j = 1
    • B為條件判斷,判斷的結果為真則重複做{}裡面的內容動作,結果為否則離開重複結構,上面程式的B為i <= 9表示當i小於或等於9的時候進入重複結構否則離開重複結構。
    • C也是一般敘述,跟A不同的是A只有在for開始時執行一次,C則是每執行完結構中內容就會執行一次,上面程式的C為j++等同於j = j + 1。
  7. 第7行跟第18行的{}是for的架構標示,表示第8行到第17行是for的重複架構內容。
  8. 第8行的if是C程式的條件結構,根據小括號內容判斷真假,若為真則執行結構中動作否則不執行,上面程式則是判斷j是否小於等於9。
  9. 第9行跟第11行的{}是if的架構標示。
  10. 第10行的printf("%d*%d=%2d  ", i, j, i * j);是列印一串字在螢幕上,列印的內容在兩個"引號裡面,在這裡我們要印出變數i、*符號、變數j、=符號、變數i乘變數j的結果,而不是印出i*j=i*j這樣的一串字,於是寫成("%d*%d=%2d  ", i, j, i * j),%d跟%2d的意思都是顯示"引號結束後以逗號隔開的變數值(還有%s、%f等等可以使用,有機會再提),第一個%d就會呈現變數i的值,第二個%d就會呈現變數j的值,最後的%2d則是呈現變數i乘變數j的值,%2d的2表示如果顯示的數字小於二位數就會在前面補空格,可以嘗試更改2為其它數字試試,"引號後面的逗號區隔的可以是單一變數也可以是一句敘述,想呈現越多的變數值就用越多的逗號隔開,相反的只要顯示"引號內容的話就不用逗號了。
  11. 第12行的else必須搭配if來使用,舉個例子來說:如果肚子餓則吃飯否則睡覺,可以寫成:
    if(肚子餓)
    {
        吃飯
    }
    else
    {
        睡覺
    }
    else就是處理「否則」要做的事情。
  12. 第14行的printf("\n");是將\n顯示到螢幕上,但因為電腦會將\n當成斷行符號,所以這只是將顯示的部分斷行而已。
  13. 第15行的i = i + 1;跟16行的j = 0;只是一般的敘述句。
  14. 第19行的system("pause");是將目前的程式及畫面停住,避免程式執行太快沒看清楚就結束被windows關掉,在Mac或Linux就不需要這句。

邏輯解說:
  • 因為printf只能做橫向列印,所以我們必須先思考怎麼印出1*1=1  1*2=2  1*3=3....1*9=9
  • 要印出這麼一行只需要用:
    for(j = 1;j <= 9;j++)
    {
        printf("1*%d=%2d  ", j, 1 * j);
    }
  • 但仔細觀察後可以發現我們必須執行上面類似的動作9次才能順利印出完整的99乘法表,而這次數決定在於i,所以我們把上面的for修改成這樣:
    for(j = 1;i <= 9;j++)
    {
        printf("%d*%d=%2d  ", i, j, i * j);
    }
  • 但這樣就形成了無窮迴圈,因為在迴圈內i永遠不會變動也就永遠不會大於9,於是我們再增加if條件架構來處理讓j大於9時就斷行且將i加1於將j歸零(因為j會因為迴圈結束時會再執行j++):
    for(j = 1;i <= 9;j++)
    {
        if(j <= 9)
        {
            printf("%d*%d=%2d  ", i, j, i * j);
        }
        else
        {
            printf("\n");
            i = i + 1;
            j = 0;
        }
    }
  • 如此99乘法表就大致完成了。

2010年12月20日 星期一

Python集合

Python有個數學常用的型態 集合(set)

a = set([1,2,3,4,5])
b = set([2,4])

b.issubset(a) 會回傳True

也可以這樣用
a = set(['apple','google','microsoft'])
b = set(['apple','object C'])

b.issubset(a) 會回傳 False
b = set(['apple','google'])
b.issubset(a) 會回傳True

2010年12月14日 星期二

Python寫排列組合

排列組合以離散數學來看應該是如下列表示
x+y for all x for all y
x = {1,2,3}
y = {a,b,c}
排列出來的集合為:{1a,1b,1c,2a,2b,2c,3a,3b,3c}

用Python要怎麼解決呢?
很簡單,幾乎就跟上面的表示法一樣
z = [a+b for a in x for b in y]
print z 就會看到上面的集合了

有時候離散也會在後面表示條件式如
x+y for all x for all y, if x > 1

那就一樣在Python改成
z = [a+b for a in x for b in y if x > 1]
就好了


由此看來創Python的離散應該很強...

2010年10月13日 星期三

GridView for PHP

工作的關係接觸到ASP.NET,有些現成的元件還算不錯用,例如:GridView
最近又接獲要用PHP的案子,也是要做一些資料的維護,就想說看PHP有沒有GridView可以用...
結果居然找不到...
很好...那我自己來寫一個好了,不然這案子有滿多部分都要針對不同資料表做同樣的處理,會寫得很令人厭煩...只有兩天時間,那當然是讓自己省事啊!(再說錢也不多= =)
家裡主機掛了...等回家再把程式碼貼上來...

2010年10月3日 星期日

筆電操壞了

平常都只讓筆電休眠沒真正關機...昨天睡覺前讓它休眠的時候聽到硬碟聲響
因為已經很累了所以就不以為意,怎麼知道今天到公司準備繼續加班時....悲劇就發生了
叫醒它之後看到滑鼠但是畫面就只剩下滑鼠,等了一陣子....靠!藍頻了,好吧!重開就重開
奇怪重開怎麼這麼久....X的硬碟找不到硬碟找不到硬碟找不到~~~~~
那我今天怎麼趕工阿~~~~平時要怎麼上課偷用筆電寫程式啊(咦?!)
最後沒辦法還是送修了,現在只好用公司桌電弄了...
希望三天後能見到完好如初的筆電...

2010年10月1日 星期五

1=2??

假設                                                 a = b
那我們可得到                              a2 = ab
兩邊減b2                                a2-b2 = ab - b2
得                                   (a + b)(a - b) = b(a - b)
兩邊同時除(a - b)得                 a + b = b
因a = b                                           2b = b
答案                                                          2 = 1???
發現問題在哪裡了嗎??


因a = b所以a - b = 0,上面兩邊同時除0是不允許的,
人往往在思考事情的時候會遺漏了該注意的細節,
導致做錯了還不知道.....