這一篇來介紹一下TouchEvent。我們先來談單點的touch,下一篇再介紹MultiTouch。翻過Starling文件的應該會發現,Starling裡面沒有MouseEvent,而是整合在TouchEvent裡,但使用上有一些些小技巧要注意一下,才能做出MouseEvent.MOUSE_OUT的功能。

首先來比較一下Starling的TouchEvent跟native的TiuchEvent,Starling只有一個TouchEvent.TOUCH,而不像native有分TouchEvent.TOUCH_BEGIN、TouchEvent.TOUCH_MOVE、TouchEvent.TOUCH_END等等。除此之外,整個Touch的概念是一樣的。

Starling裡面,當DisplayObject與滑鼠或手指產生互動時,就會發出TouchEvent.Touch。而這時候Starling會產生Touch物件來記錄滑鼠或手指的"點",而每個點依照它與DisplayObject互動的狀況可分為不同的TouchPhase:點下去為TouchPhase.BEGAN,放開為TouchPhase.ENDED,經過時為TouchPhase.HOVER,停住不動為TouchPhase.STATIONARY。用法是DisplayObject監聽TouchEvent.TOUCH,然後在event handler部分,假設我們接收到e為TouchEvent,可使用e.getTouch()來取得滑鼠或第一點的Touch,若需要偵測多點則使用e.getTouches()取得一個Touch Vector。可以在e.getTouch()的第二個參數線定要取得的TouchPhase,也可以取得後再從touch.phase來判斷。

我們來寫個練習,使用Image代替上個範例的Button,利用TouchEvent做出Mouse Over與Mouse Out的效果:

publicclassGame4extendsSprite
{
privatevar _container:Sprite;
privatevar _msgText:TextField;
privatevar _btnTexture:Texture;
privatevar _btnDownTexture:Texture;
privatevar _btnHoverTexture:Texture;
[Embed(source ="/assets/btnBg.png")]//embed Button一般狀態的圖
privatestaticconstBtnBitmap:Class;
[Embed(source ="/assets/btnDownBg.png")]//embed Button壓下的圖
privatestaticconstBtnDownBitmap:Class;
[Embed(source ="/assets/btnHoverBg.png")]//embed Button Hover(Mouse Over)的圖
privatestaticconstBtnHoverBitmap:Class;

publicfunctionGame4()
{
super();
addEventListener(Event.ADDED_TO_STAGE, init);
}

privatefunction init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

_container =newSprite();
addChild(_container);
addChild(newStats());
var menu:Sprite=newSprite();
menu.x =100;
menu.y =30;
_container.addChild(menu);
_msgText =newTextField(300,20,"No Button Triggered.","Arial",14,0xFF0000,true);
_msgText.x =100;
_msgText.y =80;
_msgText.hAlign =HAlign.LEFT;
_container.addChild(_msgText);

_btnTexture =Texture.fromBitmap(newBtnBitmap());//Button一般狀態的Texture
_btnDownTexture =Texture.fromBitmap(newBtnDownBitmap());//Button壓下的Texture
_btnHoverTexture =Texture.fromBitmap(newBtnHoverBitmap());//Button Hover(Mouse Over)的Texture
var btnTexts:Vector.<string>=newVector.<string>();
btnTexts.push("About");
btnTexts.push("Works");
btnTexts.push("Video");
btnTexts.push("Contact");
var btnNum:uint= btnTexts.length;
var button:Image;//改用Image來當Button
for(var i:int=0; i < btnNum; i++)
{
button =newImage(_btnTexture);
button.x = i *150;
button.name ="btn"+ btnTexts[i];
menu.addChild(button);
}

menu.addEventListener(TouchEvent.TOUCH, onTouch);//TouchEvent預設會bubble,所以menu加監聽就可以了
}

privatefunction onTouch(e:TouchEvent):void
{
var touch:Touch;//滑鼠或手指產生的Touch
var target:Image=Image(e.target);//真正發出事件的Image

touch = e.getTouch(this,TouchPhase.BEGAN);//針對BEGAN處理
if(touch)
{
target.texture = _btnDownTexture;//換上壓下的texture
_msgText.text = target.name +" began!";//顯示訊息
return;
}

touch = e.getTouch(this,TouchPhase.ENDED);//針對ENDED處理
if(touch)
{
target.texture = _btnTexture;//換上一般狀態的Texture
if(touch.tapCount ==2)//使用touch.tapCount可知道短時間內點了幾次
{
_msgText.text = target.name +" double click(tab)!";//連點兩次為double click(tab)
}else{
_msgText.text = target.name +" end!";//單點的訊息
}
return;
}

touch = e.getTouch(this,TouchPhase.MOVED);//針對MOVE處理
if(touch)
{
target.texture = _btnHoverTexture;//換上Hover的Texture
_msgText.text = target.name +" move!";//顯示訊息
return;
}

touch = e.getTouch(this,TouchPhase.HOVER);//針對HOVER處理
if(touch)
{
target.texture = _btnHoverTexture;//換上Hover的Texture
_msgText.text = target.name +" hover!";//顯示訊息
return;
}

touch = e.getTouch(this);//偵測Mouse Out的方法,有事件發生但抓不到Touch,代表Mouse Out
if(touch ==null)
target.texture = _btnTexture;
_msgText.text = target.name +" out!";
return;
}
}
}

