Потянув тетиву [Flash as3] - PullRequest
       2

Потянув тетиву [Flash as3]

1 голос
/ 16 января 2011

В последнее время я выбрал некоторые сценарии действий и решил сделать из себя простую игру с луком и стрелами. До сих пор я заставил стрелу лететь дугообразным способом. Итак, на следующем этапе я делаю мой лук и могу на самом деле тянуть за ниточку.

До сих пор я думал, что нарисую лук в виде 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?
        }
    }

}

Обновление

Спасибо vvMINOvv и Slomojo, оба ответа мне помогли! В настоящее время у меня есть две линии, которые являются графикой, которую я перерисовываю, когда лук отодвинут.

Если кто-то еще захочет посмотреть, как я это сделал, вот черновик:

    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 ]

1 голос
/ 17 января 2011

Вы можете использовать класс рисования во флэш-памяти.Так что быстрый пример может выглядеть следующим образом.

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

Это нарисует линию от вершины лука к основанию и изогнет ее в направлении, где находится ваша мышь.Вы могли бы запустить этот код в функции, которая будет вызываться каждый раз, когда flash обновляет дисплей или что-то в этом роде, или при движении мыши.То, что clear() позволяет вам сделать, это ясно, что конкретная форма и ее перерисовка, которая, если сделать ее с достаточно быстрым интервалом, будет выглядеть как анимация

Надеюсь, это даст вам некоторое представление о том, что возможно

1 голос
/ 16 января 2011

На данном этапе лучше всего точно определить, как бы вы хотели взаимодействовать с луком.

В зависимости от масштаба рендеринга вам нужно будет только нарисовать тетиву так, чтобы она следовала за указателем мыши на mousedown, но ограничивалась вашими предпочтительными пределами.

На обратном пути лучше всего нарисовать строку в виде двух линий от любого конца лука до ограниченной позиции мыши.

Когда вы отпускаете лук, вам, вероятно, захочется нарисовать строку как одну кривую в заданной точке (возможно, когда тетива достигает плоскости), чтобы вы могли нарисовать упругую стадию струны движение. (что касается отдыха.)

Надеюсь, вы знакомы с твининг-движками, если нет, посмотрите на что-то вроде Desuades Motion Package или Tweensy. (Вы можете найти их на http://fluxdb.fluxusproject.org)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...