PDA

Просмотр полной версии : Вопрос про раскадровку


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

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
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
надо что-то типа такого чтоль?
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
kayn, в MovieClip функции currentFrame не существует, и создать ее не получится
Почему не получится?

i.o.
27.04.2010, 18:24
не заметил. ну в этом наверное и вся проблема)
Не думаю что только в этом.
Даже по-правильному переписанная конструкция:

dude.gotoAndStop(dude.сurrentFrame);

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

Добавлено через 43 секунды
Почему не получится?
А потому что это свойство

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
Кстати, раз уж тема все еще есть, почему dude.gotoAndPlay(5); может ставить на нужный кадр, но play не делать? Все stop убрала.
Когда запускаю dude.play(), работает, а вот в одной команде с goto почему-то нет.

mickfallout
27.04.2010, 18:46
может быть в пятом кадре забыли убрать stop?
У Вас есть разница при выполнении
dude.gotoAndPlay(5);
и
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
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
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)
dude.gotoAndPlay(a);
вызывается там же, т.е. каждый кадр. И в итоге на каждом следующем кадре человечек хочет проиграться, встать на следующий - а вы его бац, и снова
dude.gotoAndPlay(a);
и он вновь встаёт на кадр a. То есть он проигрывается, проблема в постоянном вызове gotoAndPlay

Котяра
27.04.2010, 21:06
mickfallout, дак там с большой буковки CurrentFrame прописано у автора...
наследие C#,C++ или Java наверное..хотя сомневаюсь))))

i.o.
28.04.2010, 01:11
наследие C#,C++ или Java наверное..хотя сомневаюсь))))
А мне так помнится это стиль Mirosoft. Они любят все переменные и функции с большой буквы писать ))

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