0

不透明度を変更して、カスタムカーソルをゆっくりと光らせようとしています。問題は、それが機能していることを確認できる唯一の方法はwhile、無限ループを作成するを作成することです。カーソルが不透明度0から不透明度1に変わり、上下に移動するように進める方法はありますか。これが現時点での私のコードです...私は別の方法を見つけようとしていますが、他の方法は実際には見当たりません。

public var Alpha:Number = 1;
public var sense:String = "down";

private function thisMouseOver(e:MouseEvent):void{


        Mouse.hide();

        //draws the cursor
        drawCursor();

        //Animates cursor
        if(!this.animationStarted)
        {
            this.animationStarted = true;
            animateCursor();
        }


    }

private function animateCursor():void{
        while(this.animationStarted)
        {
            if(this.Alpha==1)
            {
                this.sense = "down";
            }
            else if(this.Alpha == 0)
            {
                this.sense = "up";
            }

            if(this.sense == "up")
                this.Alpha += 0.1;
            else
                this.Alpha -= 0.1;

            this.graphics.beginFill(0x333333);
            this.graphics.drawRect(0,0,25,25);
            this.graphics.endFill();

            drawCursor();
        }
    }

private function drawCursor():void{
        this.graphics.beginFill(0x00BFFF,this.Alpha);
        //top left
        this.graphics.drawRect(0,0,6,2);
        //bottom left
        this.graphics.drawRect(0,23,6,2);
        //left top
        this.graphics.drawRect(0,0,2,6);
        //left bottom
        this.graphics.drawRect(0,19,2,6);
        //top righ
        this.graphics.drawRect(19,0,6,2);
        //right top
        this.graphics.drawRect(23,0,2,6);
        //bottom right
        this.graphics.drawRect(19,23,6,2);
        //right bottom
        this.graphics.drawRect(23,19,2,6);
        this.graphics.endFill();

    }
4

3 に答える 3

0

無限ループの問題を回避する 1 つの方法は、animateCursor コードを ENTER_FRAME イベント ハンドラー内に配置することです。

外観は次のとおりです。http://www.swfcabin.com/open/1360303185

(あなたのカスタム カーソル形状は素晴らしいですね ;)

MiniBuilder で作り直したコードは次のとおりです (関数はアルファベット順に並べられています)。

package com.glowingcursor {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.ui.*;

public class Application extends Sprite {
    private var cursor:Sprite;
    private var cursorOffset:Point;
    private var sense:Boolean;

    public function 
    Application() {
        addEventListener( Event.ADDED_TO_STAGE, onAdded );
    }

    private function 
    animateCursor( e:Event ):void {
        if ( cursor.alpha >= 1 ) sense = false;
        else if ( cursor.alpha <= 0.2 ) sense = true;

        if( sense ) cursor.alpha += 0.08;
        else cursor.alpha -= 0.08;
    }

    private function
    hideCursor( e:MouseEvent ):void {
        Mouse.show();
        removeChild( cursor );
        removeEventListener( Event.ENTER_FRAME, moveCursor );
        removeEventListener( Event.ENTER_FRAME, animateCursor );
    }

    private function
    initCursor():void {
        cursor = new Sprite();
        cursor.graphics.beginFill( 0xff0000 );
        cursor.graphics.drawRect(  0,  0, 6, 2 ); // top left
        cursor.graphics.drawRect(  0, 23, 6, 2 ); // bottom left
        cursor.graphics.drawRect(  0,  0, 2, 6 ); // left top
        cursor.graphics.drawRect(  0, 19, 2, 6 ); // left bottom
        cursor.graphics.drawRect( 19,  0, 6, 2 ); // top right
        cursor.graphics.drawRect( 23,  0, 2, 6 ); // right top
        cursor.graphics.drawRect( 19, 23, 6, 2 ); // bottom right
        cursor.graphics.drawRect( 23, 19, 2, 6 ); // right bottom
        cursor.graphics.endFill();

        // So InteractiveObjects react to the custom cursor properly
        cursor.mouseEnabled = false;

        // For cursor centering
        cursorOffset = new Point( cursor.width / 2, cursor.height / 2 );
    }

    private function 
    moveCursor( e:Event ):void {
        cursor.x = mouseX - cursorOffset.x;
        cursor.y = mouseY - cursorOffset.y;
    }

    private function
    onAdded( e:Event ):void {
        initCursor();
        showCursor();
    }

    private function
    showCursor():void {
        Mouse.hide();
        addChild( cursor );
        addEventListener( Event.ENTER_FRAME, moveCursor );
        addEventListener( Event.ENTER_FRAME, animateCursor );
    }
}
}
于 2013-02-08T07:42:36.310 に答える
0

animateCursor のコードを別のメソッド内に配置し、Timer を使用してそのメソッドを呼び出すことができます。このようにして、カーソルが点滅する速度とタイミングを制御できます。

Timer timer = new Timer( 25, 0 );

private function animateCursor():void
{
    timer.addEventListener( TimerEvent.TIMER, timerHandler );
    timer.start()
}
private function timerListener( e:TimerEvent ):void
{
    if(this.Alpha==1)
    {
       this.sense = "down";
    }
    else if(this.Alpha == 0)
    {
       this.sense = "up";
    }

    if(this.sense == "up")
       this.Alpha += 0.1;
    else
       this.Alpha -= 0.1;

    this.graphics.beginFill(0x333333);
    this.graphics.drawRect(0,0,25,25);
    this.graphics.endFill();

    drawCursor();
}

また、アルファ条件を this.Alpha == 0 から this.Alpha <= 0 に変更することをお勧めします。これは、アルファを変更する量を、常に 0 になるとは限らない値に変更することを選択できるためです。 1.

于 2013-02-08T17:31:04.797 に答える
0

最良の方法は tweener を使用することです。私のお気に入りはGTweenです。

private function test():void
{
    var shape:Shape = new Shape();
    addChild(shape);

    shape.graphics.beginFill(0xFF0000, 1);
    shape.graphics.drawCircle(100, 100, 50);
    shape.graphics.endFill();

    var tween:GTween = new GTween(shape, 1, {alpha:0}, {reflect:true, repeatCount:2});
    tween.nextTween = tween;

}

tween.paused = true/falseトゥイーンを再生 ()/停止 () するために使用します。

tweener を使用しない別のバリアントがあります (ただし、コードがより明確で読みやすく、リソースのコストが少ないため、tween を使用することをお勧めします)。これは、while ループの代わりに EnterFrame イベント アプローチを使用します - メソッドから while ループを削除し、リスナーanimateCursor()を追加しますコールEvent.ENTER_FRAMEポイントで:animateCursor();

if(!this.animationStarted)
{
     this.animationStarted = true;
     addEventListener(Event.ENTER_FRAME, onEnterFrame);
} 

private function onEnterFrame():void
{
    animateCursor();
}
于 2013-02-04T14:14:29.147 に答える