Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] 1180: Вызов предположительно неопределенного метода (http://www.flasher.ru/forum/showthread.php?t=182847)

fluffy 04.08.2012 18:35

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

Код AS3:

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));

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

Код AS3:

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(). Его и нужно использовать:
Код AS3:

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 всё равно минимум равен нулю.
Вместо
Код AS3:

randomInt(0, Math.PI * 2)

пишите
Код AS3:

Math.random() * Math.PI * 2



Часовой пояс GMT +4, время: 17:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.