PDA

Просмотр полной версии : Непонятная ошибка


DimG
22.06.2007, 20:47
Привет. Чтобы потренироваться,решил создать "модель"(очень приблизительную) движения тела вокруг точки,являющейся источником поля(в данном случае - сила всемирного тяготения). При этом создал два класса - vector и rock. Первый определяет алгебраический вектор и его сумму. Второй отвечает за поведение самого "камня" - его движение и постоянное обновление его скорости и ускорения. Вот собственно сами классы:


package main
{
import main.vector;
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;

dynamic public class rock extends MovieClip
{
public static var X:Number=250; //координаты центра
public static var Y:Number=250; //тяжести
public static var MASS:Number = 300;//и его масса

public var _acceleration:vector = new vector(); //ускорение
public var _speed:vector = new vector(); //скоость


var rock_timer:Timer = new Timer(100,0);
public function rock()
{
this.x = 100; //начальные координаты
this.y = 100;
this._speed._x = 0; //начальная скорость
this._speed._y = 5;
this.acceleration._x=0; //-"- ускорение
this.acceleration._y=0;
rock_timer.addEventListener(TimerEvent.TIMER, update); // обработчик событий для таймера
rock_timer.start(); // запускаем таймер


}
public function update(e:TimerEvent) //обновление координат,скорости,ускорения иела
{
_speed = vector.sum(_speed,_acceleration); // - скорость
this.x += _speed._x;
this.y += _speed._y;
var vec:vector = new vector(X-x,Y-y);
var acc:Number = 0.000000067*MASS/(vec._x*vec._x+vec._y*vec._y); //модуль ускорения
if(vec._x*vec._x+vec._y*vec._y != 0) //высчитываем координаты ветора ускорения
{
if(vec._x==0)
{
_acceleration._x=0;
_acceleration._y = acc;
}
else if(vec._y==0)
{
_acceleration._y=0;
_acceleration._x = acc;
}
else
{
_acceleration._x = acc/Math.sqrt(vec._x*vec._x+vec._y*vec._y)*vec._x;
_acceleration._y = acc/Math.sqrt(vec._x*vec._x+vec._y*vec._y)*vec._y;
}
}
}

}

}



package main
{

public class vector
{
public var _x:Number;
public var _y:Number;
public function vector(setx:Number = 0, sety:Number = 0)
{
_x = setx;
_y = sety;

}
static public function sum(v1:vector,v2:vector):vector
{
return new vector(v1._x+v2._x,v1._y+v2._y);
}
}
}


синтаксических ошибок нет,однако в панели output вылетает сообщение:
TypeError: Error #1010: A term is undefined and has no properties.
at main::rock$iinit()
at flash.display::Sprite/flash.display:Sprite::constructChildren()
at flash.display::Sprite$iinit()
at flash.display::MovieClip$iinit()

В чес проблема? Заранее спасибо.

P.S. Сорри за громоздский код))

BigDan
22.06.2007, 20:52
ты обращаешься к несуществующиму объекту acceleration.

this.acceleration._x=0;
this.acceleration._y=0;

this._acceleration._x=0;
this._acceleration._y=0;

etc
22.06.2007, 20:54
Имена классов должны начинаться с прописной буквы.

з.Ы. А где свойство acceleration у класса?

DimG
22.06.2007, 21:00
СПАСИБО ОГРОМНОЕ!
насколько глупо))
а компилятор не выдал ошибки из-за с-ва dynamic, верно?

etc
22.06.2007, 21:03
dynamic — зло. Его применять нужно только там, где его применение действительно необходимо.