Форум 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=139293)

envy 27.04.2010 17:50

Вопрос про раскадровку
 
Задача в том, чтобы сделать покадровую анимацию движения человечка за мышкой. Решила создать мувиклип, и вместила покадрово все позы человечка (изначально были в формате png).
Высчитала угол, смещение, человечек плавно двигается куда надо, но когда стала делать анимацию по кадрам столкнулась с проблемой, что функция CurrentFrame что-то не работает. Возвращает значение Undefined. При этом GotoAndPlay делает goto, а играть не играет. Играет только play. Вызываю функции на EnterFrame, но даже такая конструция :
Код AS3:

function render(e:Event) { //
  dude.gotoAndStop(dude.CurrentFrame);               
 trace(dude.CurrentFrame);
}

(лишнее убрала) ничего не выдает. dude - экземпляр класса, муви клип, который я кинула на сцену.
Весь инет перерыла, помогите, пожалуйста!

derhab 27.04.2010 17:52

а что такое у вас CurrentFrame?

i.o. 27.04.2010 17:52

а что это за такая функция CurrentFrame ??

mickfallout 27.04.2010 17:53

Код AS3:

dude.gotoAndStop(dude.CurrentFrame);

и в чём смысл? просто stop() уже не модно?
не могу понять смысла программы, выкладывайте весь класс полностью чтоли...

i.o. 27.04.2010 17:54

"просто stop() уже не модно?"
+5))

kayn 27.04.2010 18:00

Возможно в момент вызова currentFrame(), точка воспроизведения еще не определена. Это можно исправить строкой gotoAndStop(1) сразу после появления мувика. Выложи весь код, не стесняйся.

mickfallout 27.04.2010 18:08

надо что-то типа такого чтоль?
Код AS3:

package  {
 
        import flash.display.*
        import flash.events.*
        public class Main extends Sprite {
                private var targetX:int;
                private var targetY:int;
                public function Main() {
                        super();
                        var sprite1:Sprite = new Sprite();
                        var back:Sprite = new Sprite()
                        addChild(back);
                        back.graphics.beginFill(0xF0F0F0);
                        back.graphics.drawRect(0, 0, stage.width, stage.height);
                        back.graphics.endFill()
                        sprite1.graphics.beginFill(0x000000, 1);
                        sprite1.graphics.drawRect(0, 0, 25, 25);
                        sprite1.graphics.endFill()
                        addChild(sprite1);
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                        function enterFrameHandler(event:Event):void
                        {
                                if ((sprite1.x != targetX) || (sprite1.y != targetY))
                                        sprite1.rotation += 1;//тут Вам надо делать что-то для анимации. например unit.nextFrame();
                                if (sprite1.x > targetX)
                                        sprite1.x--;
                                if (sprite1.x < targetX)
                                        sprite1.x++;
                                if (sprite1.y > targetY)
                                        sprite1.y--;
                                if (sprite1.y < targetY)
                                        sprite1.y++;
                        }
                        function moveHandler(event:MouseEvent):void
                        {
                                targetX = event.stageX;
                                targetY = event.stageY;
 
                        }
                }
        }
}


i.o. 27.04.2010 18:10

kayn, в MovieClip функции currentFrame не существует, и создать ее не получится

mickfallout 27.04.2010 18:16

откуда вы взяли что currentFrame - функция? только оговорка у топик стартера. в коде всё правильно, обращается как к свойству а не как к функции.

i.o. 27.04.2010 18:17

mickfallout, дак там с большой буковки CurrentFrame прописано у автора...

mickfallout 27.04.2010 18:19

не заметил. ну в этом наверное и вся проблема)

Psycho Tiger 27.04.2010 18:23

Цитата:

Сообщение от i.o. (Сообщение 904180)
kayn, в MovieClip функции currentFrame не существует, и создать ее не получится

Почему не получится?

i.o. 27.04.2010 18:24

Цитата:

