PDA

Просмотр полной версии : [Box2D] 1180: Вызов предположительно неопределенного метода


fluffy
04.08.2012, 18:35
Всем привет. Недавно скачал демо видеокурса "Box2D. Basic" в 3 уроке которого возникла следующая проблема:
При добавлении импульса телу возникает ошибка "1180: Вызов предположительно неопределенного метода randomNumber."
Код:

var power:Number = 8;
body.ApplyImpulse(new b2Vec2(Math.cos(randomNumber(0, Math.PI * 2)) * power,
Math.sin(randomNumber(0, Math.PI * 2)) * power),
new b2Vec2(body.GetWorldCenter().x, body.GetWorldCenter().y));


Код полностью:

package
{
import Box2D.Collision.b2AABB;
import Box2D.Collision.Shapes.b2CircleDef;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2World;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.StatusEvent;
/**
* ...
* @author Oleg
*/
public class BallsGame extends GameScreen
{
//::::::::::::::ПЕРЕМЕННЫЕ::::::::::::::::

//Переменная мира (класс b2World)
private var _world:b2World;
private const RATIO: Number = 30;
private var _sprites:Vector.<Sprite> = new Vector.<Sprite>();
private var _bodies:Vector.<b2Body> = new Vector.<b2Body>();

//::::::::::::::::::BallsGame::::::::::::::::::::::::::::::::::::

public function BallsGame()
{
//Инициализация библиотеки Box2D с помощью функции box2dInit
box2dInit();
//Стены
createWalls();
//Создаем шарик
createRedCircle(randomInt(20,380),randomInt(20,430));// Функция randomInt (случайные числа)в диапазоне

this.graphics.beginFill(0x00ff00, 1);
this.graphics.drawRect(0, 0, 400, 450);
this.graphics.endFill();
addEventListener (MouseEvent.CLICK, onClick);
}

private function randomInt(min:Number, max:Number):int//Функция возвращает целое число
{
if (min > max) throw new Error ("Oops!");
// value (значение) представляет целое значение равное (Math*max)матем. числу * макс значение
var value:int = Math.random() * max;
if (value < min) value = min + min * Math.random();
//Функция возвращает значение value
return value;
}

// В параметрах координаты по x и по y
private function createRedCircle (x:Number, y:Number):void

{
var shapeDef:b2CircleDef = new b2CircleDef();// Переменная для определения фигуры (b2CircleDef - круглое тело)
shapeDef.radius = 15 / RATIO; //Радиус
shapeDef.density = 1; // Плотность = 1 потому что оно будет двигаться
shapeDef.friction = 0; //Сила трения = 0
shapeDef.restitution = 0.5;//Упругость

var bodyDef:b2BodyDef = new b2BodyDef(); // Определение тела
bodyDef.position.Set(x / RATIO, y / RATIO); //Позиция

var body:b2Body = _world.CreateBody (bodyDef);
body.CreateShape(shapeDef);
body.SetMassFromShapes();

var power:Number = 8;
body.ApplyImpulse(new b2Vec2(Math.cos(randomNumber(0, Math.PI * 2)) * power,
Math.sin(randomNumber(0, Math.PI * 2)) * power),
new b2Vec2(body.GetWorldCenter().x, body.GetWorldCenter().y));

var sprite: Sprite = new RedBall(); //Графическое отображения для круга
sprite.x = x;//Координаты
sprite.y = y;//Координаты

addChild(sprite);

_sprites.push(sprite);
_bodies.push(body);
}

//СОЗДАЕМ СТЕНЫ
private function createWalls():void
{
createBox(200, -5, 200, 5); // Верхняя стена
createBox(200, 455, 200, 5);// Нижняя стена
createBox( -5, 225, 5, 225);// Левая стена
createBox(405,225,5,225);// Правая стена
}

private function createBox(x:Number, y:Number, w:Number, h:Number):void
{
var shapeDef:b2PolygonDef = new b2PolygonDef();
shapeDef.density = 0;// Плотность (0 - не реагирует на столкновения)
shapeDef.restitution = 1;//Упругость (1)
shapeDef.SetAsBox(w, h);//Прямоугольник из центра

var bodyDef:b2BodyDef = new b2BodyDef(); //Определение тела(чтобы указать координаты телу)
bodyDef.position.Set(x / RATIO, y / RATIO); //position -физический вектор. метод set указывает координаты

// Создаем тело.// экземпляр _world/ вызываем метод CreateBody (Создать тело) в качестве параметров определение тела
var body:b2Body = _world.CreateBody(bodyDef);

body.CreateShape(shapeDef); //прикрепить вигуру
body.SetMassFromShapes();// автоматически присваевается масса

var sprite:Sprite = new Sprite(); // Создаем новый экземпляр Sprite
sprite.graphics.beginFill(0x000000);
sprite.graphics.drawRect(x - w, y - h, w * 2, h * 2);
sprite.graphics.endFill();

addChild(sprite); //Добавляем sprite в список отображения
}

// Инициализация переменной _world как новый класс мира
private function box2dInit():void
{
var aabb = new b2AABB();
aabb.lowerBound.Set ( -1000/RATIO, -1000/RATIO); //левый верхний угол
aabb.upperBound.Set ( 1000/RATIO, 1000/RATIO); //правый нижний угол

var gravity: b2Vec2 = new b2Vec2 (0, 0); // вектор по оси x и y

// Границы мира\гравитация\будут ли тела засыпать
_world = new b2World(aabb, gravity, false);
trace(_world.GetBodyCount());//сколько тел в мире

private function onClick (e:MouseEvent):void
{
dispatchEvent(new StatusEvent(StatusEvent.STATUS, false, false, "", "gotoMenu"));
}
override public function start(): void
{
addEventListener (Event.ENTER_FRAME, onLive);
}

override public function stop(): void
{
removeEventListener (Event.ENTER_FRAME, onLive);
}

private function onLive (e:Event):void
{
_world.Step (1 / 60, 10);
for (var i:Number = 0; i < _sprites.length; i++)
{
_sprites[i].x = _bodies[i].GetPosition().x*RATIO;
_sprites[i].y = _bodies[i].GetPosition().y*RATIO;
}
}
}

}

Зараннее спасибо.

caseyryan
04.08.2012, 20:04
Ну естественно, этого метода же нет в приведенном коде. Вместо него есть randomInt(). Его и нужно использовать:

var power:Number = 8;
body.ApplyImpulse(new b2Vec2(Math.cos(randomInt(0, Math.PI * 2)) * power,
Math.sin(randomInt(0, Math.PI * 2)) * power),
new b2Vec2(body.GetWorldCenter().x, body.GetWorldCenter().y));

fluffy
04.08.2012, 20:25
спасибо за помощь

strangedk
04.08.2012, 22:40
Блин, да выкиньте вы этот randomInt вместе с randomNumber всё равно минимум равен нулю.
Вместо
randomInt(0, Math.PI * 2)
пишите
Math.random() * Math.PI * 2