2010年6月26日 星期六

Android程式設計 (十三) 使用Notification

Notification提供跨Activity之訊息通知機制,Activity收到的通知訊息會顯示在狀態欄,使用者可從狀態欄拖出完整版面以檢視Notification詳細內容。
要使用訊息提醒功能,需要匯入以下類別:
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
Notification都是由NotificationManager管理,因此應用程式必須先取NotificationManager參照,做法如下:
NotificationManager nManager = (NotificationManager) getSystemService (NOTIFICATION_SERVICE);
接著建立Notification實體,其中第1個參數為出現在狀態欄的圖示,第2個為訊息標題,第3個參數為Notification建立時間。
Notification nMsg = new Notification(R.drawable.icon, "重要訊息", System.currentTimeMillis());
接下來是建立PendingIntent實體,PendingIntent用來封裝Intent,以便將所封裝的Intent提供給其它應用程式使用,外部應用程式執行這個PendingIntent時,就能間接調用裡面的Intent。做法如下:
PendingIntent pIntent = PendingIntent.getActivity(this,0,new Intent(this, MainActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);
getActivity()方法的第1個參數是目前應用程式的Context,簡單說就是目前應用程式的狀態。getActivity()方法的第2個參數目前保留不使用。第3個參數即是提供給外部應用程式用來啟動Activity的Intent實體。第4個參數通常設定為FLAG_UPDATE_CURRENT表示如果PendingIntent已存在,則更新其資料。
接下來是設定Notification內容,使用Notification的setLatestEventInfo()方法指定Notification標題及內容。最後再使用NotificationManager的Notify()方法發佈Notification即可。
nMsg.setLatestEventInfo(this,"南開科大","電腦遊戲設計組歡迎加入!",pIntent);
nManager.notify(0, nMsg);
透過PendingIntent機制,可發現即使送出Notification的應用程式已終止執行,只要點撃Notification訊息內容,Notification管理程式即可透過封存在PendingIntent裡的Context及Intent,重新啟動Intent中的Activity。

2010年6月16日 星期三

遊戲大廠的人機介面大戰

Wii Remote
Wii最先於2005年9月17日於東京電玩展上發表Wii Remote,取代傳統遙控器。結合三軸加速感測技術來達到指向定位及動作感應,除了可以控制螢幕上的游標,還可偵測三維空間當中的移動及旋轉,結合兩者可以達成所謂的「體感操作」。玩者可以透過移動和指向來與電視螢幕上的虛擬物件產生互動,此外也可藉由連接擴充設備延伸控制器的功能。
Wii Remote對玩家有相當引力,推出後嚴重衝擊遊戲市場,但由於專利保護,其它遊戲大廠只能設法開發其它技術。

(Wii Remote)
PlayStation Move
Sony在2010年3月的GDC(遊戲開發者大會)發表PlayStation Move,包括PlayStation Eye(攝影機)、PlayStation Move navigation controller(一般遙控器)及PlayStation Move motion controller(動作感測)。Move motion controller是一支像螢光棒的體感控制手把,搭配攝影機檢知及分析光點來感測遊戲者動作。
(PlayStation® Move motion controller)
Kinect for Xbox 360
微軟在2010 年 6月E3 展發表 Kinect for Xbox 360,這次連遙控器都免了。Kinect 透過紅外線感測、影像處理及語音辦識技術,追蹤偵測玩家的身體動作、姿勢、以及聲音辨識,遊戲者的動作就是控制器。不論男女老少,Kinect 讓玩家能立即融入遊戲當中,以直覺方式玩戲,還會將遊戲中的精彩境頭自動拍照。

2010 E3微軟發表KINECT

2010 年6月 E3 展,微軟發表 Kinect for Xbox 360,透過紅外線感測、影像處理及語音辦識技術,擺脫傳統遙控器之限制,遊戲者的動作就是控制器。Kinect 可追蹤玩家的身體動作、姿勢、以及聲音辨識,不論男女老少,Kinect 讓玩家能立即融入遊戲當中,以直覺方式玩戲。看到球來了,踢下去就是了;有障礙物,直接跳過去;想學跳舞,跟著螢幕上初學者舞步搖擺就對了。
微軟也同步發表Kinect Adventures、Kinectimals、Kinect Joy Ride、Kinect Sports、Dance Central、Your Shape:Fitness Evolved等8種包括冒險、養成、賽車、運動、跳舞的Kinect遊戲,其中Your Shape:Fitness Evolved結合玩家投影(Player Projection)技術,直接將你的形體融入遊戲中,並與虛擬環境進行互動,你的分身在遊戲內動作所產生的獨特視覺效果與震撼力也令人稱奇。另外微軟也宣布明年將與和LucasArts攜手推出的Star Wars星際大戰遊戲,迪士尼也將為Xbox 360推出Kinect版遊戲。
Kinect for Xbox 360 即將在 11 月 4 日在北美上市,並陸續拓展到全球。
(圖片來源: 台灣微軟)

2010年6月13日 星期日

Android程式設計(十二) Activity互動作業-2

處理Activity間資料傳遞
要傳遞資料給被啟動的Activity,啟用端Activity必須先使用putExtra()方法以name-value pair方式設定所要傳遞的資料。putExtra()方法第1個參數代表資料名稱,第2個參數則是為資料內容,如需要傳遞多筆資料,只要重複使用putExtra()方法即可。例如:
Intent intent = new Intent (MainActivity.this, Activity1.class);
intent.putExtra ("REQ1", "MainActivity傳遞的資料1");
intent.putExtra ("REQ2", "MainActivity傳遞來的資料2");
startActivity (intent);
被啟動的Activity,必須先使用getIntent()方法取得傳來的「Intent」物件,再透過getExtras()方法取得資料包(bundle),然後使用getString()等方法讀取指定資料。例如:
Bundle params = getIntent().getExtras();
if (params! = null) {
    temp = params.getString ("REQ1") + "\n" + params.getString ("REQ2");
    Toast.makeText (Activity1.this, temp, Toast.LENGTH_LONG).show();
}
如果啟用端想要由被啟動的Activity取得回傳資料,那麼啟用端必須改用startActivityForResult()方法來啟動Activity,並覆寫onActivityResult()方法來處理被啟動之Activity所回傳的資料。
startActivityForResult()方法的第二個參數為自訂的請求碼,主要是做為雙方溝通的標記,這個請求碼會在onActivityResult()方法中的第一個參數被傳回,以便onActivityResult()程式驗證回傳者身份。
//MainActivity.java
public class MainActivity extends Activity {
    final int MY_ID = 100;
    @Override
    public void onCreate (Bundle savedInstanceState) {
        Button btnobj;
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);
        btnobj = (Button) findViewById (R.id.btnINVOKE02);
        btnobj.setOnClickListener (InvokeActivity2);
    }
    private Button.OnClickListener InvokeActivity2 = new Button.OnClickListener () {
        public void onClick (View v) {
            Intent intent = new Intent (MainActivity.this, Activity2.class);
            intent.putExtra ("REQ1", "MainActivity傳遞的資料1");
            intent.putExtra ("REQ2", "MainActivity傳遞的資料2");
            startActivityForResult (intobj, MY_ID);
        }
    };
    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        super.onActivityResult (requestCode, resultCode, data);
        if (requestCode == MY_ID){
            String temp = null;
            Bundle results = data.getExtras ();
            if (results != null){
                temp = results.getString ("ACK1") + results.getString ("ACK2");
                Toast.makeText (MainActivity.this, temp, Toast.LENGTH_LONG).show();
            }
        }
    }
}
被啟動的Activity端所要回傳的資料亦是使用putExtra ()方法設定name-value pair,之後再使用setResult ()方法回傳資料。
//Activity2.java
public class Activity2 extends Activity {
    final int ACK = 200;
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        Button btnobj;
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity2);
        btnobj = (Button) findViewById (R.id.btnRETURN);
        btnobj.setOnClickListener (CloseActivity2);
        String temp = null;
        Bundle params = getIntent().getExtras();
        if (params! = null){
            temp = params.getString ("REQ1") + "\n" + params.getString ("REQ2");
            Toast.makeText (Activity2.this, temp, Toast.LENGTH_LONG).show();
        }
    }
    private Button.OnClickListener CloseActivity2 = new Button.OnClickListener() {
        public void onClick (View v) {
            Intent intent = new Intent ();
            intent.putExtra ("ACK1", "Activity2傳回的資料1");
            intent.putExtra ("ACK2", "Activity2傳回的資料2");
            setResult (ACK, intent);
            finish ();
        }
    };
}

