PDA

Просмотр полной версии : движение мувика, созданного в классе, НЕ наследуемом от MovieClip


Kuruki
03.04.2008, 12:54
Приветствую Вас!
Не получается заставить двигаться мувик. Мувик создается в конструкторе класса Ball(здесь всё нормально, т.е. координаты задаются). Метод moveDown вызывается onEnterFrame(trace работает).
код класса(упрощенный):
class Ball {
public var speed:Number = 2;
public var ball_mc:MovieClip;
public function Ball() {
ball_mc = _root.attachMovie("ball", "b", 1);
ball_mc._x = 100;//в конструкторе это работает
ball_mc._y = 100;
moving();
}
public function moving():Void {
ball_mc.onEnterFrame = moveDown;
}
public function moveDown():Void {
ball_mc._y += speed;
trace("I'm move");//trace работает, мувик не движется...
}
}
На гл. временной диаграмме следующий код var b:Ball = new Ball;
А в библиотеке имеется мувик ball c одноименным идентификатором.
Знаю, что можно наследовать Ball от MovieClip, а потом просто аттачить мувик. Так работает, но мне очень не надо наследоваться от MovieClip.
Наверное вопрос уже подымался, но я не смог его кратко сформулировать в поиске.
Спасибо.

qazwsx
03.04.2008, 13:12
В этом случае по твоему что такое _x, _y клипа?

Kuruki
03.04.2008, 13:23
Не совсем понял твой вопрос.
_x и _y - это свойства мувика, отвечающие за его местоположение на сцене.

qazwsx
03.04.2008, 13:34
Во первых у ball_mc никогда не случается событие onEnterFrame во вторых функция moveDown и moving не видит ball_mc

Kuruki
03.04.2008, 13:41
Событие onEnterFrame у ball_mc случается как и положено(не веришь - протестируй).
А заставить их видеть мувик можно? Хотя бы намекни как, если долго объяснять.

iNils
03.04.2008, 13:47
import mx.utils.Delegate
class Ball {
public var speed:Number = 2;
public var ball_mc:MovieClip;
public function Ball (mcParent:MovieClip, depth:Number, obj:Object) {
if (depth == undefined) {
depth = mcParent.getNextHighestDepth ()
}
ball_mc = mcParent.attachMovie("ball", "b" + depth, depth, obj);
moving ();
}
public function moving ():Void {

ball_mc.onEnterFrame = Delegate.create (this, moveDown);
}
public function moveDown():Void {
ball_mc._y += speed;
trace("I'm move");//trace работает, мувик не движется...
}
}
new Ball (this, null, {_x:100, _y:100});

Kuruki
03.04.2008, 14:11
Ай спасиба, дарагой!
Я попой чуял, что здесь нужно импортировать "встроенные" классы, но ничего о них не знаю, кроме фильтров. Где вообще люди узнают про них, про их методы? Поиск опять же нужных результатов не дал.(искал "встроенные классы", может не то искал?).

chingachgoog
03.04.2008, 14:33
Ради интереса, не напишите вариант когда у вас работало? С наследованием.

Kuruki
03.04.2008, 15:29
Напишу. Безусловно код немного изменится.
В классе:
class Ball extends MovieClip {
public var speed:Number = 2;
public function Ball() {
_x = 100;
_y = 100;
moving();
}
public function moving():Void {
onEnterFrame = moveDown;
}
public function moveDown():Void {
_y += speed;
}
}
А на гл. временной диаграмме:
this.attachMovie("ball","ball_mc",1);
В библиотеке должен быть мувик с идентификатором "ball", а также в поле Class впишите Ball.

Obi
03.04.2008, 15:48
Ай спасиба, дарагой!
Я попой чуял, что здесь нужно импортировать "встроенные" классы, но ничего о них не знаю, кроме фильтров. Где вообще люди узнают про них, про их методы? Поиск опять же нужных результатов не дал.(искал "встроенные классы", может не то искал?).
F1 - > ActionScript 2.0 Language Reference -> ActionScript classes

