Страница 1 из 8

Моя попытка

Добавлено: 23 фев 2010, 15:50
Newman
Приветствую всех!
Это мой первый пост на этом форуме, и сим сообщаю, что попытаюсь испечь свой рогалик.
Да, вкратце - история. Играл (и продолжаю играть) во много рогаликов, хотя, простите, предпочитаю тайловую графику. Больше всего нравится NetHack (и SlashEm), но так пока и не прошёл (изучение спойлеров или исходников кажется не слишком честным путём). А что прошёл... кхм... Sword of Fargoal? :) Кажется, всё... :(

Мой проект будет писаться на Java (опыт небольшой, но C много писал только под ДОС). Графика - тайловая 32*32. Остальные подробности пока утаю - во-первых, чтобы кое-что было сюрпризом, а во-вторых, вполне возможно, что проект так и не дойдёт до релиза (насколько я понял - такая печальная участь у 90% всех рогаликов).

А теперь - можно я задам несколько вопросов?

1. Тайлы. Что лучше - попробовать нарисовать самому, пусть рисунки будут наивные, или взять нужные из Nethack или Dungeon Crawl)?

2. Остров. Мне нужно сгенерировать остров (на котором будут входы в подземелья) - но не нашёл, какой лучше алгоритм использовать.
Попробовал такой: всем элементам map[][] присваивается сл4учайное значение от 0 до 255, крайние клетки всегда = 0. Потом несколько раз провожу "усреднение значений" карты:
map[y][x] = (map[y][x]+map[y-1][x]+map[y+1][x]+map[y][x-1]+map[y][x+1]) / 5;
И - финал - для всех точек карты, для которых map[y][x] < некоего порогового значения, делаю "воду", иначе - это суша.
Получается не очень. :(

Остальное будет позже.

P.S. Пока в программе красный квадрат бегает по экрану по нажатию клавиш курсора. :)

Re: Моя попытка

Добавлено: 23 фев 2010, 18:44
Jolly Roger
Как человек не выпекший ещё свой рогалик, но уже столкнувшийся с заданными вопросами, могу сказать:
1. Не заморачивайся с рисованием тайтлов, вообще, сделай поддерку тайтлов, если уж так хочется, а вместо красивых картинок используй буквы. Придёт время, будет вам и белка, будет и свисток, а в начале: НЕ трать на это время вообще. Куда важнее, чтобы игра могла поддерживать картинки разных размеров и менять их без внесения именений в код.
2. Отложи случайный генератор на будущее и загружай его из файла, нарисованный лично тобой. Генератор такая штука, его лучше подгонять под концепцию игры, а не игру под генератор. На том этапе, что ты сейчас важнее общая работа с графикой и всякая техника, вроде обхождения препятствий.
Как-то вот так, думаю если, что то форумчане меня поправят.

Re: Моя попытка

Добавлено: 23 фев 2010, 20:42
Maelstrom
1. Тайлы. Что лучше - попробовать нарисовать самому, пусть рисунки будут наивные, или взять нужные из Nethack или Dungeon Crawl)?
Если не умеешь рисовать, а тайлы уж очень хочется, есть два пути: либо ты ищешь художника, что будет не очень легко без готового хорошего рогалика, либо ты тыришь графику откуда-то ещё. Кравлом и Нетхаком можешь не ограничиваться, существует ещё дохрена игр (особенно на старых приставках), откуда можно взять вполнее нормальные тайлы.

Re: Моя попытка

Добавлено: 24 фев 2010, 08:53
Anfeir
Главное - делать то, от чего удовольствие получаешь .)
Хочешь рисовать тайлы - рисуй.
Хочешь генерить остров - генери.
Если не уверен, что хочешь, то следуй советам Jolly Roger .)
Ну и вдохновение штука очень непостоянная, ее надо использовать грамотно:
для поддержки нужен видимый, осязаемый результат трудов, чем быстрее, тем лучше.

Re: Моя попытка

Добавлено: 24 фев 2010, 09:17
Newman
Большое всем спасибо за ответы!

День второй.
Да, в общем, графика - дело десятое.
Что пока получилось - можно посмотреть на скриншоте. :)
screenshot.png
Скриншот 1
screenshot.png (7.06 КБ) 9116 просмотров
Теперь вопрос - куда двигаться дальше.
Можно, я изложу здесь несколько своих соображений? И если я что-то скажу не так, поправьте меня, пожалуйста.

