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. Сорри за громоздский код))
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. Сорри за громоздский код))