Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к BitmapData из Sprite (http://www.flasher.ru/forum/showthread.php?t=182259)

goldlider 17.07.2012 19:24

Обращение к BitmapData из Sprite
 
Добрый день.

Немогу никак получить доступ к BitmapData объекта типа Sprite для отслеживания столкновений метода hitTest класса BitmapData.

Приведу пример:

Class Assets

Код AS3:

package
{
        public class Assets
        {
                [Embed(source="../assets/objects/ship.png")]
                public static const SHIP:Class;
 
                [Embed(source="../assets/stalagmites.png")]
                public static const STALAGMITES:Class;
        }
}


Class Ship
Код AS3:

package
{               
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
 
        public class Ship extends Character
        {                               
                private var _shipBitmapData:BitmapData;
                private var _shipBitmap:Bitmap;
                private var _ship:DisplayObject;
 
                public function Ship()
                {
                        _ship = new Assets.SHIP();
                        _shipBitmapData = new BitmapData(_ship.width, _ship.height, true, 0);
                        _shipBitmapData.draw(_ship);
                        _shipBitmap = new Bitmap(_shipBitmapData);
                        _sprite = new Sprite();
                        _sprite.addChild(_shipBitmap); // Спрайт по иерархии наследования затем добавляется в класс World
 
                }
        }
}

Class World
Код AS3:

 
package
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
 
        public class World extends Sprite
        {
                      private var _stalagmites:DisplayObject;
                private var _stalagmitesBitmap:Bitmap;
                private var _stalagmitesBitmapData:BitmapData;
                private var _stalagmitesPoint:Point;
                private var _stalagmitesSprite:Sprite;
 
                public function World()
                {
                        makeStalagmites();
                        addEventListener(Event.ENTER_FRAME, update);
                }
 
                private function makeStalagmites():void
                {
                        _stalagmites = new Assets.STALAGMITES();
                        _stalagmitesBitmapData = new BitmapData(_stalagmites.width, _stalagmites.height, true, 0);
                        _stalagmitesBitmapData.draw(_stalagmites);
                        _stalagmitesBitmap = new Bitmap(_stalagmitesBitmapData);
                        _stalagmitesBitmap.y = App.SCREEN_HEIGHT - _stalagmitesBitmap.height;
                        _stalagmitesSprite = new Sprite();
                        _stalagmitesSprite.addChild(_stalagmitesBitmap);
                        addChild(_stalagmitesSprite);
                }
 
                private function update(event:Event):void
                {
                        _shipPoint = new Point(_ship.x, _ship.y);
                        _stalagmitesPoint = new Point(_stalagmitesSprite.x, _stalagmitesSprite.y);
 
                        // Должно быть так, но вот обратиться к объекту BitmapData класса Ship немогу
                        if (_shipBitmapData.hitTest(_shipPoint, 255, _stalagmitesBitmapData, _stalagmitesPoint, 255))
                        {
                                _stalagmitesBitmap.filters = [new GlowFilter()];
                        }
                        else
                        {
                                _stalagmitesBitmap.filters = [];
                        }
                }
        }
}


-De- 17.07.2012 20:22

А вот у вас там написано слово private - оно что делает?
И класс Assets.SHIP - он extends Bitmap на самом деле (если я не всё забыл и он таки битмапдата %), т.е. Ship можно поправить как

Код AS3:

package
{               
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
 
        public class Ship extends Character
        {                               
                public var _shipBitmapData:BitmapData;//таки private кое-что означает
                private var _shipBitmap:Bitmap;
 
                public function Ship()
                {
                        _shipBitmap = new Assets.SHIP();
                        _shipBitmapData = _shipBitmap.bitmapData;
                        _sprite = new Sprite();
                        _sprite.addChild(_shipBitmap); // Спрайт по иерархии наследования затем добавляется в класс World
 
                }
        }
}


goldlider 17.07.2012 20:24

Цитата:

Сообщение от -De- (Сообщение 1088964)
А вот у вас там написано слово private - оно что делает?

Ссори исправил. Но это не столь важно при данном вопросе.

-De- 17.07.2012 20:35

Вы в общем спрашиваете, как получить BitmapData из Sprite? Никак, у спрайта может не быть её.
Из Ship оно достается как поле его просто (если вот оно не private). Или можно геттер какой-нить сделать, если вы приверженец религии, где поля не надо паблик делать. Только не вижу связи между World и Ship.


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

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