Сообщение от mickfallout (Сообщение 904188)
не заметил. ну в этом наверное и вся проблема)

Не думаю что только в этом.
Даже по-правильному переписанная конструкция:
Код AS3:

dude.gotoAndStop(dude.сurrentFrame);

будет стоять на месте, если где то в недрах проекта не вызывать еще dude.play(), dude.gotoAndStop() или dude.gotoAndPlay()...

Добавлено через 43 секунды
Цитата:

Сообщение от Psycho Tiger (Сообщение 904191)
Почему не получится?

А потому что это свойство

derhab 27.04.2010 18:29

MovieClip класс динамический, поэтому при попытке обратится к несуществующему свойству CurrentFrame просто возвращается undefined, как и было у топикстартера в первом посте

envy 27.04.2010 18:33

О, майн гат, проблема и вправду в том, что я с большой буквы написала, хоть и читала в хэлпе, что это функция.
Лоханулась. А в начале gotoAndStop я от отчаянья написала )) Спасибо!

kayn 27.04.2010 18:34

Цитата из хелпа:
flash.display.MovieClip
public function get currentFrame()
Видно проблема в табуляции

envy 27.04.2010 18:42

Кстати, раз уж тема все еще есть, почему
Код AS3:

dude.gotoAndPlay(5);

может ставить на нужный кадр, но play не делать? Все stop убрала.
Когда запускаю
Код AS3:

dude.play()

, работает, а вот в одной команде с goto почему-то нет.

mickfallout 27.04.2010 18:46

может быть в пятом кадре забыли убрать stop?
У Вас есть разница при выполнении
Код AS3:

dude.gotoAndPlay(5);

и
Код AS3:

dude.gotoAndPlay(5);
dude.play();

?

envy 27.04.2010 18:50

