Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Движение вперёд назад (http://www.flasher.ru/forum/showthread.php?t=206731)

tihomir 27.02.2014 09:55

Попробовал я сделать так:
Код AS1/AS2:

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

Все объекты появляются на сцене при запуске и исчезают когда нажимаю клавиши. Что делать!?!?)

Wolsh 27.02.2014 11:29

Код AS3:

stopwolf1.visible = true;
gowolf1.visible = false;
gowolfleft1.visible = false;
function fl_MoveInDirectionOfKey(event:Event):void
{
        if (leftPressed) //если нажата только(!) левая клавиша - шагаем влево
        {
                if (rightPressed) // если нажаты обе одновременно - стоим
                {
                        stopwolf1.visible = true;
                        gowolf1.visible = false;
                        gowolfleft1.visible = false;
                        return; // прекращаем выполнение функции
                }
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = false;
                gowolfleft1.visible = true;
        }
        else if (rightPressed) //если нажата только(!) правая клавиша - шагаем вправо
        {
                gowolf1.x += speed;
                gowolfleft1.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = true;
                gowolfleft1.visible = false;
        }
        else // если не нажата ни одна из клавиш - стоим
        {
                stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;               
        }
}


КорДум 27.02.2014 11:46

Wolsh, что-то ты с дублированием и вложенностью переборщил =)
Код AS3:

function fl_MoveInDirectionOfKey(event:Event):void {
        if ((leftPressed && rightPressed) || !(leftPressed && rightPressed)) {
                stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;
        }
        else if (leftPressed) {
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = false;
                gowolfleft1.visible = true;
        }
        else {
                gowolf1.x += speed;
                gowolfleft1.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = true;
                gowolfleft1.visible = false;
        }
}

Плюс 30 для скорости, все же, многовато. И быть может Вы прислушаетесь к моему совету с объединением всех клипов анимации в один клип? Избавитесь от "смещаем все клипы вместе" и постоянной видимости-развидимости отдельных клипов. Кроме того, при переходе по кадрам, флеш автоматически удаляет ненужные уже клипы, что были в предыдущих кадрах. А у вас каждая анимация всегда на экране и проигрывается, хоть и скрыта.

tihomir 27.02.2014 13:12

И первый и второй вариант ошибок не выдаёт но чего то не реагирует на нажатие никак

Код:
Код AS3:

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):void {
        if ((leftPressed && rightPressed) || !(leftPressed && rightPressed))
        {
                stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;
        }
        else if (leftPressed) {
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = false;
                gowolfleft1.visible = true;
        }
        else {
                gowolf1.x += speed;
                gowolfleft1.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = true;
                gowolfleft1.visible = false;
        }
}
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;
          }
          }
        }


Wolsh 27.02.2014 13:39

С чего бы им реагировать, если при любом раскладе сработает только первый блок.
КорДум, моя то цель была помочь человеку понять логику. А то что ты написал... "если true или false стоим, а иначе двигаемся". Ну.. не знаю, надо подумать...

tihomir 27.02.2014 15:03

Попробовал так:
Код AS3:

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
stage.addEventListener(KeyboardEvent.KEY_DOWN, go)
function go(e:KeyboardEvent):void {     
if (e.keyCode==Keyboard.LEFT) {         
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = false;
                gowolfleft1.visible = true;
        }
if (e.keyCode==Keyboard.RIGHT) {         
gowolf1.x += speed;
gowolfleft1.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
stopwolf1.visible = false; // устанавливаем видимость клипов
gowolf1.visible = true;
gowolfleft1.visible = false;
}
else // если не нажата ни одна из клавиш - стоим
        {
                stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false
        }
}

Он зашевелился, но при запуске на сцене появляются все 3 объекта, и при движении влево движется stopwolf а не gowolfleft при движении вправо он шагает но при отпускании клавиш символ stopwolf не выводится, остаётся gowolf.

Добавлено через 17 часов 19 минут
Вот:
Код AS3:

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
gowolf1.visible = false;
var gowolfleft1:Gowolfleft = new Gowolfleft();
addChild(gowolfleft1);
gowolfleft1.x = 100
gowolfleft1.y = 100
gowolfleft1.visible = false;
var speed = 30
stage.addEventListener(KeyboardEvent.KEY_DOWN, go)
function go(e:KeyboardEvent):void {     
{
        if (e.keyCode==Keyboard.LEFT) //если нажата только(!) левая клавиша - шагаем влево
        {
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = false;
                gowolfleft1.visible = true;
                return;
        }
        else if (e.keyCode==Keyboard.RIGHT)
        {
                gowolf1.x += speed;
                gowolfleft1.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                gowolf1.visible = true;
                gowolfleft1.visible = false;
                return;
        }
 
        else // если не нажата ни одна из клавиш - стоим
        {
                stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;               
        }
}
}

