Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Движение персонажа


Автор: tihomir 26.2.2014, 13:53
Здравствуйте многоуважаемые Гуру!! У меня такая ситуация: есть персонаж(волк) он нарисован в двух символах 1 когда волк стоит(stopwolf) 2 когда волк шагает(gowolf), захотел я значит его научить ходить с помощью клавиш влево вправо, но так как я ещё зелен во флеше то он при запуске клипа открывает и первого и второго волка и ещё при движении оставляет шлейф в виде предыдущего нажатия(тоесть я нажал волк перескочил на новое место, но на предыдущем тоже остаётся символ волка) ,а мне хотелось чтобы он при нажатии клавиш влево вправо ходил а когда я отпускаю клавиши он останавливался(тоесть чтобы появлялся 1 символ), а получилась какая-то фигня) Подскажите пожалуйста как это реализовать и где у меня ошибки!!

вот код:
Код


var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var stopwolf1:Stopwolf = new Stopwolf();
addChild(stopwolf1);
stopwolf1.x = 250
stopwolf1.y = 680
var gowolf1:Gowolf = new Gowolf();
addChild(gowolf1);
gowolf1.x = 250
gowolf1.y = 680
var speed = 15;  
    gowolf1.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
 function fl_MoveInDirectionOfKey(event:Event)
  {
     if (leftPressed && !rightPressed) //если нажата только(!) левая клавиша - шагаем влево
     {
        gowolf1.x -= 5;
        gowolf1.gotoAndStop (2)
     }
     else if (rightPressed && !leftPressed) //если нажата только(!) правая клавиша - шагаем вправо
     {
        gowolf1.x += 5;
        gowolf1.gotoAndStop (2)
     }
     else // если не нажата ни одна из клавиш или нажаты обе одновременно - стоим
     {
        gowolf1.gotoAndStop (1)
     }
  }
 
    function fl_SetKeyPressed(event:KeyboardEvent):void
    {
       switch (event.keyCode)
       {
          case Keyboard.LEFT:
          {
             leftPressed = true;
             break;
          }
          case Keyboard.RIGHT:
          {
             rightPressed = true;
             break;
          }
       }
    }
 
    function fl_UnsetKeyPressed(event:KeyboardEvent):void
    {
       switch (event.keyCode)
       {
          case Keyboard.LEFT:
          {
             leftPressed = false;
             break;
          }
          case Keyboard.RIGHT:
          {
             rightPressed = false;
             break;
          }
       }
    }


Добавлено через 9 минут и 28 секунд
Даже не так, он постоянно выводит на сцену символ gowolf, и получается такая каша из волков 

Автор: tihomir 27.2.2014, 07:49
Пробовал удалять объекты со сцены с помощью removeChild 

Код

var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var stopwolf1:Stopwolf = new Stopwolf();
addChild(stopwolf1);
stopwolf1.x = 100
stopwolf1.y = 100
var gowolf1:Gowolf = new Gowolf();
addChild(gowolf1);
gowolf1.x = 100
gowolf1.y = 100
var gowolfleft1:Gowolfleft = new Gowolfleft();
addChild(gowolfleft1);
gowolfleft1.x = 100
gowolfleft1.y = 100
var speed = 30;  
gowolf1.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
gowolfleft1.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
stopwolf1.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
   stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
function fl_MoveInDirectionOfKey(event:Event)
 {
    if (leftPressed) //если нажата только(!) левая клавиша - шагаем влево
    {
        
       gowolfleft1.x -= speed;
       removeChild(stopwolf1);
    }
    else if (rightPressed) //если нажата только(!) правая клавиша - шагаем вправо
    {
       gowolf1.x += speed;
       removeChild(stopwolf1);
    }
    else // если не нажата ни одна из клавиш или нажаты обе одновременно - стоим
    {
       stopwolf1.gotoAndStop (1);
       removeChild(gowolf1);
    }
 }

   function fl_SetKeyPressed(event:KeyboardEvent):void
   {
      switch (event.keyCode)
      {
         case Keyboard.LEFT:
         {
            leftPressed = true;
            break;
         }
         case Keyboard.RIGHT:
         {
            rightPressed = true;
            break;
         }
      }
   }

   function fl_UnsetKeyPressed(event:KeyboardEvent):void
   {
      switch (event.keyCode)
      {
         case Keyboard.LEFT:
         {
            leftPressed = false;
            break;
         }
         case Keyboard.RIGHT:
         {
            rightPressed = false;
            break;
         }
      }
   }


При нажатии клавиш на сцене остаётся стоять только волк в спокойном состоянии а те двое исчезают. АааааАА что делать!?!?! 

Автор: SoWa 6.3.2014, 09:26
Чтобы не мучиться с постоянными добавлениями/удалениями символов на сцену я рекомендую создать MovieClip размером с волка, добавить в него обоих волков(стоящего и идущего), а потом управлять их видимостью (visible = true/false). И соответственно двигать MovieClip, в котором эти волки находятся.

Автор: tihomir 18.3.2014, 09:27
Объединил я их в один клип как вы и советовали:

Код

import flash.events.Event;

var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var wolf:Wo2 = new Wo2();
addChild(wolf);
wolf.x = stage ? stage.stageWidth / 2 : 400;
wolf.y = 100;
wolf.gotoAndPlay("st");

var speed:Number = 20;  
stage.addEventListener(KeyboardEvent.KEY_DOWN, go);
stage.addEventListener(KeyboardEvent.KEY_UP, st);
stage.addEventListener(Event.ENTER_FRAME, handlerEnterFrame);

function st(e:KeyboardEvent):void // функция отпущеных клавиш
{
    if (e.keyCode == Keyboard.LEFT ||e.keyCode == Keyboard.RIGHT)
    {
            wolf.gotoAndPlay("st");
            leftPressed = rightPressed = false;
    }
}    

function go(e:KeyboardEvent):void      
{
    if (e.keyCode==Keyboard.LEFT) //если нажата только(!) левая клавиша - шагаем влево
    {
        if(!leftPressed)
        {
            leftPressed = true;
            wolf.scaleX = -1;
            wolf.gotoAndPlay("go");
        }
    }
    if (e.keyCode==Keyboard.RIGHT)
    {
        if(!rightPressed)
        {
            rightPressed = true;
            wolf.scaleX = 1;
            wolf.gotoAndPlay("go");
        }
    }
}

function handlerEnterFrame(event:Event):void
{
    if (leftPressed) wolf.x -= speed;
    if (rightPressed) wolf.x += speed;
}



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

Автор: tihomir 18.3.2014, 09:56
У меня глутый вопрос) Как указать видимость части клипа. Допустим во этой ("go")?

Автор: f3hler 22.10.2014, 12:55
из постов выше не сильно понятно как устроен ваш мувиклип персонажа.
толи вы разделили анимацию по кадрам gotoAndPlay(1)
толи вы разграничили анимацию метками gotoAndPlay('go')

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)