Нет, разницы нет, оба варианта не работают, проигрывается если использовать ТОЛЬКО dude.play().
5 кадр для примера, stop() нет ни в одном кадре (

mickfallout 27.04.2010 18:53

вобще весь код в классе? может тогда выложите, чтоб на кофейной гуще не гадать?

envy 27.04.2010 18:56

Код AS3:

package {
 import flash.text.*;
 import flash.events.*;
 import flash.ui.*;
 import flash.utils.Timer;
 import flash.display.*;
  public class main_game extends MovieClip {
          public var manX, manY : int;
          public var speed = 3;
 
          //---------------------------------------
        public function main_game() {
 
 
        dude.stop();
 
 
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }
        //----------------------------------------
        private function onAddedToStage(event:Event) {
                this.stage.stageFocusRect = false;
            stage.focus = this;
 
                  stage.addEventListener(MouseEvent.CLICK, onClick);
 
        }
        //-------------------------
 
        //-----------------------------------------------
        function onClick(e:MouseEvent) { //нажатие кнопки - запомнили
                dude.stop();
                manX = e.stageX;
                manY = e.stageY; //запомнила координаты
                stage.addEventListener(Event.ENTER_FRAME, render)
        }
 
 
        //--------------------------------------------------       
 
 
        //-----------------------------------------------
        function render(e:Event) { //
                //************
                var moires1 =  [0, 22.6, 66.6, 111.6, 156.6, 202.6, 247.6, 294.6];
                var moires2 =  [22.5, 66.5, 111.5, 156.5, 202.5, 247.5, 294.5, 340.5];
              var radians = - Math.atan2(dude.y-manY, dude.x-manX);
                var degrees = radians*180/Math.PI+180;
                //trace (degrees);
                var angle = 1;
                var destX, destY :int;
                var a: String;
 
                for (var i=0; i<=moires1.length; ++i) {
                        if (degrees>=moires1[i] && degrees<=moires2[i]) {angle = i}
                        else if (degrees>340.5 && degrees<=360) {angle = 0 }
 
                }
                var j = 0;
                var offsetX = manX - dude.x;
                var offsetY = manY - dude.y;
                if (offsetX > 0) {destX = 1} else {destX = -1} //направление + или -
                if (offsetY > 0) {destY = 1} else {destY = -1}
 
                //
                graphics.lineStyle(0, 0)
                graphics.moveTo(dude.x, dude.y)
                graphics.lineTo(manX, manY);
                //
 
 
                /*trace("____________")
                trace("x=",dude.x, "mx=",manX, "offsetX = ", offsetX);
                trace("y=",dude.y, "mx=",manY, "offsety = ", offsetY);
                trace("____________")*/

 
                a = angle + "1";
                //trace(a);
 
                if (Math.abs(offsetX) > speed) {
                        dude.gotoAndPlay(a);
                        dude.play();
                        /*if (dude.currentLabel.charAt(1) == "7") {
                                dude.gotoAndPlay(a);
                                dude.play();
                        }*/

                        //trace(dude.currentLabel);
                        dude.x = dude.x + speed * destX; //переместили
                        offsetX = offsetX - speed * destX;
                }
 
                if (Math.abs(offsetY)> speed) {
                        dude.play();                       
                        dude.y = dude.y + speed * destY;
                        offsetY = offsetY - speed * destY;
                }
 
 
 
                //stage.removeEventListener(Event.ENTER_FRAME, render); 
                        }
        //--------------------------------------------------       
 
  }
}


Вот весь класс, он один

Psycho Tiger 27.04.2010 18:59

Цитата:

А потому что это свойство
Свойства CurrentFrame у MovieClip нету. currentFrame же можно всегда переопределить.

envy 27.04.2010 19:20

Точнее, он сначала доводит до нужной точки персонажа, а потом уже запускает его анимацию

BlooDHounD 27.04.2010 19:29

Psycho Tiger, и как вы переопределением свойства превратите его в метод?

Psycho Tiger 27.04.2010 20:15

Цитата:

Сообщение от BlooDHounD (Сообщение 904221)
Psycho Tiger, и как вы переопределением свойства превратите его в метод?

Пора брать отпуск мне, да, никак. А так хочется перегрузку =(

envy 27.04.2010 20:18

и все же, может, поможете? (

Psycho Tiger 27.04.2010 20:35

envy, у вас проблема в том что человечек не хочет на нужный кадр вставать, верно?
Вам что нужно, чтобы по клику человечек что сделал? Встал на своей временной шкале на нужный кадр из 360 или что?
В первом посте у вас проблема была в том, что вы currentFrame писали с большой буквы, как и gotoAndStop. Они пишутся с маленькой буквы, это важно.

envy 27.04.2010 20:52

нет, человечек встает на нужный кадр. И остается на нем, как будто я использовала gotoAndStop().
dude.gotoAndPlay(5); - все вроде правильно написала. Stop() нигде больше нет.

Psycho Tiger 27.04.2010 21:00

У вас тут дело вот в чем:
render вызывается каждый кадр (потому что повешен на ENTER_FRAME)
Код AS3:

dude.gotoAndPlay(a);

вызывается там же, т.е. каждый кадр. И в итоге на каждом следующем кадре человечек хочет проиграться, встать на следующий - а вы его бац, и снова
Код AS3:

dude.gotoAndPlay(a);

и он вновь встаёт на кадр a. То есть он проигрывается, проблема в постоянном вызове gotoAndPlay

Котяра 27.04.2010 21:06

Цитата:

Сообщение от i.o. (Сообщение 904187)
mickfallout, дак там с большой буковки CurrentFrame прописано у автора...

наследие C#,C++ или Java наверное..хотя сомневаюсь))))

i.o. 28.04.2010 01:11

Цитата:

Сообщение от Котяра (Сообщение 904257)
наследие C#,C++ или Java наверное..хотя сомневаюсь))))

А мне так помнится это стиль Mirosoft. Они любят все переменные и функции с большой буквы писать ))

envy 28.04.2010 09:30

Нет, это Delphi, там все равно с какой буквы писать )
Спасибо большое, в проблеме разобралась!


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

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