Он зашагал и даже как надо, но при отпускании клавиш остаётся символ gowolf или gowolfleft а по идее надо stopwolf чтобы появлялся

Добавлено через 23 часа 18 минут
Ура Ура! ) Почти победил! Но вот только он шагать начинает как то странно, как бы с пробуксовкой, нажимаю например влево появляется символ gowolfleft, но передвигаться начинает он спустя примерно секунду, как это можно победить?

Вот код:
Код AS3:

var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var stopwolf1:Stopwolf = new Stopwolf();
addChild(stopwolf1);
stopwolf1.x = 100
stopwolf1.y = 100
var stopwolf2:Stopwolf = new Stopwolf();
addChild(stopwolf2);
stopwolf2.x = 100
stopwolf2.y = 100
stopwolf2.scaleX = -1; // стоящий волк отражен по горизонтали
stopwolf2.visible = false; // устанавливаем видимость клипов
var gowolf1:Gowolf = new Gowolf();
addChild(gowolf1);
gowolf1.x = 100
gowolf1.y = 100
gowolf1.visible = false; // устанавливаем видимость клипов
var gowolfleft1:Gowolf = new Gowolf();
addChild(gowolfleft1);
gowolfleft1.x = 100
gowolfleft1.y = 100
gowolfleft1.visible = false; // устанавливаем видимость клипов
gowolfleft1.scaleX = -1; // идущий волк вправо отражен по горизонтали
var speed = 30
stage.addEventListener(KeyboardEvent.KEY_DOWN, go);
stage.addEventListener(KeyboardEvent.KEY_UP, st);
 function st(e:KeyboardEvent):void // функция отпущеных клавиш
 {
        if (e.keyCode == Keyboard.LEFT)
        {
        stopwolf2.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;               
        }
                else if (e.keyCode == Keyboard.RIGHT)
                {
        stopwolf1.visible = true;
                gowolf1.visible = false;
                gowolfleft1.visible = false;               
        }
 }
function go(e:KeyboardEvent):void {     
{
        if (e.keyCode==Keyboard.LEFT) //если нажата только(!) левая клавиша - шагаем влево
        {
                gowolfleft1.x -= speed;
                gowolf1.x = stopwolf1.x = stopwolf2.x = gowolfleft1.x; // смещаем все клипы вместе
                stopwolf2.visible = false; // устанавливаем видимость клипов
                stopwolf1.visible = false;
                gowolf1.visible = false;
                gowolfleft1.visible = true;
                return;
        }
        else if (e.keyCode==Keyboard.RIGHT)
        {
                gowolf1.x += speed;
                gowolfleft1.x = stopwolf2.x = stopwolf1.x = gowolf1.x; // смещаем все клипы вместе
                stopwolf1.visible = false; // устанавливаем видимость клипов
                stopwolf2.visible = false;
                gowolf1.visible = true;
                gowolfleft1.visible = false;
                return;
        }
 
        }
}


tihomir 14.03.2014 15:50

Хотелось бы узнать) всё таки как то можно "пробуксовку" убрать?)

Wolsh 14.03.2014 16:11

1. Зачем Вам столько скобок?
2. Зачем Вам else, Вы думаете e.keyCode может быть одновременно и LEFT и RIGHT?
3. В коде нет пробуксовки. Правда, понять код уже решительно невозможно из-за удручающих названий переменных и абсолютного непонимания сколько там у Вас клипов и кто за что отвечает. Дайте нормальные имена без непонятных цифр и уберите из кода лишнее.

Добавлено через 4 часа 19 минут
Пробуксовка получается, потому что движение происходит только на событие нажатия клавиши.
Клавиатуры устроены так, что когда вы нажимаете клавишу, посылается событие. Затем полсекунды тишины, и если вы не отпустили клавиши, клавиатура начинает генерить событие нажатия этой клавиши с какой-то своей частотой. Это то, чем все мы пользуемся чтобы печатать линию -----------------------------------. Попробуйте и увидите свою "пробуксовку". Строго по вашему коду объект должен двигаться только тогда, когда пользователь нажал клавишу. Один раз на 30 пикселей. Нажал еще раз — еще 30 пикселей.

Wolsh 14.03.2014 20:59

Вложений: 2
Надо вешать движение на ентерфрейм. Вспомните, зачем у вас до сих пор болтаются два флага leftPressed и rightPressed?

goWolf.swf   (3.4 Кб)


Часовой пояс GMT +4, время: 02:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.