|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
Я просто говорю, что хватит писать костыли, лучше пользуйтесь движком. И я советую Nape (можно +Citrus). |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Цитата:
2.Попиксельно можно проверять через наложения битмап. Берём пересечение баундсов - создаём битмапу такого размера копируем альфу 1 объекта в канал R, альфу другого в канал B, потом вызываем http://help.adobe.com/ru_RU/FlashPla...orBoundsRect() для цвета 0xffff00. Если результирующий прямоугольник пустой, значит пересечения альф не было. Альфа должна быть ff/0 без полупрозрачностей. Если есть полупрозрачности надо предварительно сделать theresold.
__________________
Отряд Котовскага |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Цитата:
Да и приятно разобраться в сложном вопросе самостоятельно, тем более, что для конкретной задачи решение может быть на порядки оптимальнее, чем универсальное.
__________________
Отряд Котовскага |
|
|||||
Если иметь в виду такие баундсы, то я уже делал, прыжок всё равно притормаживает на моменте получение битмапы и пересчёт всех возможных пересечений писелов. наверно я кривой. А на счёт движков и такой простой игры поддерживаю, как гвозди микроскопом забивать.
А можно в битмап дате получить пикселы только определённые, проверять не всю дату, а только четверть или как - то так, по координатам, но не getPixel и hitTest?
__________________
...Nothing can't be coded... |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
ну я же написал как проверять без getPixel
__________________
Отряд Котовскага |
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
Движок не большой, в будущем пригодится. |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Набросал примерчик
package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BitmapFilter; import flash.filters.GlowFilter; /** * ... * @author k0t0vich */ public class Main extends Sprite { static public const GLOWFILTER:BitmapFilter = new GlowFilter(0xFF0000); private var _hero:Bitmap; private var _boxes:Array = []; private var _bitmap:Bitmap; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); createElements(); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); } private function createElements():void { for (var i:int = 0; i < 50; i++) { var box:Bitmap = new Resources.Box(); box.x = int(Math.random()*stage.stageWidth); box.y = int(Math.random()*stage.stageHeight); _boxes.push(box); addChild(box); } _hero = new Resources.Hero(); addChild(_hero); } private function mouseMoveHandler(e:Event):void { render(); detectCollision(); } private function render():void { _hero.x = mouseX; _hero.y = mouseY; var len:uint = _boxes.length; for (var i:int = 0; i < len; i++) { var box:Bitmap = _boxes[i]; box.filters = []; } // для отображения в углу пересекающейся битмапы /*if (_bitmap && _bitmap.bitmapData) { _bitmap.bitmapData.dispose(); _bitmap = null; } if (Collision.tmp){ _bitmap = new Bitmap(Collision.tmp); addChild(_bitmap); }*/ } private function detectCollision():void { var intersects:Array = Collision.detectOneForMore(_hero, _boxes); var len:uint = intersects.length; for (var i:int = 0; i < len; i++) { var box:Bitmap = intersects[i]; box.filters = [GLOWFILTER]; } } } } package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.geom.Point; import flash.geom.Rectangle; /** * ... * @author k0t0vich */ public class Collision { static public const ZERO_POINT:Point = new Point(); // для отображения в углу пересекающейся битмапы //static public var tmp:BitmapData; static public function detectOneForMore(hero:Bitmap, enemies:Array):Array { var result:Array = []; var len:uint = enemies.length; for (var i:int = 0; i < len; i++) { var enemy:Bitmap = enemies[i]; if (hero.getBounds(hero.parent).intersects(enemy.getBounds(enemy.parent))) { if (detectAlphaIntersection(hero, enemy)){ result.push(enemy); } } } return result; } static public function detectAlphaIntersection(hero:Bitmap, enemy:Bitmap):Boolean { var r:Rectangle = hero.getBounds(hero.parent).intersection(enemy.getBounds(enemy.parent)); if (r.width > 0){ var hRect:Rectangle = new Rectangle(r.x - hero.x, r.y - hero.y, r.width, r.height); var eRect:Rectangle = new Rectangle(r.x - enemy.x, r.y - enemy.y, r.width, r.height); trace(hRect); trace(eRect); var bmpd:BitmapData = new BitmapData(r.width, r.height, false, 0x00000000); bmpd.copyChannel(hero.bitmapData, hRect, ZERO_POINT, BitmapDataChannel.ALPHA, BitmapDataChannel.RED); bmpd.copyChannel(enemy.bitmapData, eRect, ZERO_POINT, BitmapDataChannel.ALPHA, BitmapDataChannel.GREEN); // для отображения в углу пересекающейся битмапы //tmp = bmpd; var alphaIntersectionRectangle:Rectangle = bmpd.getColorBoundsRect(0xFFFFFFFF, 0x00FFFF00, true); bmpd.dispose(); return alphaIntersectionRectangle.width > 0; } return false; } } } package { /** * ... * @author k0t0vich */ public class Resources { [Embed(source = "../assets/box.png")] public static const Box:Class; [Embed(source="../assets/hero.png")] public static const Hero:Class; } } FD проект collision.zip
__________________
Отряд Котовскага |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Пример Котяры можно еще очень здорово оптимизировать, если закэшировать bounds у блоков, использовать свою реализацию intersects и использовать одну большую битмапдату для всех проверок (очищая ее, соответственно, перед проверкой).
__________________
hauts.ru |
|
|||||
Отлично! Именно так, одну большую битмапдату препятствий и к ним проверку через getColor препятствия красить чёрным - свободу - белым, проверять только 6 пикселов можно даже 4 по углам куба. Никаких циклов и массивов, ура ура, совместный разум победил! =)
__________________
...Nothing can't be coded... |
Часовой пояс GMT +4, время: 15:39. |
|
« Предыдущая тема | Следующая тема » |
|
|