2011-10-11 8 views
8

Ho un Movie Clip che contiene una bitmap e non voglio aumentare l'area attiva. Capisco di poter aggiungere una forma trasparente dietro di esso, ma questo deve essere compilato in aria per iOS e non voglio causare ridisegni inutili.AS3: definizione dell'area colpita

C'è un modo per definire un rettangolo come l'area attiva o un'altra soluzione, forse?

risposta

15

C'è un campo hitArea speciale a tale scopo.

const MOUSE_ZONE_SIZE:Number = 10; 
    const hitArea:Sprite = new Sprite() 
    hitArea.graphics.beginFill(0xFFFFFF); 
    hitArea.graphics.drawRect(-MOUSE_ZONE_SIZE, -MOUSE_ZONE_SIZE, MOUSE_ZONE_SIZE* 2, MOUSE_ZONE_SIZE* 2); 
    hitArea.mouseEnabled = false; 
    hitArea.visible = false; 
    hitArea.x = bitmap.x 
    hitArea.y = bitmap.y 
    bitmap.hitArea = hitArea; 
    addChild(bitmap); 
    addChild(hitArea); 

Purtroppo, anche se si ignora hitTest * Funzione di InteractiveObject che non saranno utilizzati per mouse-eventi dispacciamento :(Se qualcuno sa come forzare Flash per utilizzare i metodi sostituiti - Mi piacerebbe sapere troppo.

+0

Quindi non funziona con un ascoltatore MouseEvent? Inoltre, non si ridisegna questo aspetto perché in realtà riempiamo il rettangolo e lo trattiamo come una bitmap? –

+1

hitArea funziona correttamente con gli eventi del mouse. I problemi sono venuti con metodi hitTest * alternativi - overrinding. Quindi non preoccuparti e usa hitArea. Rectangle (hitArea) è invisibile quindi non dovrebbe essere disegnato. Ma non sono sicuro di come Air calcola i colpi internamente - in caso di fortuna basta controllare il rect. –

3

Si potrebbe anche creare un pulsante con Bitmap al suo interno quindi definire l'hitArea.Infatti fa la stessa cosa che ha fatto Ilya nel codice.Tuttavia quando si aggiunge la nuova istanza del pulsante allo stage si sarà in grado di applicare MouseEventi ad esso

Belle immagini :)

Create the button symbol

Create a new key frame in the hitArea

Draw the hit area

package{ 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class main extends MovieClip 
{ 
    public function main() 
    { 
     var btn:button = new button(); 
     btn.addEventListener(MouseEvent.CLICK, clicked); 
     this.addChild(btn); 
    } 

    private function clicked(e:MouseEvent):void{ 
     trace("Clicked"); 
    } 

} 
} 

Il problema è questo aumenterà la quantità di memoria e il potere di fare sul iOS quindi è davvero un cavallo un pezzo ... :(