Программирование приложений на android
Создана: 31 Октября 2011 Пон 13:25:33.
Раздел: "Компьютерный раздел"
Сообщений в теме: 223, просмотров: 34933
-
Для того чтобы начертить луч лазера надо иметь две точки. Начальная известна. Как вычислить вторую точку ?
Для всех лучей и зеркал размещенных на игровом поле можно создать уравнения. И для определения второй точки надо решить эти уравнения на предмет наличия общих решений. Поскольку на пути лазера может встретится несколько зеркал надо выбрать из них самое близкое -
Уравнение для луча лазера
y1 = b1 + (x - a1) / tg alpha
где b1 y-координата лазера, a1 x-координата лазера, alpha - угол между лучом и осью Y
У android начало координат находится в левом верхнем углу экрана, то есть ось Y перевернута относительно декартовой системы координат, поэтому величину b1 надо будет преобразовывать по формуле
b1` = h - b1, где h - высота экрана в пикселах
Уравнение для зеркала
y2 = b2 + (x - a2) / tg beta
Теперь можно найти значение x удовлетворяющее обоим уравнениям. Если оно есть то луч падает на зеркало
Надо учесть , что функция тангенс имеет невычислительные значения для x равных 90 и 270 градусов. Для того чтобы использовать эти значения будем заменять их на близкие , а именно 89,9 и 269,9
Имеем для x
x = ((b1 - b2) tg alpha * tg beta + a2 * tg alpha - a1 * tg beta) / (tg alpha - tg beta)
Видно что исключается случай когда alpha = beta + 180*n
Если решение есть то оно проверяется на попадание в интервал
b2 + d < x < b2 - d
где d проекция размера зеркала на ось x, деленная пополам -
Для контактов
Скайп: erbol gabdullin
Twitter : ERBOL_G
Facebook : Эрбол Габдуллин
Цвела картошка у сарая
лиловым, белым, голубым...
Я в детстве так боялась рая,
где будешь ты любим любым
и устремят родные души
к тебе несметные стопы, -
я пряталась на старой груше...
...Я и теперь боюсь толпы.
Инна Кабыш -
Архитектура объектов и методов в игре "Лазеры и зеркала"
Объектов два типа
1. Статические - не поворачиваются
2. Динамические - поворачиваются
Для статических создан класс GameObject. Метод onLaser этого класса принимает значение угла под которым луч лазера падает на объект и возвращает отрицательное значение или угол отраженного луча если это зеркало -
Вот почитал эту статью - [внешняя ссылка] А именно раздел - "Уравнение прямой по точке и угловому коэффициенту".
Она значительно упростила мои взгляды на вычисление точки пересечения луча лазера и зеркала
y1=a1+k1*x1
y2=a2+k2*x2
Сначала находим величины a1 и a2. Подставляем вместо x и y координаты центра ячеек в которых находятся лазер и зеркало.
Для координаты x - точки пересечения луча и зеркала получаем уравнение
x = (a2-a1)/(ctg alpha - ctg beta) -
-
-
Как происходит прорисовка лучей в игре "Лазеры и зеркала" ?
Взаимодействие пользователя с игрой обеспечивает класс GameObjectsControlle. При повороте зеркала или лазера метод onSceneTouchEvent запускает метод run класса LaserUpdater. Тот в свою очередь запускает метод buildLasers класса GameObjectsMap.
Метод buildLasers класса GameObjectsMap запускает цикл по списку лазеров размещенных на игровом поле, который выполняет для каждого лазера метод buildLaser класса LaserGun
Код: public void buildLaser(GameObject[][] map) {
mLaserLine.setAngle(getAngle());
mLaserLine.build(map);
}
Метод build
Код: public void build(GameObject[][] map) {
sBuilder.buildPath(this, map);
buildLines();
}
Метод buildPath класса LaserLineBuilder строит список точек, а метод buildLines() класса LaserLine строит из этих точек линии и размещает их на сцене -
Иван Елагин
Гасли тысячи свечек.
В город вошли, как в морг,
Мистер Смит — контрразведчик,
Товарищ Петров — парторг.
На всех перекрестках мира
Стоят они по ночам,
На всех перекрестках мира
Прислушиваются к речам,
На всех перекрестках мира
Готовят переворот,
На всех перекрестках мира
Радио их орёт,
На всех перекрестках мира
Гуляет их солдатня,
На всех перекрестках мира
Они убивают меня. -
-
Как работать с камерой? На хтс сенсэйшн запись видео в фул эйч ди, но сохраняется в формате 3гп, поэтому качество такого фул эйч ди сами понимаете какое. Хочу чтобы в мпег сохраняла.
И вторая задача: камера 8 мп, фотки в целом неплохие - разрешение 3264х1840, но фотка сохраняется в жипег размером ~800 кб, естественно, что детализация такой фотки уменьшается и при маштабировании это очень резко заметно. Как заставить аппарат не сжимать фотки?
Спасибо, пожалуйста. -
Для того чтобы нарисовать луч лазера будем "пошагово" перемещаться в соседнюю ячейку двигаясь под заданным углом к оси X. Ось X совпадает с декартовой, ось Y направлена противоположно соответствующей декартовой.
Проекция шагового смещения на оси не должна превышать размера ячейки. В нашем случае это 64 условные единицы.
Получаем таблицу из трех столбцов
Соответственно метод nextPosition класса LaserLineBuilder переписываем
Код: private void nextPosition(Point position, final int angle) {
// в зависимости от угла лазера к оси Y изменяем координаты объекта position
switch (angle) {
case DynamicGameObject.DEG_0:
position.x = position.x + CELL_SIZE;
break;
case DynamicGameObject.DEG_15:
position.x = position.x + CELL_SIZE ;
position.y = position.y + (int) (CELL_SIZE*0.268);
break;
case DynamicGameObject.DEG_30:
position.x = position.x + CELL_SIZE ;
position.y = position.y + (int) (CELL_SIZE*0.577);
break;
case DynamicGameObject.DEG_45:
position.x = position.x + CELL_SIZE ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_60:
position.x = position.x + (int) (CELL_SIZE*0.577) ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_75:
position.x = position.x + (int) (CELL_SIZE*0.268) ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_90:
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_105:
position.x = position.x - (int) (CELL_SIZE*0.268) ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_120:
position.x = position.x - (int) (CELL_SIZE*0.577) ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_135:
position.x = position.x - CELL_SIZE ;
position.y = position.y + CELL_SIZE;
break;
case DynamicGameObject.DEG_150:
position.x = position.x - CELL_SIZE ;
position.y = position.y + (int) (CELL_SIZE*0.577);
break;
case DynamicGameObject.DEG_165:
position.x = position.x - CELL_SIZE ;
position.y = position.y + (int) (CELL_SIZE*0.268);
break;
case DynamicGameObject.DEG_180:
position.x = position.x - CELL_SIZE ;
break;
case DynamicGameObject.DEG_195:
position.x = position.x - CELL_SIZE ;
position.y = position.y - (int) (CELL_SIZE*0.268);
break;
case DynamicGameObject.DEG_210:
position.x = position.x - CELL_SIZE ;
position.y = position.y - (int) (CELL_SIZE*0.577);
break;
case DynamicGameObject.DEG_225:
position.x = position.x - CELL_SIZE ;
position.y = position.y - CELL_SIZE;
break;
case DynamicGameObject.DEG_240:
position.x = position.x - (int) (CELL_SIZE*0.577) ;
position.y = position.y - CELL_SIZE ;
break;
case DynamicGameObject.DEG_255:
position.x = position.x - (int) (CELL_SIZE*0.268) ;
position.y = position.y - CELL_SIZE;
break;
case DynamicGameObject.DEG_270:
position.y = position.y - CELL_SIZE;
break;
case DynamicGameObject.DEG_285:
position.x = position.x + (int) (CELL_SIZE*0.268) ;
position.y = position.y - CELL_SIZE ;
break;
case DynamicGameObject.DEG_300:
position.x = position.x + (int) (CELL_SIZE*0.577) ;
position.y = position.y - CELL_SIZE ;
break;
case DynamicGameObject.DEG_315:
position.x = position.x + CELL_SIZE ;
position.y = position.y - CELL_SIZE ;
break;
case DynamicGameObject.DEG_330:
position.x = position.x + CELL_SIZE ;
position.y = position.y - (int) (CELL_SIZE*0.577) ;
break;
case DynamicGameObject.DEG_345:
position.x = position.x + CELL_SIZE ;
position.y = position.y - (int) (CELL_SIZE*0.268) ;
break;
default:
break;
}
}
Где величина CELL_SIZE это размер ячейки
private static final int CELL_SIZE = 64;