2010年6月11日 星期五

遊戲類型(十四) RSG 養成類游戲 (Raising Sims Game)

養成類游戲由玩家扮演培育者的角度來進行的一種電子遊戲類型,主要在觀察被培育者隨著不同的栽培方式而產生的變化。
(Nat Geo Games:DogTown, 狗鎮)

2010年6月9日 星期三

Android程式設計(十一) Activity互動作業-1

在Android中,Activity間作業切換或資料傳遞,都必須透過Intent機制。要使用Intent功能,應用程式需要匯入以下類別
import android.content.Intent;
Activity間不傳遞資料
如果我們只要從一個作業書面切換到另一個作業畫面,這二個Activity間不需要資料交換,這種作業很簡單,只要設定好Intent的內容與動作,並把Intent做為startActivity方法之參數,即可啟動另一個Activity。
Intent intent = new Intent (CurrentActivity.this, InvokedActivity.class);
startActivity (intent);
當被啟動的Activity結束(finish),程式會自動返回原Activity。
1. 新增專案。
2. 在專案中加入二個Activity類別:MainActivity.java 及Activity1.java (AndroidMainfest.xml內的<activity>描述也要一併更新)
3. 修改MainActivity 及Activity1使用者介面
4. 修改MainActivity 及Activity1程式碼
//MainActivity.java
public class MainActivity extends Activity {
    @Override
    public void onCreate (Bundle savedInstanceState) {
        Button btnobj;
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);
        btnobj = (Button) findViewById (R.id.btnINVOKE01);
        btnobj.setOnClickListener (InvokeActivity1);
    }
    private Button.OnClickListener InvokeActivity1 = new Button.OnClickListener () {
        public void onClick (View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent (MainActivity.this, Activity1.class);
            startActivity (intent);
        }
    };
}
//Activity1.java
public class Activity1 extends Activity {
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        Button btnobj;
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity1);
        btnobj = (Button) findViewById (R.id.btnCLOSE);
        btnobj.setOnClickListener (CloseActivity1);
    }
    private Button.OnClickListener CloseActivity1 = new Button.OnClickListener () {
        public void onClick (View v) {
            // TODO Auto-generated method stub
            finish ();
        }
    };
}