Итак, у меня будет класс Game - ядро игры.
В нём будут объявлены массивы для карты, для видов местности (элементы карты), существа (существо с номером 0 - сам игрок), предметы.

Код: Выделить всё

class Game {
 static final MAP_WIDTH = 64, MAP_HEIGHT = 64, TILE_SIZE = 32;
 int[][] map = new int[MAP_HEIGHT][MAP_WIDTH];
 Terrain[] terrain = { new Terrain("water.png"), new Terrain("grass.png"), new Terrain("tree.png") };
 /* т.е. значения в map: 0 - это вода, 1 - трава, 2 - дерево */
 int[][] flags = new int[MAP_HEIGHT][MAP_WIDTH];
 /* тут будут разные флаги для определённой клетки: видимость, освещённость и т.п. */
 ArrayList<Creature> creatures; /* существа */
 ArrayList<Thing> things; /* предметы */
В правильном ли направлении я двигаюсь?

Re: Моя попытка

Добавлено: 24 фев 2010, 09:40
Maelstrom
Неее, ТАКИХ тайлов точно не надо, лучше АСКИИ

Re: Моя попытка

Добавлено: 24 фев 2010, 09:56
Anfeir
У этих тайлов свое достоинство - они глаза _совсем_ не напрягают.

С классом Game в целом вроде норм. Единственное, я бы отделил UI от игровой логики. Чтобы класс Game не заботился сам ни о размерах тайла, ни о png файлах, и т.п. Разделение логики (не держать все в голове), ну и жесткой нет привязки к тайлам вообще. можно будет сделать хоть ASCII хоть full-3d .)
Но это не обязательно.

Re: Моя попытка

Добавлено: 24 фев 2010, 10:13
Newman
Так лучше?
screenshot2.png
Скриншот 2
screenshot2.png (9.48 КБ) 9109 просмотров
UPD: Попробую теперь добавить кое-каких монстров...

Re: Моя попытка

Добавлено: 24 фев 2010, 11:38
Sanja
А мне понравился первый вариант :lol:

Re: Моя попытка

Добавлено: 24 фев 2010, 12:07
Maelstrom
У этих тайлов свое достоинство - они глаза _совсем_ не напрягают.
Странные у тебя глаза. Едкие кислотные цвета тебе нормально, а кравловские тайлы глаза разъедают? :lol:
Так лучше?
Нет

Чем тебе АСКИИ не нравится то? Куда лучше плохосделанных тайлов.
Недавно подбирал буковки для Барионикса, получилось вполне айс

Re: Моя попытка

Добавлено: 24 фев 2010, 12:27
Newman
А, я понял. Больше всего не понравились яркие цвета на фоне. Да, надо приглушить. Но вопрос графики пока отложу на потом, надо всё-таки "оживить" мир немного...

Re: Моя попытка

Добавлено: 24 фев 2010, 15:34
Jolly Roger
2 Maelstrom, а ничего так, красивенько.
Надеюсь будут доступны оба варианта?

Re: Моя попытка

Добавлено: 24 фев 2010, 16:02
Maelstrom
Надеюсь будут доступны оба варианта?
Я тоже надеюсь, что тайлы удасться дорисовать

Re: Моя попытка

Добавлено: 24 фев 2010, 19:40
Newman
Простите, а на Яве кто-нибудь тут рогалики программировал?
Можно ли вешать весь "цикл жизни" в методе keyPressed?
(В этом случае, как мне кажется, о мыши вообще можно забыть.)
Наверное, логичнее сделать "жизнедеятельность" в отдельном потоке run(), в котором проверять нажатые клавиши и кнопки мыши, а потом делать перемещения монстров и т.д....

Re: Моя попытка

Добавлено: 27 фев 2010, 17:12
dunno
привет.
Newman писал(а):Простите, а на Яве кто-нибудь тут рогалики программировал?
Соседняя тема моя, собственно, про BlameR.
Newman писал(а):Наверное, логичнее сделать "жизнедеятельность" в отдельном потоке run(), в котором проверять нажатые клавиши и кнопки мыши, а потом делать перемещения монстров и т.д....
да, так логичнее. Про мышку забывать не за чем в принципе, ее эвенты тоже можно обрабатывать, как и клавишные, в основном потоке. То есть метод run():
while(<что-нибудь>)
{
events.check(); // здесь слушаем клаву и мышку
monsters.nextStep(); // здесь всех двигаем
field.show(); // все рисуем
}
как-то так.

Сразу вопрос: как ты выводишь графику? awt или что-то другое?