之前的文章有討論到如何在phonegap上plugin的方法
這一次我們來試著把facebook sdk 加進來~
Target:post to facebook wall on phonegap
step1.
我們需要facebook sdk ,請到這裡下載 https://github.com/facebook/facebook-android-sdk
裡面會有一些目錄,有一個facebook的folder是主要的sdk(example是範例)
2011年11月5日 星期六
2011年10月18日 星期二
phonegap+admob+plugin
這些天在搞這個東西...記錄..啊不! 分享一下:D
=====第一步 建立 phonegap========
首先 先來去找PHONEGAP的SAMPLE
※去官網http://www.phonegap.com/ DOWNLOAD,裡面會有各種OS的LIB跟SAMPLE~直接拿SAMPLE來改比較快~
※目前PHONEGAP版本1.1.0
※版本我習慣選2.3.3
=====第一步 建立 phonegap========
首先 先來去找PHONEGAP的SAMPLE
※去官網http://www.phonegap.com/ DOWNLOAD,裡面會有各種OS的LIB跟SAMPLE~直接拿SAMPLE來改比較快~
※目前PHONEGAP版本1.1.0
※版本我習慣選2.3.3
2011年9月20日 星期二
as3 [flex]旋轉選單
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="application1_creationCompleteHandler(event)" >
<fx:Script>
<![CDATA[
import caurina.transitions.Tweener;
import mx.events.FlexEvent;
private var initX:int=500;
private var initY:int=200;
private var gap:int=30;
private var _scale:Number=.6;
private var _current:int;
private var time:Number=0.5;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
setCurrent(3,false);
}
private function currentInd(offset:int,len:uint):int
{
var temp:int=_current+offset;
if(temp>=len)
return temp%len;
else if(temp<0)
return len+temp;
else return temp;
}
private function setCurrent(ind:int,move:Boolean=true):void
{
var len:uint=menu_group.numElements;
_current=ind;
if(_current>=len)_current=0;
else if(_current<0)_current=len-1;
var _canvas:Canvas;
for(var i:int=-2;i<=2;i++)
{
var v:int=(Math.abs(i)==2)?0:1;
var t:Number=(Math.abs(i)==2)?.1:time;
var c:Number=Math.pow(_scale,Math.abs(i));
var x:Number;
var y:Number;
_canvas=menu_group.getChildAt(currentInd(i,len)) as Canvas;
y=(i==0)?initY:initY+(_canvas.height/2)-(_canvas.height*_scale/(2*Math.abs(i)));
switch(i)
{
case 0:x=initX;break;
case 1:x=initX+_canvas.width+gap;break;
case 2:x=initX+_canvas.width+gap*1.5;break;
case -1:x=initX-(_canvas.width*_scale)-gap;break;
case -2:x=initX-(_canvas.width*_scale)-gap*.5;break;
}
if(move)
Tweener.addTween(_canvas, {visible:v,scaleX:c,scaleY:c,x:x,y:y,time:t});
else
{
_canvas.x=x;
_canvas.y=y;
_canvas.scaleX=_canvas.scaleY=c;
_canvas.visible=Boolean(v);
}
}
}
protected function button1_clickHandler(event:MouseEvent):void
{
setCurrent(_current+1);
}
protected function button2_clickHandler(event:MouseEvent):void
{
setCurrent(_current-1);
}
protected function type_1_clickHandler(event:MouseEvent):void
{
// TODO Auto-generated method stub
}
]]>
</fx:Script>
<s:Group id="menu_group">
<mx:Canvas visible="false" backgroundColor="0xff0000" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0x00ff00" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0x0000ff" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0xffff00" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0x00ffff" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0xff00ff" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0x123456" width="100" height="100" click="type_1_clickHandler(event)"/>
<mx:Canvas visible="false" backgroundColor="0x654321" width="100" height="100" click="type_1_clickHandler(event)"/>
</s:Group>
<mx:HBox>
<s:Button click="button2_clickHandler(event)"/>
<s:Button click="button1_clickHandler(event)"/>
</mx:HBox>
</s:Application>
2011年9月17日 星期六
as3 FLIXEL FlxSprite 自訂mouse event事件
雖然說flixel中有button類型,也可以自行更換裡面的圖,但就是少了那麼一點點的自由度
而常常只是需要知道某個sprite是否被滑鼠點擊,就套上button…可能太麻煩了,而且還不一定能達到想要的效果。
基於這個原因,我自已刻了一個類別~
只要將sprite繼承該類別,再直接override裡面的 over、out、onPressed、onReleased,就可以簡單的使用mouse event了
而常常只是需要知道某個sprite是否被滑鼠點擊,就套上button…可能太麻煩了,而且還不一定能達到想要的效果。
基於這個原因,我自已刻了一個類別~
只要將sprite繼承該類別,再直接override裡面的 over、out、onPressed、onReleased,就可以簡單的使用mouse event了
2011年9月9日 星期五
php utf8 2 unicode,unicode 2 utf8
<?
// utf8 - unicode
function utf8_unicode($c) {
switch(strlen($c)) {
case 1:
return ord($c);
case 2:
$n = (ord($c[0]) & 0x3f) << 6;
$n += ord($c[1]) & 0x3f;
return $n;
case 3:
$n = (ord($c[0]) & 0x1f) << 12;
$n += (ord($c[1]) & 0x3f) << 6;
$n += ord($c[2]) & 0x3f;
return $n;
case 4:
$n = (ord($c[0]) & 0x0f) << 18;
$n += (ord($c[1]) & 0x3f) << 12;
$n += (ord($c[2]) & 0x3f) << 6;
$n += ord($c[3]) & 0x3f;
return $n;
}
}
function u2utf8($c) {
$str="";
if ($c < 0x80) $str.=$c;
else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
} else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return $str;
}
echo u2utf8('20197');
echo utf8_unicode('電');
?>
as3[演算法] 模擬退火 Simulated Annealing
模擬退火 Simulated Annealing
為npc問題
p係指 多項式時間可決定
np則是 非決定性多項式時間
意思就是沒辦法用固定的時間(step)來得到一個問題的答案
而npc是指在np問題中 最困難的情況!
通常這類問題 需要將 參數一個一個帶進去try結果,尋找最佳結果
此模擬退火方法 在真實世界中係指一物體,受高溫後 溫度上升為t ,其內部原子 得到熱能後 形成可遊離狀態
在此可想像成沈積現象 原子會依自身的質能 往理想(比較重的會比較輕的掉到較底的位置)的位置移動 等到溫度降低之後 所有的原子失去動能
此時的各個原子所在的位置 理當比原先較為穩定(就像進行了一次排序) 這就是退火
as3 FLIXEL 真實碰撞 prefect collide
範例是使用鍵盤控制 用上下左右...
step1:使用overlap偵測碰撞
FlxG.overlap(targetImg,this,onOverlap);
step2:使用perfectCollision function偵測是否為真實碰撞
private function onOverlap(targetimg:FlxSprite,overlapimg:FlxSprite):void
{
if(perfectCollision(targetimg,overlapimg))
output_txt.text="true";
else
output_txt.text="false";
}
protected function perfectCollision(s1:FlxSprite,s2:FlxSprite):Boolean {
var alphaThreshold:uint = 0xFF;
var p1:FlxPoint=getScreenXY(s1);
var p2:FlxPoint=getScreenXY(s2);
return s1.framePixels.hitTest(new Point(p1.x,p1.y),alphaThreshold, s2.framePixels,new Point(p2.x,p2.y));
}
protected function getScreenXY(target:FlxSprite):FlxPoint
{
return target.getScreenXY(new FlxPoint());
}
完成~
step1:使用overlap偵測碰撞
FlxG.overlap(targetImg,this,onOverlap);
step2:使用perfectCollision function偵測是否為真實碰撞
private function onOverlap(targetimg:FlxSprite,overlapimg:FlxSprite):void
{
if(perfectCollision(targetimg,overlapimg))
output_txt.text="true";
else
output_txt.text="false";
}
protected function perfectCollision(s1:FlxSprite,s2:FlxSprite):Boolean {
var alphaThreshold:uint = 0xFF;
var p1:FlxPoint=getScreenXY(s1);
var p2:FlxPoint=getScreenXY(s2);
return s1.framePixels.hitTest(new Point(p1.x,p1.y),alphaThreshold, s2.framePixels,new Point(p2.x,p2.y));
}
protected function getScreenXY(target:FlxSprite):FlxPoint
{
return target.getScreenXY(new FlxPoint());
}
完成~
2011年8月29日 星期一
as3 FLIXEL FINDPATH DEFAULT自訂路徑
如果利用flixel底下的findPath,自訂自已想要的行走路線?
我的作法如下
1.利用tilemap,定義出每條路線的起點跟終點,還有所經過的所有點
2.將每條路徑的點,利用FlxPath轉化成node
3.接著把enemy套上followPath,並把我們自訂的path丟進去,enemy就會跟著自訂的路線走啦
我的作法如下
1.利用tilemap,定義出每條路線的起點跟終點,還有所經過的所有點
2.將每條路徑的點,利用FlxPath轉化成node
3.接著把enemy套上followPath,並把我們自訂的path丟進去,enemy就會跟著自訂的路線走啦
2011年8月28日 星期日
FLIXEL介紹
flixel是一套專為flash as3打造的game engine
其特色是使用pixel成像,完全不使用向量圖檔,
除此之外 他以下的幾項功能也很好用: p
其特色是使用pixel成像,完全不使用向量圖檔,
除此之外 他以下的幾項功能也很好用: p
- 動畫播放:因為沒有支援向量圖,所以作法是你將一連串的圖片組合成成一張大圖(現在很多game都是這樣做的哦,因為這樣比較省效能),而且flixel把它作的很棒!假設你這張圖分成10個區塊,你在1~3張是往右走的動畫,4~6是往上跳的動畫,7~10是攻擊,你可以直接在flixel裡將它分成三個動畫,而且每個動畫還有事件通知。而且flixel還有提供一些動畫的特效,比如該物件死掉之後會爆炸開來...
- 運動:完全遵循 向量力的作法,你可以將一個物件設置他的向量力、跟最大的向量力,也可以設置加速度,當然要設置阻力也是沒問題的。
- 碰撞:由於整個flixel是使用bitmap繪製而成,而且它用大量使用了四叉樹,所以碰撞非常不傷效能。(不過原生的不是真實碰撞,我後來有改寫~)
- tilemap:使用tilemap,可以快速的把你製造出一張地圖,我不得我說它的地圖很有巧思!?它可以使用九宮格的方式來填充地圖,蛤?咡不懂?沒關係,快來下載tilemap 編輯器 http://dambots.com/dame-editor 製作地圖,放置角色 簡簡單單~:P
- 除此之外 他還支援一大堆其他的API,詳細請上官網查詢XD
as3 rtmfp service OpenRTMFP
OpenRTMFP 是一個可以提供as3 rtmfp 連線的service,
使用此open source service,你可以自定義port,也可以新增white list。
安裝方式如下:
安裝環境:
centos 5.4
1.到https://github.com/OpenRTMFP/Cumulus 下載OpenRTMFP-Cumulus-112ade5.tar.gz
2.將解壓縮後的資料夾放到/root底下(你可以放到你想要的地方)
3.安裝OpenSSL
4.安裝poco ※我用yum找不到poco,所以直接到官網下載並安裝http://pocoproject.org/
5.poco安裝後之後,將poco中的lib資料夾底下的檔案復製到/lib底下
6.安裝gcc
7.切換目錄到OpenRTMFP-Cumulus-112ade5\CumulusLib底下,執行 make(可參考文件的readme)
8.切換目錄到OpenRTMFP-Cumulus-112ade5\OpenRTMFP-Cumulus-112ade5\CumulusService執行make
9.安裝成功之後,執行 ./CumulusService 就完成了!!
10.接著你可以在rtmfp中連線的server_adress填上你剛剛架的Cumulus的ip
至於developer key,沒有設置的話 就不用填了 : p
使用此open source service,你可以自定義port,也可以新增white list。
安裝方式如下:
安裝環境:
centos 5.4
1.到https://github.com/OpenRTMFP/Cumulus 下載OpenRTMFP-Cumulus-112ade5.tar.gz
2.將解壓縮後的資料夾放到/root底下(你可以放到你想要的地方)
3.安裝OpenSSL
4.安裝poco ※我用yum找不到poco,所以直接到官網下載並安裝http://pocoproject.org/
5.poco安裝後之後,將poco中的lib資料夾底下的檔案復製到/lib底下
6.安裝gcc
7.切換目錄到OpenRTMFP-Cumulus-112ade5\CumulusLib底下,執行 make(可參考文件的readme)
8.切換目錄到OpenRTMFP-Cumulus-112ade5\OpenRTMFP-Cumulus-112ade5\CumulusService執行make
9.安裝成功之後,執行 ./CumulusService 就完成了!!
10.接著你可以在rtmfp中連線的server_adress填上你剛剛架的Cumulus的ip
至於developer key,沒有設置的話 就不用填了 : p
as3 RTMFP SAMPLE
overview
adobe的rtmfp Protocol,是基於p2p的架構,使用udp方式進行資料傳輸
程序會在一開始跟adobe提供的Cirrus service(Stratus service)進行連線,
取得group的連線資訊.
連線時需要一組developer key,
可到https://www.adobe.com/cfusion/entitlement/index.cfm?e=cirrus
註冊取得。
※若是使用自架的service 可以不用申請developer key,請參考 「as3 rtmfp server 架設」
以下為sample
adobe的rtmfp Protocol,是基於p2p的架構,使用udp方式進行資料傳輸
程序會在一開始跟adobe提供的Cirrus service(Stratus service)進行連線,
取得group的連線資訊.
連線時需要一組developer key,
可到https://www.adobe.com/cfusion/entitlement/index.cfm?e=cirrus
註冊取得。
※若是使用自架的service 可以不用申請developer key,請參考 「as3 rtmfp server 架設」
以下為sample
2011年8月27日 星期六
AS3 SOCKET[client]
aS3使用socket連線,這裡提供client端的作法
基本上 client沒有要注意的事項
as3在建立socket連線之後,會自動發送給server(如果有連上的話) <policy-file-request/> 的訊息
之後server會回傳 <cross-domain-policy>...
確定允許連線之後就可正常連線了。
我在寫這個sample的時後,是使用c#當server,由client主動發送<policy-file-request/>的訊息
而server回傳<cross-domain-policy>的這段訊息 則是以字串的方式直接回傳
※官方文件上有說明,正常的流程是在server domain底下放置crossdomain.xml,
以自動確定允許連線。
client也可以自已載入policy檔,方式如下
import flash.system.Security;
Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml");
但我沒這麼做,我直接以字串的方式將policy的資訊回傳給client~
以下是sample
基本上 client沒有要注意的事項
as3在建立socket連線之後,會自動發送給server(如果有連上的話) <policy-file-request/> 的訊息
之後server會回傳 <cross-domain-policy>...
確定允許連線之後就可正常連線了。
我在寫這個sample的時後,是使用c#當server,由client主動發送<policy-file-request/>的訊息
而server回傳<cross-domain-policy>的這段訊息 則是以字串的方式直接回傳
※官方文件上有說明,正常的流程是在server domain底下放置crossdomain.xml,
以自動確定允許連線。
client也可以自已載入policy檔,方式如下
import flash.system.Security;
Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml");
但我沒這麼做,我直接以字串的方式將policy的資訊回傳給client~
以下是sample
2011年8月23日 星期二
facebook add testuser
PHP SDK VER:facebook-php-sdk-v3.1.1-5-gf2a8588
test users overview:
test users 除了可以大量建立測試帳號之外,其保密的功能簡直到家!
所建立的test users,除了所在的group之外,無法存取其他app或user
當然別人也連不到該test user。這在開發app時,可以防止開發資料外洩!!
而且也不用像以前那樣大量註冊facebook,來提供測試帳號;
更麻煩的是當新開一個專案,還要一個一個測試帳號加進test user list,並且等待對方接受邀請~
這些問題 通通不會再有了
php 不重覆亂數~其他語言也可以參考
function rand($i)
{
while($i--)
{
if(isset($arr[$i]))continue;
$r=rand(0,$i);
$arr[$i]=isset($arr[$r])?$arr[$r]:$r;
$arr[$r]=$i;
}
return $arr;
}
優點: 速度夠快、不用先建立array並填滿每個值
缺點: 因為第一句if(isset($arr[$i]))continue;所以"有可能"有跡可尋...不過把第一句拿掉就好了:p
訂閱:
文章 (Atom)