Вниз  Общие вопросы
- 11.08.2017 / 14:30
Death
  Пользователь

Death 
Сейчас: Offline
Цитата aRiGaTo:
Анимация травы - это не логика.
А разве что бы сменить кадр анимации - не нужно делать операции разные? Логика смены кадра, зависить может ещё от состояния игрового.
__________________
 Смерть правит миром
- 11.08.2017 / 15:28
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
aRiGaTo, с чего бы этому событию появиться в следующем кадре, если вероятность его появления должна определяться раз в 30 секунд?

Давай ещё раз. Каждые 30 секунд нужно с некоторой долей вероятности вырастить траву на нужных ячейках. Чтобы не загромождать игровой цикл проверкой, действительно ли прошло 30 секунд с момента последней проверки, мы выносим всё в демон. Там просматриваем ячейки с саженцами и травой и обновляем те, для которых выполнилось условие, типа rnd.nextInt(10) <= 7.
Вот секунду назад выполнилась эта проверка и всё нормально просчиталось. Внимание, вопрос: какое теперь событие может появиться в следующем кадре?
Где ты тут анимацию увидел, я не знаю. Прорастание травы — логика.
__________________
 let live

Изменено aNNiMON (11.08 / 15:32) (всего 2 раза)
- 11.08.2017 / 15:47
Death
  Пользователь

Death 
Сейчас: Offline
aNNiMON, То есть ты предлагаешь каждый промежуток времени в потоке демоне проходиться по всей траве и выращивать траву там где "rnd.nextInt(10) <= 7"?
Мне кажется лучше сделать так:
Создать поток демон и он будет каждые n секунд в радиусе ~100 блоков пробегать с проверкой на каждый блок. И если там трава, то искать рядом землю для "озеленения". Но что бы озеленить не всё, мы будем условием "rnd.nextInt(10) <= 7" проверять.
__________________
 Смерть правит миром
- 11.08.2017 / 15:51
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Death, ты понял мои слова слишком буквально. в радиусе ~100 блоков пробегать с проверкой на каждый блок, если там трава, то искать рядом землю для "озеленения". Это и так само собой разумеющееся, не воздух же обновлять, и не по всей карте.
__________________
 let live
- 11.08.2017 / 15:55
Death
  Пользователь

Death 
Сейчас: Offline
aNNiMON, хм... Это сильно муторно и много кода. А нужно что бы ООП, ну как жизни, объект отвечал за то что ему отведено. То есть что бы блок травы сам определял куда и как расти.

:ps: Блин.... Это самая-самая сложная часть в игре... Сделать так что бы "лижбы работало" - это не правельно. А то переписывать всё не хочется. А откат делать - могу. Резерв копии есть.
__________________
 Смерть правит миром
- 11.08.2017 / 15:59
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Death, абсолютно не понимаю, где ты увидел тут сложность. Ну создай объект, который будет находить нужные блоки в радиусе N ячеек. Сделай, чтобы он вызывал нужное действие для этих блоков, типа прорастание травы. Само прорастание уже в блоке травы, как ты и хочешь. И в итоге создай поток, поставь ему setDeamon(true), низкий приоритет, цикл и паузу в 30000 мс.
Всё. Где сложность? Разбил задачу на подзадачи и пошел каждую решать.
__________________
 let live
- 11.08.2017 / 16:06
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
Меньше слов, больше дела! :maga2:
__________________
 знает толк
- 11.08.2017 / 16:07
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
При необходимости и каждую разбитую подзадачу снова разбить. Например, класс, который ищет нужные блоки в радиусе N ячеек.
Работать он будет с картой, так что передаешь ему ссылку на карту. Критерий для отбора нужного блока (id блока или по классу как-нибудь). Дальше перебор блоков, начиная от какого-то центра. Хочешь прямоугольником (N/2 в каждую сторону)
000
000
000
хочешь ромбом
_0_
000
_0_
хочешь кругом - формулу окружности в зубы и вперёд.

Дальше можешь функциональщину припихнуть, передать ссылку на метод или лямбду или Runnable/Consumer, который должен будет примениться к найденному блоку.

В итоге: BlockFinder.find(map, Block.GRASS, 100 /*ячеек радиус*/).apply(obj -> obj.grow());
__________________
 let live

Изменено aNNiMON (11.08 / 16:08) (всего 2 раза)
- 11.08.2017 / 16:16
Death
  Пользователь

Death 
Сейчас: Offline
aNNiMON, понял тебя. Пошёл делать :-D
__________________
 Смерть правит миром
- 11.08.2017 / 17:56
Death
  Пользователь

Death 
Сейчас: Offline
Ну впрочем сделал это.
Всё работает. Растёт там где земля и над ней нету блока.

ФПС даже и не на каплю не просидает.

Только... Если будут другие миры, там земля будет, то прийдётся извиваться, что бы код думал что это трава, а то земля, и что бы росло.
И для каждого мира свой BlockGrassWorldN - это не правельно. Сделать блок который будет землёй и блок который трава, и от них наследовать - это уже не айс.
Так как нужно будет наследовать, а у меня все блоки и предметы в json.
А там прописывать "classPath" - то же ней айс.

:ps: Если скажите как избежать ошибки в jsonObject.get... Когда он не находит ключ, то тогда будет хорошо. И я смогу многое сделать, а так он кидает ошибки такие, что приложение зависает или вылетает полностью.
__________________
 Смерть правит миром


Прикрепленные файлы:
Скриншот 11-08-(…).png (20.12 кб.) Скачано 165 раз
Скриншот 11-08-(…).png (16.72 кб.) Скачано 129 раз
Скриншот 11-08-(…).png (38.82 кб.) Скачано 129 раз
Наверх  Всего сообщений: 1673
Фильтровать сообщения
Поиск по теме
Файлы топика (38)