拉弓弦[Flash as3]

时间:2011-01-16 19:59:09

标签: flash actionscript-3

我最近选择了一些动作脚本,我决定让自己成为一个简单的弓箭游戏。到目前为止,我已经使箭头以弧形方式飞行。所以接下来是我的弓,并能够实际拉弦。

到目前为止,我认为我会将弓画成MC并使用图形绘制字符串。 我现在应该拉弦了,我不知道如何从这里前进。任何建议将非常感激。

如果可能的话,只要给我一个指针,我想自己编码,我不是要求完成结果。

代码:

package  {

    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Stage;
    import flash.events.MouseEvent;


    public class bow extends MovieClip {
        var myStage:Stage;
        var bowString:Shape;
        var bowStringMc:MovieClip;

        public function bow(stageRef) {
            this.myStage = stageRef;

            myStage.addChild(this);
            this.x = myStage.stageWidth / 2;
            this.y = myStage.stageHeight / 2;

            this.drawBowstring();
        }

        public function drawBowstring() {
            bowString   = new Shape();
            bowStringMc = new MovieClip();

            bowStringMc.addChild(bowString);
            myStage.addChild(bowStringMc);

            bowString.graphics.lineStyle(2, 0x000000);
            bowString.graphics.curveTo(-50,this.height/2,0,(this.height-10));

            bowStringMc.x = this.x-1;
            bowStringMc.y = this.y - this.height / 2 + 5;

            bowStringMc.addEventListener(MouseEvent.MOUSE_DOWN, pullBowstring);
        }

        public function pullBowstring(e:MouseEvent) {
            // Have to start redrawing the graphic i gess but how?
        }
    }

}

更新

Thx vvMINOvv& Slomojo,这两个答案对我有帮助! 我现在有2条线,这些图形是我在重新拉回弓时重绘的。

如果有人想看看我是怎么做的,那就是一个粗略的剪辑:

    public function drawBowstring() {
        bowStringTop    = new Shape();
        bowStringBottom = new Shape();
        bowStringMc     = new MovieClip();

        bowStringMc.addChild(bowStringTop);
        bowStringMc.addChild(bowStringBottom);

        myStage.addChild(bowStringMc);

        bowStringTop.graphics.lineStyle(2, 0x000000);
        bowStringTop.graphics.moveTo(0, 0);
        bowStringTop.graphics.lineTo(0, this.height / 2);

        bowStringBottom.graphics.lineStyle(2, 0x000000);
        bowStringBottom.graphics.moveTo(0, this.height-10);
        bowStringBottom.graphics.lineTo(0, this.height / 2);

        bowStringMc.x = this.x-1;
        bowStringMc.y = this.y - this.height / 2 + 5;

        this.hand.addEventListener(MouseEvent.MOUSE_DOWN, pullBowstring);
    }

    public function pullBowstring(e:MouseEvent) {
        myStage.addEventListener(MouseEvent.MOUSE_MOVE, reDrawBowstring);
        myStage.addEventListener(MouseEvent.MOUSE_UP, releaseBowstring);
    }

    public function releaseBowstring(e:MouseEvent) {
        myStage.removeEventListener(MouseEvent.MOUSE_MOVE, reDrawBowstring);
        myStage.removeEventListener(MouseEvent.MOUSE_UP, releaseBowstring);
    }

    public function reDrawBowstring(e:MouseEvent) {
        if (this.hand.x < -18 || this.hand.x > 0) {
            this.releaseBowstring(e);
        }
        this.hand.x = mouseX;
        this.arrow.x = mouseX;

        bowStringTop.graphics.clear();
        bowStringBottom.graphics.clear();

        bowStringTop.graphics.lineStyle(2, 0x000000);
        bowStringTop.graphics.moveTo(0, 0);
        bowStringTop.graphics.lineTo(this.hand.x, (this.height / 2)-5);

        bowStringBottom.graphics.lineStyle(2, 0x000000);
        bowStringBottom.graphics.moveTo(0, this.height-10);
        bowStringBottom.graphics.lineTo(this.hand.x, (this.height / 2)-5);
    }

2 个答案:

答案 0 :(得分:1)

此阶段最好的事情是准确定义你想如何与弓箭互动。

根据渲染比例,您只需要绘制弓弦,使其跟随mousedown上的鼠标指针,但约束到您的首选限制。

在拉回时,你最好将琴弦从琴弓的任一端拉到两个约束的鼠标位置。

当你释放弓时,你可能想要在给定的点(可能是弓弦到达平点时)将弦作为单曲线绘制,这样你就可以绘制弦的弹性阶段运动。 (因为它休息了。)

希望您熟悉补间引擎,如果没有,请查看Desuades Motion Package或Tweensy等内容。 (您可以在http://fluxdb.fluxusproject.org

找到它们

答案 1 :(得分:1)

您可以在flash中使用绘图类。所以一个简单的例子可能看起来像这样。

myString.graphics.clear();
myString.graphics.lineStyle(1);
myString.graphics.moveTo(bowTopX,bowTopY);
myString.graphics.curveTo(mouseX,mouseY,bowBottomX,bowBottomY);

这会从弓的顶部到底部画一条线,并沿着鼠标所在的方向弯曲。你可以在一个函数中运行该代码,每次flash刷新显示器或鼠标移动时都会调用该函数。 clear()允许你做的是清楚特定的形状并重新绘制它,如果以足够快的间隔完成它将看起来像它的动画

希望这能让您对可能的内容有所了解