|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2010
Сообщений: 120
|
Максимальное число объектов на сцене
Добрый день. Собственно столкнулся с проблемой во flash c максимальным количество объектов на сцене.
В цикле должно создаваться 45 x 45 = 2025 объектов, private function createBlock():void { for (var blockX:int = 0; blockX < 45; blockX++) { for (var blockY:int = 0; blockY < 45; blockY++) { if (_arrLevel1[blockX][blockY] != 0) { _type = _arrLevel1[blockX][blockY]; _block = new Block(this, new Point(blockX, blockY), _type); } } } } TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". at Box2D.Collision::b2BroadPhase/CreateProxy() at Box2D.Collision.Shapes::b2Shape/CreateProxy() at Box2D.Dynamics::b2Body/CreateShape() at objects::Block() at levels::Level/createBlock() 2. Обязательно ли границы игровой карты, в моем случае (2880 x 2880) строго должны соответствовать границам в физическом мире или же границы физического мира можно сделать намного больше? |
|
|||||
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Цитата:
Вообще, что-то странное этот цикл творит. Нужно логику цикла перебрать, тут проблема явно не в бокс2д. |
|
|||||
Регистрация: Jun 2010
Сообщений: 120
|
Цитата:
Добавлено через 7 часов 11 минут Не стал плодить очередную тему. Решил здесь спросить. Никак не могу понять, как работает метод SetAsBox в Box2D. Разбирал и примеры и мануалы читал, но так и не догнал. Класс для создания динамического тела private static const RATIO:Number = 30; // 1 метр = 30 пикселей private static const BLOCK_HALF:Number = 16; // Половина размера блока var location:Point = new Point(320, 64); var block:MovieClip = new BlockMovie(); // блок у которого width = 32 и height = 32 block.gotoAndStop(1); parent.addChild(block); var blockShapeDef:b2PolygonDef = new b2PolygonDef(); blockShapeDef.SetAsBox(BLOCK_HALF / RATIO, BLOCK_HALF / RATIO); blockShapeDef.density = 1; // плотность blockShapeDef.friction = 0; blockShapeDef.restitution = 0.45; var blockBodyDef:b2BodyDef = new b2BodyDef(); blockBodyDef.position.Set(location.x / RATIO, location.y / RATIO); var blockBody:b2Body = PhysiVals.world.CreateBody(blockBodyDef); blockBody.CreateShape(blockShapeDef); blockBody.SetMassFromShapes(); Класс для создания статического тела private static const RATIO:Number = 30; // 1 метр = 30 пикселей private static const BLOCK_HALF:Number = 32; // Половина высоты и ширины блока var location:Point = new Point(320, 256); var blockSprite:Sprite = new Sprite(); blockSprite.graphics.beginFill(0x28990E); blockSprite.graphics.drawRect(0, 0, 64, 64); // блок у которого ширина = 64 и высота = 64 blockSprite.graphics.endFill(); parent.addChild(blockSprite); var blockShapeDef:b2PolygonDef = new b2PolygonDef(); blockShapeDef.SetAsBox(BLOCK_HALF / RATIO , BLOCK_HALF / RATIO); blockShapeDef.density = 0; // плотность blockShapeDef.friction = 0; blockShapeDef.restitution = 0; var blockBodyDef:b2BodyDef = new b2BodyDef(); blockBodyDef.position.Set(location.x / RATIO, location.y / RATIO); var blockBody = PhysiVals.world.CreateBody(blockBodyDef); blockBody.CreateShape(blockShapeDef); blockBody.SetMassFromShapes(); Точка регистрации у мувиклипа находится посередине, т.е. (X = -16, Y = -16). Почему образуется такой большой разрыв между статическим и динамическим телом? Добавлено через 29 часов 57 минут Ну что так и не кто не подскажет? Последний раз редактировалось goldlider; 20.01.2012 в 19:15. |
|
|||||
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
включи отладочную отрисовку, и увидишь что они одинаковые
upd: ах да еще в мануале написано: "A static body has does not move under simulation and behaves as if it has infinite mass. Internally, Box2D stores zero for the mass and the inverse mass.". Так что я думаю не обязательно плотность обнулять Последний раз редактировалось anmelegov; 20.01.2012 в 17:37. |
|
|||||
Регистрация: Mar 2011
Сообщений: 58
|
Цитата:
Вообще, да, странно почему вы не используете debug-отрисовку тел для корректировки положения скина тела относительно самого тела... |
|
|||||
Регистрация: Jun 2010
Сообщений: 120
|
Цитата:
|
|
|||||
Регистрация: Mar 2011
Сообщений: 58
|
Цитата:
В чем проблема то? Можно настроить debug-отрисовку так, чтобы тела рисовались полу-прозрачными, тогда и скины тел тоже видны будут... |
|
|||||
Регистрация: Jun 2010
Сообщений: 120
|
Цитата:
Последний раз редактировалось goldlider; 20.01.2012 в 18:54. |
|
|||||
Регистрация: Mar 2011
Сообщений: 58
|
Обернуть первый спрайт вторым спрайтом... Первый спрайт сдвинуть на половину ширины и высоты...
Типа так: Здесь сдвигается bitmap, но со sprite аналогично... Последний раз редактировалось redefy; 20.01.2012 в 18:56. |
|
|||||
Регистрация: Jun 2010
Сообщений: 120
|
Цитата:
Сделал, как вы написали, но не помогло. // Для зеленого спрайта private static const BLOCK_HALF:Number = 32; // Половина высоты и ширины прямоугольника размера 64 x 64 private static const RATIO:Number = 30 // pixels to meters var blockSprite:Sprite = new Sprite(); blockSprite.graphics.beginFill(0x28990E); blockSprite.graphics.drawRect(0, 0, 64, 64); blockSprite.graphics.endFill(); blockSprite.x = - blockSprite.width / 2; blockSprite.y = - blockSprite.height / 2; parent.addChild(blockSprite); var blockShapeDef:b2PolygonDef = new b2PolygonDef(); blockShapeDef.SetAsBox(BLOCK_HALF / RATIO, BLOCK_HALF / RATIO); blockShapeDef.density = 0; blockShapeDef.friction = 0; blockShapeDef.restitution = 0.3; var blockBodyDef:b2BodyDef = new b2BodyDef(); blockBodyDef.position.Set(320 / RATIO, 128 / RATIO); Последний раз редактировалось goldlider; 20.01.2012 в 19:11. |
Часовой пояс GMT +4, время: 20:52. |
|
« Предыдущая тема | Следующая тема » |
|
|