chingachgoog
03.04.2008, 16:29
Ну и так работать будет, без всяких делегатов и наследования от мувиклипа:

class Ball {
public var speed = 2;
public var ball_mc
var _y=null
public function Ball() {
ball_mc = _root.attachMovie("ball", "b", 1);
ball_mc._x = 100;//в конструкторе это работает
ball_mc._y = 100;
ball_mc.speed=speed
moving();
}
public function moving() {
ball_mc.onEnterFrame = moveDown;
}
public function moveDown() {
_y += speed
}
}

iNils
03.04.2008, 16:32
Ну и так работать будет, без всяких делегатов и наследования от мувиклипа:Это может привести к путанице. Где ball_mc._x, а где _x. И прямой вызов moveDown () не даст результата, все равно нужен делегат и чем раньше человек поймет, тем лучше.

Kuruki
04.04.2008, 16:50
class Ball {
public var speed = 2;
public var ball_mc
var _y=null
public function Ball() {
ball_mc = _root.attachMovie("ball", "b", 1);
ball_mc._x = 100;//в конструкторе это работает
ball_mc._y = 100;
ball_mc.speed=speed
moving();
}
public function moving() {
ball_mc.onEnterFrame = moveDown;
}
public function moveDown() {
_y += speed
}
}
Хоть это не лучший пример кода(как я понял по словам iNils), я всеравно решил в нем разобраться.
После продолжительных размышлений до меня кажется дошло:
метод срабатывает для того, кто его вызвал. Если это так, то тогда вопрос: moveDown() - это метод класса Ball, экземпляром которого ball_mc НЕ является. Как так?ball_mc - это же MovieClip?
Или метод работает для всех у кого есть _y?
Прошу пояснить.
:taunt: Прошу не обращать внимание на ход моих мыслей. Вот вопрос:
Почему метод moveDown() срабатывает для ball_mc, т.е. меняет значение его свойства, а не экземпляра Ball? И так ли это?

iNils
04.04.2008, 17:00
Если это так, то тогда вопрос: moveDown() - это метод класса Ball, экземпляром которого ball_mc НЕ является. Как так?ball_mc - это же MovieClip?
Или метод работает для всех у кого есть _y?
не понял вопроса.

chingachgoog
04.04.2008, 17:28
Все просто, если записать этот код в AS1:


function Ball(){
this.ball_mc = _root.attachMovie("ball", "b", 1);
this.ball_mc._x = 100;
this.ball_mc._y = 100;
this.ball_mc.speed=this.speed
this.moving();
}

Ball.prototype.speed=2;

Ball.prototype.moveDown= function() {
trace(arguments.callee.par+" "+this)
this._y += this.speed
}
Ball.prototype.moveDown.par="оригинальная функция"

Ball.prototype.moving= function () {
this.ball_mc.onEnterFrame = this.moveDown;
}


Объектом активации функции Ball.prototype.moveDown будет являться мувиклип _root.b, следовательно на _root.b и указывает ссылка this в теле функции Ball.prototype.moveDown

Kuruki
04.04.2008, 18:04
Агааа. Значит в моем первом примере:
class Ball {
public var speed:Number = 2;
public var ball_mc:MovieClip;
public function Ball() {
ball_mc = _root.attachMovie("ball", "b", 1);
ball_mc._x = 100;//в конструкторе это работает
ball_mc._y = 100;
moving();
}
public function moving():Void {
ball_mc.onEnterFrame = moveDown;
}
public function moveDown():Void {
ball_mc._y += speed;
trace("I'm move");//trace работает, мувик не движется...
}
}
ball_mc пытался сослаться на свое свойство ball_mc._y(которого нет), да еще и прибавить к нему свойство speed(которого тоже нет).
А свойство var _y=null из твоего первого примера нужно для того, чтобы не ругался компилятор(мы к нему не обращаемся)
Спасибо