Архив: Разработка простой игры-"кликалки" без уровней и т.п.

Бюджет По договоренности
Создан: 5 лет назад
Закрыт
Описание
ТЗ на примере «Охотника»***



Концепция игры: мини-игра, в которой охотник, сидя на лодке, подстреливает уток. Игрок управляет ружьём, ружьё наклоняется и производит выстрелы в зависимости от касаний игрока:

- заряд уже вылетел из ружья и находится на экране, ружьё наклоняется в сторону касания, но выстрел не производится

- заряд покинул экран, либо «убил» утку, т.е. заряд невидим => при касании помимо наклона к точке касания происходит выстрел, заряд покидает ствол ружья

Можно оставить только второй вариант, это проще.



1. Игровые объекты, моделируемые объектами соответствующих классов



1) Утка. Поля: x, y, width, height, velocityX, velocityY, visible (утка либо видна на экране, либо ее сбили), paint, bitmap. В поле bitmap хранится «скин» утки. Velocity-поля хранят значение горизонтальной и вертикальной скорости. Поле paint здесь и далее нужно просто чтобы передать в метод canvas.drawBitmap, больше никакой надобности в нем нет. Методы: draw(canvas: Canvas), в этот метод передаётся canvas view-шечки, на которой отрисовывается вся игра; move(time: Double) – метод меняет координаты в зависимости от временного промежутка; changeBitmap(bitmap: Bitmap) нужен, чтобы поменять «скин», когда утка коснётся края экрана и полетит в обратную сторону, чтобы объект не летел задом наперёд.

2) Заряд. Те же поля, что и в случае 1, за исключением bitmap. Отдельного «скина» нет, вместо этого появляется целочисленное поле radius. Методов два: draw(canvas: Canvas) и move(time: Double), в draw происходит отрисовка круга заданного целочисленного радиуса radius.

3) Ружьё. Те же поля, что и в случае 1, за исключением velocityX и velocityY, а также за исключением visible (оно здесь не нужно, ружьё всегда видно игроку). Появляется новое поле bulletSpeed. Методы: draw(canvas: Canvas), changeBitmap (метод нужен чтобы вернуть первоначальное положение ружью после выстрела) и fire(angle: Double, bullet: Bullet) – метод принимает угол наклона и, исходя из него, высчитывает горизонтальную и вертикальные компоненты скорости заряда bullet по обычным формулам: vX = bulletSpeed * Math.sin(angle); vY = - bulletSpeed * Math.cos(angle). Поворот ружья осуществляется так: создается матрица (android.graphics.matrix), в нее передается значение angle * 180 / Math.PI (значение угла в радианах вместо градусов), на основе этой матрицы создаётся повёрнутый битмап Bitmap.createBitmap(bmp, someX, someY, gunWidth, gunHeight, matrix, true).

При выстреле значение переменной visible объекта-заряда устанавливается в true.





Пример метода-выстрела:



fun fire(angle: Double, bullet: Bullet, bmp: Bitmap = bitmap) {

val vX = bulletSpeed * Math.sin(angle)

val vY = - bulletSpeed * Math.cos(angle)

val matrix = Matrix()

val angleDegrees = angle * 180 / Math.PI

matrix.postRotate(angleDegrees.toFloat())

bitmap = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, true)

bullet.visible = true

bullet.vX = vX.toInt()

bullet.vY = vY.toInt()

}





2. Отрис
Категория