2011-01-16 5 views
1

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

До сих пор я полагал, что я бы нарисовал лук как 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? 
     } 
    } 

} 

Update

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); 
    } 

ответ

1

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

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

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

Надеется, что это дает вам немного перспективы на то, что можно

+0

Thx, я собираюсь дать понять. Я думаю, что это решило бы мою проблему :) – Michael

1

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

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

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

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

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

+0

Хорошего идея, это также перешло мне в голову, делая две линии, которые вытаскиваются из середины. Просто не знаю, как закодировать анимацию ... пока;) – Michael