Архив: Разработка простой игры-"кликалки" без уровней и т.п.
Бюджет
По договоренности
Создан: 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. Отрис
- Категория