Просмотр полной версии : Замена HitTestPoint
Wormhole
21.03.2015, 20:30
Здравствуйте. Я для тренировки делаю платформер. Для обработки столкновения с землей чаще всего используется HitTestPoint (HTO не сработает, платформы не представляют собой не один прямоугольник, а несколько). Проблема в том, что он вызывает у меня большое количество ошибок разного рода, но это не столь важно. Мне, честно говоря, влом работать с точками столкновения, в особенности проставлять их + уродовать макет сцены невидимой "землей" (объединение всех прямоугольников-платформ). Нет ли какого-нибудь другого способа обрабатывать столкновение с платформами, кроме разбиения фигуры на прямоугольники и последовательной обработки каждого?
OlmerDale
21.03.2015, 20:52
Не совсем понял... Но Вы о третьем параметре hitTestPoint знаете?
ZackMercury
21.03.2015, 21:11
Рисуйте платформы в битмап-контейнер, и проверяйте свободность пикселов под героем при ходьбе/падении. Пока он стоит, проверять и не стоит даже(если конечно платформы не двигаются или не крутятся).
Wormhole
22.03.2015, 09:30
Рисуйте платформы в битмап-контейнер, и проверяйте свободность пикселов под героем при ходьбе/падении. Пока он стоит, проверять и не стоит даже(если конечно платформы не двигаются или не крутятся).
Так, а вот это уже интересно. У меня маловато опыта, где можно прочитать про битмап-контейнеры? Мне их рекомендовали еще год назад. Заранее спасибо
Под контейнером вы подразумеваете просто общий для всей "земли" объект класса Bitmap, к которому можно применять методы BlendMode?
Добавлено через 5 минут
Не совсем понял... Но Вы о третьем параметре hitTestPoint знаете?
Посмотрел в доках, не совсем понял. По рамке персонажа проводится тестирование, если true, я так думаю? Если это так, то это сильно облегчит работу
ZackMercury
22.03.2015, 12:54
Так, а вот это уже интересно. У меня маловато опыта, где можно прочитать про битмап-контейнеры? Мне их рекомендовали еще год назад. Заранее спасибо
Под контейнером вы подразумеваете просто общий для всей "земли" объект класса Bitmap, к которому можно применять методы BlendMode?
Смотрите, есть класс Bitmap, он содержит в себе экземпляр класса BitmapData.
Подробнее про эти классы в доках да и в инете полно примеров.
Так вот, получить ссылку на битмапдату можно так:(если вы в FD, иначе если вы в Adobe Flash CSX, то у вас в библиотеке картинки хранятся уже в виде BitmapData, и их нужно передавать в конструктор битмапы, чтобы нарисовать)
var bmp:Bitmap = new SomeBitmapEmbedImage();
var bmpDt:BitmapData = bmp.bitmapData;
нарисовать объект в битмапдату можно методом draw. Он принимает объект и матрицу, кормите ему матрицу трансформации DO(someSprite.transform.matrix)
Рисуем какой-т спрайт в битмапдату битмапы bmp
bmpDt.draw(someSprite, someSprite.transform.matrix);
addChild(bmp);
Получить пиксели в конкретной точке битмапдаты можно с помощью методов getPixel/setPixel и getPixel32 и setPixel32.
Добавлено через 9 минут
BitmapData по сути - просто массив пикселей, с удобными методами.
Wormhole
22.03.2015, 13:03
Спасибо за разъяснение!
Нарисовать объект в битмапдату можно методом draw. Он принимает объект и матрицу, кормите ему матрицу трансформации DO(someSprite.transform.matrix)
Хм, если мне надо (и даже не всегда) лишь перемещать битмапу, мне все равно скармливать ему матрицу трансормации?
Плюс если я собираюсь использовать BlendMode, мне надо что-то в соответствующий параметр писать? (вопрос не по теме, это уже касательно флешек а-ля worms)
ZackMercury
22.03.2015, 13:04
Вам нужно создавать экземпляр BitmapData вручную, с размерами вашей карты, и рисовать туда платформы.
Wormhole
22.03.2015, 13:07
Так вот, получить ссылку на битмапдату можно так: (если вы в FD, иначе если вы в Adobe Flash CSX, то у вас в библиотеке картинки хранятся уже в виде BitmapData, и их нужно передавать в конструктор битмапы, чтобы нарисовать)
var bmp:Bitmap = new SomeBitmapEmbedImage();
var bmpDt:BitmapData = bmp.bitmapData;
То есть, во Flash IDE эта композиция реализована для каждого объекта (и сами эти объекты принадлежат классу Bitmap)? Или это просто экземпляр класса BitmapData, не связанный с классом Bitmap?
ZackMercury
22.03.2015, 13:07
Перемещать битмапу легко, просто bmp.x -= 2, bmp.y += 5;
Матрицу трансформации вы скармливаете ОБЪЕКТА, а не битмапдаты, чтобы объект рисовался не в начальных координатах, а в своих.
Wormhole
22.03.2015, 13:08
Вам нужно создавать экземпляр BitmapData вручную, с размерами вашей карты, и рисовать туда платформы.
Поясните, пожалуйста, что вы имеете в виду касательно размеров.
ZackMercury
22.03.2015, 13:09
Нет, это я про библиотеку. Если вы будете создавать пустую битмапу с пустой битмапдатой, вам не нужно об этом беспокоиться. Я имел в виду, что в библиотеке(окошке справа) могут храниться картинки, и их тоже можно экспортировать в экшнскрипт. Так вот, в Flash IDE они экспортируются как BitmapData, а в FD - сразу Bitmap.
Wormhole
22.03.2015, 13:10
Перемещать битмапу легко, просто bmp.x -= 2, bmp.y += 5;
Матрицу трансформации вы скармливаете ОБЪЕКТА, а не битмапдаты, чтобы объект рисовался не в начальных координатах, а в своих.
Ах да, точно. Спасибо, упустил
Добавлено через 2 минуты
Нет, это я про библиотеку. Если вы будете создавать пустую битмапу с пустой битмапдатой, вам не нужно об этом беспокоиться. Я имел в виду, что в библиотеке(окошке справа) могут храниться картинки, и их тоже можно экспортировать в экшнскрипт. Так вот, в Flash IDE они экспортируются как BitmapData, а в FD - сразу Bitmap.
Поясню ситуацию. Пока что я планирую во Flash IDE в библиотеке создать символы.
ZackMercury
22.03.2015, 13:12
Касательно размеров, у вас карта то где хранится? Если у вас платформы хранятся в контейнере, то передавайте вот так его размеры:
someSprite//контейнер
var bmpDt:BitmapData = new BitmapData(someSprite.width, someSprite.height, "auto", true);
var bmp:Bitmap = new Bitmap(bmpDt);
addChild(bmp);
Wormhole
22.03.2015, 13:14
Касательно размеров, у вас карта то где хранится? Если у вас платформы хранятся в контейнере, то передавайте вот так его размеры:
someSprite//контейнер
var bmpDt:BitmapData = new BitmapData(someSprite.width, someSprite.height, "auto", true);
var bmp:Bitmap = new Bitmap(bmpDt);
addChild(bmp);
Так, я понял, вы про создание битмапы кодом. Что вы мне посоветуете: создавать символ и делать привязку или писать код, как вы написали?
ZackMercury
22.03.2015, 13:17
Ну, если не кодом, то вам лучше рисовать тогда карту в каком-нить Adobe Photoshop :)
Flash с растром ни тю-тю.
Я вас хотел научить рисовать ВЕКТОР в РАСТР, во-первых, это + в пользу производительности(если вы конечно оригинальный вектор не будете тоже добавлять в список отображения), во-вторых, бОльшие возможности для обработки столкновений/перемещений.
Wormhole
22.03.2015, 13:20
Ну, если не кодом, то вам лучше рисовать тогда карту в каком-нить Adobe Photoshop :)
Flash с растром ни тю-тю.
Я вас хотел научить рисовать ВЕКТОР в РАСТР, во-первых, это + в пользу производительности(если вы конечно оригинальный вектор не будете тоже добавлять в список отображения), во-вторых, бОльшие возможности для обработки столкновений/перемещений.
Про флешевый растр знаю, спасибо.
Но раз вы говорите, что у вектора такие преимущества, то давайте по порядку. Да, я хочу научиться рисовать ВЕКТОР в РАСТР. Но хотел бы сначала узнать, что такое контейнер объекта :o
ZackMercury
22.03.2015, 13:25
Вы с ООП не знакомы? Оу, тогда объяснить будет трудновато.
В общем, есть класс DisplayObject, от него наследуется Bitmap, например.
В экземпляр класса Bitmap нельзя добавить содержимое, как это можно сделать со Sprite или MovieClip:
var spr:Sprite = new Sprite();
spr.addChild(anotherSprite);
var bmp:Bitmap = new Bitmap();
bmp.addChild(anotherBitmap);
Sprite и MovieClip наследуются от DisplayObjectContainer, который как раз и реализует методы addChild/removeChild/numChildren/getChildAt/итд...
Так вот, Sprite, MovieClip - это контейнеры.
Добавлено через 4 минуты
И у вектора преимущества только в его малом весе на диске :)
Производительность он убивает.
Wormhole
22.03.2015, 13:31
Вы с ООП не знакомы?
Знаком. Но недавно. Читаю Колина Мука, подошел к концу восьмой главы, "Типы данных".
Sprite и MovieClip наследуются от DisplayObjectContainer, который как раз и реализует методы addChild/removeChild/numChildren/getChildAt/итд..."
Так вот, Sprite, MovieClip - это контейнеры.
Теперь понял. Давайте дальше :)
Добавлено через 4 минуты
И у вектора преимущества только в его малом весе на диске :)
Производительность он убивает.
Ну растр тоже не вариант
ZackMercury
22.03.2015, 13:43
Есть векторная графика - это графика, которая базируется на точках в пространстве. От одной точки к другой может быть линия, и линия может иметь направление, которое плавно переходит в следующую точку.
Такая графика используется в Adobe Flash, или если вы будете рисовать с помощью graphics.
Она очень много требует производительности, т.е. немеренно есть ресурсы процессора.
Есть растровая графика - это когда хранится матрица пикселей, т.е. точек на экране, и она не требует сложных вычислений сбоку процессора, просто рисование на экране. Конечно, к классу Bitmap можно применить scale или rotation, но это всё равно не так сильно будет грузить процессор, как векторная графика с его сотнями-тыщами точек и линий, которые нужно перерисовывать каждый кадр.
Если вы попробуете наполнить экран 200-300 векторными рисунками, и попробуете их двигать, у вас CPU будет жрать на все 100%, и тормозить при этом будет жёстко.
Если же это будут битмапы, то нагрузка будет мизерная, 20-30%, и тормозить не будет.
Вы поняли, в общем. Но суть не в этом же, по теме вы хотите просто проверять столкновение с землёй. Проверяйте пиксел на битмапдате чуть ниже положения персонажа.
Wormhole
22.03.2015, 15:15
Есть векторная графика - это графика, которая базируется на точках в пространстве. От одной точки к другой может быть линия, и линия может иметь направление, которое плавно переходит в следующую точку.
Такая графика используется в Adobe Flash, или если вы будете рисовать с помощью graphics.
Она очень много требует производительности, т.е. немеренно есть ресурсы процессора.
Есть растровая графика - это когда хранится матрица пикселей, т.е. точек на экране, и она не требует сложных вычислений сбоку процессора, просто рисование на экране. Конечно, к классу Bitmap можно применить scale или rotation, но это всё равно не так сильно будет грузить процессор, как векторная графика с его сотнями-тыщами точек и линий, которые нужно перерисовывать каждый кадр.
Если вы попробуете наполнить экран 200-300 векторными рисунками, и попробуете их двигать, у вас CPU будет жрать на все 100%, и тормозить при этом будет жёстко.
Если же это будут битмапы, то нагрузка будет мизерная, 20-30%, и тормозить не будет.
Вы поняли, в общем. Но суть не в этом же, по теме вы хотите просто проверять столкновение с землёй. Проверяйте пиксел на битмапдате чуть ниже положения персонажа.
Да-да, про векторную и растровую графику я уже знал, но про то, как жрет ресурсы векторная еще не слышал. Спасибо
ZackMercury
22.03.2015, 15:45
Так вот, суть в том, чтобы сгруппировать ваши платформы в один единый контейнер, нарисовать их в битмапдату с размерами этого контейнера(а лучше нарисовать сам контейнер, тогда и матрица не нужна), создать экземпляр битмапа, скормить ему битмапдату с платформами и далее удалить контейнер с векторными формами с экрана(removeChild), а по сути можно вообще не добавлять.
И только после этого начинать игру и проверять столкновения когда надо.
Добавлено через 14 минут
Плюс если я собираюсь использовать BlendMode, мне надо что-то в соответствующий параметр писать? (вопрос не по теме, это уже касательно флешек а-ля worms)
draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:flash.geom:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
Draws the source display object onto the bitmap image, using the Flash runtime vector renderer.
Используйте этот параметр. (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#draw())
blendMode:String (default = null) — A string value, from the flash.display.BlendMode class, specifying the blend mode to be applied to the resulting bitmap.
Wormhole
22.03.2015, 18:24
Используйте этот параметр.[/URL]
Я так и подумал, спасибо. Посмотрю насчет вопросов, может, возникнут
Добавлено через 12 минут
Так вот, суть в том, чтобы сгруппировать ваши платформы в один единый контейнер, нарисовать их в битмапдату с размерами этого контейнера(а лучше нарисовать сам контейнер, тогда и матрица не нужна), создать экземпляр битмапа, скормить ему битмапдату с платформами и далее удалить контейнер с векторными формами с экрана(removeChild), а по сути можно вообще не добавлять.
Можете пояснить это предложение насчет контейнера? Меня просто немного смутили словосочетания "нарисовать их в битмапдату с размерами этого контейнера", "лучше нарисовать сам контейнер" и "а по сути можно вообще не добавлять".
Добавлено через 16 минут
Так вот, суть в том, чтобы сгруппировать ваши платформы в один единый контейнер <...> а лучше нарисовать сам контейнер
Вы имеете ввиду сгруппировать их и записать как объект класса MovieClip? А нарисовать контейнер - как? Что он должен из себя представлять? Я всегда думал, что контейнер - это абстрактный объект...
Добавлено через 17 минут
нарисовать их в битмапдату
Командой draw()?
Добавлено через 18 минут
скормить ему битмапдату
Что имеется в виду под "скормить"?
Я надеюсь, вы ответите на все мои вопросы. Заранее спасибо
ZackMercury
22.03.2015, 19:16
Можете пояснить это предложение насчет контейнера?
Если собираете уровень в Flash IDE, то выделите все платформы и нажмите F8, затем окей и дайте инстанс нейм container.
var bmpDt:BitmapData = new BitmapData(container.width, container.height, true, 0x00000000);
bmpDt.draw(container);
removeChild(container);
Затем вот так:
var bmp:Bitmap = new Bitmap(bmpDt);
bmp.x = container.x;
bmp.y = container.y;
addChild(bmp);
И теперь мы можем делать с растровой копией контейнера с платформами буквально всё, что захотим.
if(bmpDt.getPixel32(positionOnBitmap.x, positionOnBitmap.y) >> 24 > 0) trace("Point hits a visible pixel");
Правда для проверки столкновения с точкой в целом, а не конкретно на битмапдате, нужно от positionOnBitmap.x отнимать bmp.x, а от positionOnBitmap.y соответственно bmp.y.
Добавлено через 5 минут
Сейчас попробую быстро набыдлокодить накатать пример...
Wormhole
22.03.2015, 19:59
Если собираете уровень в Flash IDE, то выделите все платформы и нажмите F8, затем окей и дайте инстанс нейм container.
var bmpDt:BitmapData = new BitmapData(container.width, container.height, true, 0x00000000);
bmpDt.draw(container);
removeChild(container);
Затем вот так:
var bmp:Bitmap = new Bitmap(bmpDt);
bmp.x = container.x;
bmp.y = container.y;
addChild(bmp);
И теперь мы можем делать с растровой копией контейнера с платформами буквально всё, что захотим.
if(bmpDt.getPixel32(positionOnBitmap.x, positionOnBitmap.y) >> 24 > 0) trace("Point hits a visible pixel");
Правда для проверки столкновения с точкой в целом, а не конкретно на битмапдате, нужно от positionOnBitmap.x отнимать bmp.x, а от positionOnBitmap.y соответственно bmp.y.
Добавлено через 5 минут
Сейчас попробую быстро набыдлокодить накатать пример...
Ха! А я уж боялся просить код. Теперь все понятно. Действительно просто. Спасибо!!!
ZackMercury
22.03.2015, 20:32
Верней там должно быть так:
if(bmpDt.getPixel32(positionOnBitmap.x, positionOnBitmap.y) >> 24 & 0xFF > 0) trace("Point hits a visible pixel");
Сча, я почти закончил с демкой :D
Wormhole
22.03.2015, 20:55
Верней там должно быть так:
if(bmpDt.getPixel32(positionOnBitmap.x, positionOnBitmap.y) >> 24 & 0xFF > 0) trace("Point hits a visible pixel");
Сча, я почти закончил с демкой :D
Будет полезно посмотреть)
ZackMercury
22.03.2015, 21:05
main.swf
Быстро мышкой набросал графику х)
Кликнуть в области флешки и управлять пробел-влево-вправо.
Wormhole
22.03.2015, 23:19
Это лицо будет сниться мне в кошмарах. http://upfile.at.ua/2015-03-22_22-14-57_skrinshot_ehkrana.png
Спасибо за пример!
ZackMercury
23.03.2015, 00:47
Пародия на Cтива(в стиле ака ваша ава) из кубомира, старался :D
Wormhole
05.04.2015, 22:18
Пародия на Cтива(в стиле ака ваша ава) из кубомира, старался :D
Это ж спуди мин. Ну ок
ZackMercury
05.04.2015, 22:56
offtop
Wormhole, я непросвящённый был c:
P.S. Как успехи с игрой? Выложите потом во флейм?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.