Android程式設計(十二) Activity互動作業-2

2010年6月8日 星期二

遊戲類型(十三) STG 射擊遊戲 (Shooting Game)

射擊遊戲是以任務關卡方式進行遊戲,由玩家操控戰機或主角,以射擊類武器清除障礙,過程中可取得資源,升級射擊火力。
(Darius Burst, 變形戰機-爆發)

2010年6月7日 星期一

Android程式設計(十) 使用Toast

Toast是一種「快顯訊息」類別,其顯示介面類似一般視窗程式中的Tip,但可設定顯示時間,當顯示時間終了,Android會自動關閉「快顯訊息」。要使用Toast,必須滙入以下套件:
import android.widget.Toast;
在以下程式,當使用者按下「TEST」按鈕,則使用Toast顯示"Android應用程式設計"訊息。Toast顯示時間可以設定為Toast.LENGTH_SHORTToast.LENGTH_LONG
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btnTEST = (Button)findViewById(R.id.btnTEST);
    btnTEST.setOnClickListener(doTEST);
}
private Button.OnClickListener doTEST = new Button.OnClickListener() {
    public void onClick(View v) {
        Toast.makeText(Hello.this, "Android應用程式設計", Toast.LENGTH_SHORT).show();
    }
};

2010年6月6日 星期日

遊戲類型(十二) SPG 體育運動遊戲 (Sport Game)

體育運動遊戲讓玩家模擬參與專業的體育運動賽事,運動類別的內容多以時下熱門的體育賽事為藍本,例如:NBA、職棒、世界盃足球賽等。
(NBA 2K10)


2010年6月5日 星期六

Android程式設計(九) 使用AlertDialog

AlertDialog類別是Dialog類別的子類別。它提供一個文字標籤和最多3個按鈕的顯示面板,使用時必須滙入以下套件:
import android.app.AlertDialog;
import android.content.DialogInterface;
程式中可使用setTitle ()方法設定對話盒標題,setMessage ()方法設定要顯示的文字訊息,setButton ()、setButton2 ()setButton3 ()方法設定按鈕標題及按鈕事件程序,最後再使用show ()方法顯示對話盒。
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btnTEST = (Button)findViewById(R.id.btnTEST);
    btnTEST.setOnClickListener(doTEST);
}
private Button.OnClickListener doTEST = new Button.OnClickListener() {
    public void onClick(View v) {
        AlertDialog dialog = new AlertDialog.Builder(Hello.this).create();
        dialog.setTitle("遊戲科學");
        dialog.setMessage("Android應用程式設計");
        dialog.setButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
            }
        });
        dialog.show();
    }
};

2010年6月4日 星期五

遊戲類型(十一) SLG 策略遊戲 (Strategy Game)

策略遊戲的玩家“擁有”做出決策的權力。在策略遊戲中,玩家的決策會直接影響遊戲的發展結果。
(Defense Grid: The Awakening, 防御陣形:覺醒)

2010年6月1日 星期二

遊戲類型(十) SIM 模擬經營類遊戲 (Simulation)

在模擬經營類遊戲中,玩家以創業者的身份進行某種事業或者產業的經營或建設,玩家必須解決營運中可能遭遇的風險及問題,考驗玩家的經營能力。
(Holzfäller Simulator, 伐木模擬2010)