以上的程式碼應該很直覺,註解也都附上了。主要是使用e.getTouch()的第二個參數限定我們取到的TouchPhase,然後去做相對應的處理。第一個則是一個DisplayObject,說是要設定touch座標系參考的物件用的,不過Touch裡並沒有local座標的資訊,所以我看不出丟不一樣的DisplayObject有甚麼差別。touch.tapCount可以計算出這個Touch短時間內tap了幾次,所以可以用來做double click等效果。最後是Mouse Out,參考了Starling作者在論壇的回覆,當滑鼠離開DisplayObject時會發出一次TouchEvent,但不帶Touch。根據這個詭異的規則,我們就可以偵測當touch == null時就是Mouse Out。實際測試發現,當滑鼠離開一個物件確實會觸發這個狀態,但若滑鼠又很快進入其他物件的話,則可能不會有這個狀態。所以只能等看看作者會不會去修復這個問題了。Demo如下:

一起來玩鳥 Starling Framework(4)TouchEvent,Touch,以及TouchPhase的更多相关文章

  1. 一起來玩鳥 Starling Framework 簡介

    開場 Starling Framework是一套Flash 2D遊戲開發"工具",是使用Flash最新的Stage3D API建構出來的一套Framework.最大優點在於使用GP ...

  2. 一起來玩鳥 Starling Framework(5)Multi-Touch

    這篇來談談Starling的Multi-Touch.前一篇也提到,Multi-Touch一樣是監聽TouchEvent.TOUCH,然後由TouchEvent的e.getTouches()取回多點的資 ...

  3. 一起來玩鳥 Starling Framework(2)效能測試以及Image與Texture

    上一篇我們放了一個Quad與TextField在舞台上慢慢轉.眼尖的可能會發現轉起來邊緣有點鋸齒,這可以透過設定Starling的反鋸齒來解決,在Main.as裡,新增了_starling之後,可以加 ...

  4. 一起來玩鳥 Starling Framework(1)一定要的Hello World!

    雖然已經一堆Hello World的介紹文章跟影片了,但中文資料畢竟是比較少,所以不能免俗的來一篇中文版Hello World.首先開啟一個AS3.0專案,fps不用客氣,設為60,Starling很 ...

  5. 一起來玩鳥 Starling Framework(7)MovieClip

    承上一篇,我們接著來講最後一個IAnimatable類別,MovieClip.Starling的MovieClip跟native的MovieClip不太一樣,它只能接收一個Vector.<Tex ...

  6. 一起來玩鳥 Starling Framework(9)Particle

    最後,來看看Starling裡一個很炫的功能:Particle.Particle屬於extension,所以要另外下載檔案:Starling-Extension-Particle-System.下載之 ...

  7. 一起來玩鳥 Starling Framework(6)Juggler、Tween、以及DelayCall

    這篇開始來講Starling裡的Animation.Juggle是個簡單的Class,用來控制動畫的進行.他負責管理經由add()加進來的實現IAnimatable介面的物件,然後當Juggler的a ...

  8. 一起來玩鳥 Starling Framework(3)Button!

    週末夜來介紹個簡單的DisplayObject就好.不論是在電腦上或行動裝置上,跟使用者互動次數最多的,大概就是按鈕了.因此,Starling有個Button類別,來做出這個常用的互動元件. 同樣是因 ...

  9. 一起來玩鳥 Starling Framework(8)BitmapFont

    所謂BitmapFont,就是事先將我們會用到的字型,會用到的字,輸出成一張圖片,類似Sprite sheet,以及一個xml格式的Data file,然後我們一次將這文字圖片轉成Texture,up ...

随机推荐

  1. python3 匿名函数,map/reduce/filter等函数结合应用

    匿名函数就是不需要显式的指定函数 # 平方函数 def func1(x): return x**2 print(func1) # 平方函数匿名函数写法 func2=lambda x:x**2 prin ...

  2. eclipse启动几秒后报错 (一闪而过)

    eclipse启动报错,让查看.metadata/.log日志   1 !SESSION 2013-09-23 17:28:28.484 ------------------------------- ...

  3. win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!

    win7或win2008系统中,出现[已停止工作,联机检查解决方案并关闭该程序,关闭程序]解决方法! 经过摸索,点击[控制面板]-[操作中心]-[更改操作中心设置]-[问题报告设置]-[从不检查解决方 ...

  4. jquery事件之select选中事件

    根据select下拉列表选中的不同选项执行不同的方法,工作中经常会用到,这里就要用到Jquery的select选中事件 这里给select加一个叫label_id的id,然后通过id选择器找到这个节点 ...

  5. 5分钟在Mac上从0配置安装laravel5.5

    1.安装包管理工具homebrew ,相当于ubuntu的apt-get 在iTerm命令行输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.gi ...

  6. 正则表达式筛选出jpg、png的图片url

    有些字符串也不是富文本,也不是带标准标签的图片地址和文字.想筛选出所有图片或地址怎么办呢.话不多说直接上带码. private static void reg() { // TODO Auto-gen ...

  7. C# base64获取图片后缀

    由于业务需要,使用的微服务,然后做的上传文件操作. 但是有个问题就是,如果上传的是图片,之前为了图省事儿,直接写后缀jpg,但是人总是要进步的嘛,然后抽空就找了个. 首先微服务相关就不介绍了,直接从引 ...

  8. 安装tomcat7.0.82

    下载安装tomcat mkdir /tools cd /tools wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.82/bin/ap ...

  9. php判断检测一个数组里有没有重复的值

    php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...

  10. 【转】Python unittest数据驱动工具:DDT

    背景 python 的unittest 没有自带数据驱动功能. 所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成. DDT是 “Data-Driven Tests”的缩写 ...