Вниз  Android-программирование (1-ые посты)
- 3.06.2014 / 20:19
samogost
  Пользователь

samogost 
Сейчас: Offline
Вот три метода с комментариями для проверки столкновения непрозрачных пикселей двух картинок с оптимизацией.

//проверка столкновения непрозрачных пикселей двух картинок
private boolean isCollisionDetected(Bitmap bitmap1, int x1, int y1, Bitmap bitmap2, int x2, int y2)
{
Rect bounds1 = new Rect(x1, y1, x1 + bitmap1.getWidth(), y1 + bitmap1.getHeight());
Rect bounds2 = new Rect(x2, y2, x2 + bitmap2.getWidth(), y2 + bitmap2.getHeight());
if (Rect.intersects(bounds1, bounds2))
{
Rect collisionBounds = getCollisionBounds(bounds1, bounds2);
for (int i = collisionBounds.left; i < collisionBounds.right; i++) {
for (int j = collisionBounds.top; j < collisionBounds.bottom; j++)
{
int bitmap1Pixel = bitmap1.getPixel(i - x1, j - y1);
int bitmap2Pixel = bitmap2.getPixel(i - x2, j - y2);
if ((isFilled(bitmap1Pixel)) && (isFilled(bitmap2Pixel))) {
return true;
}
}
}
}
return false;
}

//получить прямоугольную область , которая образуется пересечением двух прямоугольников
private Rect getCollisionBounds(Rect rect1, Rect rect2)
{
int left = Math.max(rect1.left, rect2.left);
int top = Math.max(rect1.top, rect2.top);
int right = Math.min(rect1.right, rect2.right);
int bottom = Math.min(rect1.bottom, rect2.bottom);
return new Rect(left, top, right, bottom);
}

//проверить пиксель на непрозрачность
private boolean isFilled(int pixel)
{
return pixel != 0;
}

Изменено samogost (3.06 / 20:25) (всего 1 раз)
- 3.06.2014 / 21:50
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
Спасибо тебе большое ;-)
- 3.06.2014 / 22:08
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
Чет не получаеться запустить мяч под нужным мне углом делал вроде все как надо, запускаю к примеру под углом 90 градусов по идее он должен двигаться прямо вверх но летит хз под каким углом
- 3.06.2014 / 22:16
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
Дайте краткий отрывок кода где запускаешь под произвольным углом с заданой скоростью
- 3.06.2014 / 22:30
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
andreyKorotayev, уж не в градусах ты там с синусами работаешь? Переводи в радианы Math.toRadians(90) или сразу оперируй радианами: 90 градусов = Math.PI / 2
__________________
 let live
- 3.06.2014 / 22:44
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
double angle=90.0d;
Я просто писал dx=((float) Math.cos (angle))*speed и так же с синусами, а почему в синус надо другую меру измерения использовать?
- 3.06.2014 / 23:03
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
Спасибо, я угол в радианы перевел и все заработало верно :)
- 3.06.2014 / 23:48
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
andreyKorotayev (03.06.2014/22:44)почему в синус надо другую меру измерения использовать?Потому что в доках ясно сказано Parameters:
a - an angle, in radians.

__________________
 let live
- 4.06.2014 / 00:08
SeTSeR
  Пользователь

SeTSeR 
Сейчас: Offline
Токмо я не понял, зачем синусы/косинусы?
По одной координате скорость мяча прибавляется/отнимается от скорости отбивающей доски, по другой - меняет знак

Согласен, ещё со времён когда я писал на MobileBasic, без всяких косинусов и синусов сделал MarioPong

Изменено Magatino (4.06 / 00:28) (всего 1 раз)
- 4.06.2014 / 01:06
andreyKorotayev
  Пользователь

andreyKorotayev 
Сейчас: Offline
Так что угла 45 градусов достаточно + ускорение? Не заморачиваться с геометрией?
Наверх  Всего сообщений: 4453
Фильтровать сообщения
Поиск по теме
Файлы топика (184)