Знак Саламандры
Модератор: Jolly Roger
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Знак Саламандры
Я только изучаю С++ и библиотеку LibTCod, уже несколько раз пытался задать здесь вопросы - но каждый раз сам решал их, так что просто прикладываю код с экзешниками.
Пишется все в Code::Blocks 10.05, заголовочные файлы от LibTCod помещаются в CodeBlocks\MinGW\include\LibTCod, от SDL CodeBlocks\MinGW\include\SDL
Если есть какие то советы, прошу отписать.
2011.07.05 - Переписал код, опять же хочу услышать комментарии
Пишется все в Code::Blocks 10.05, заголовочные файлы от LibTCod помещаются в CodeBlocks\MinGW\include\LibTCod, от SDL CodeBlocks\MinGW\include\SDL
Если есть какие то советы, прошу отписать.
2011.07.05 - Переписал код, опять же хочу услышать комментарии
- Вложения
-
- 20110705 - SS.zip
- (1.54 МБ) 237 скачиваний
Последний раз редактировалось ShadoWalkeR 05 июл 2011, 17:10, всего редактировалось 1 раз.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
Re: Знак Саламандры
Окно обновляется только после действия? Если переключится на другое окно и вернуться в игровое - не обновится...
Ну а в целом - смотреть нечего, или я чего-то недопонял?
Ну а в целом - смотреть нечего, или я чего-то недопонял?
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Re: Знак Саламандры
Ну по тому что я уже наваял общие рекомендации хотелось бы услышать, а то делаю, делаю, а как лучше будет не знаю.
По обновлению окна - пока только изучаю возможности, так что очень многого нет (в ближайшее время скорее всего и не будет - разбираюсь с алгоритмом генерации подземелья). Забыл сказать, что в обработчике клавиатуры есть комбинация "Shift r" - заново сгенерировать пещеру.
По обновлению окна - пока только изучаю возможности, так что очень многого нет (в ближайшее время скорее всего и не будет - разбираюсь с алгоритмом генерации подземелья). Забыл сказать, что в обработчике клавиатуры есть комбинация "Shift r" - заново сгенерировать пещеру.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
Re: Знак Саламандры
Извини, тебя буду критиковать.
Сорц GameObjects.cpp
есть extern TCODConsole *con;
так некорректно делать, используй паттерн синглтон
Далее есть
extern int playerx;
extern int playery;
И код в базовом движении ВСЕХ объектов (нпс, герои монстры) присутствует
присваение координат героя. когда у тебя одни объект то все номано.. НННООО когда ты от Character унаследуешь NPC или монстряка, то при движении монстряка или NPC ВНЕЗАПНО будет двигатся герой. шо не есть гуууудддд.
Как решить?
Уберай extern int playerx;
extern int playery; это вообще лишнее.
тогда вместо
пиши нечто
Сорц GameObjects.cpp
есть extern TCODConsole *con;
так некорректно делать, используй паттерн синглтон
Далее есть
extern int playerx;
extern int playery;
И код в базовом движении ВСЕХ объектов (нпс, герои монстры) присутствует
Код: Выделить всё
//Перемещение объекта
void Character::Move(int x1,int y1)
{
x += x1;
playerx = x;
y += y1;
playery = y;
};
Как решить?
Уберай extern int playerx;
extern int playery; это вообще лишнее.
тогда вместо
Код: Выделить всё
if(TestMap.CheckTile(playerx-1,playery))
Player.Move(-1,0);
Код: Выделить всё
if(TestMap.CheckTile(Player.x-1,Player.y))
Player.Move(-1,0);
Re: Знак Саламандры
А, понятно, рекомендации в плане кода?ShadoWalkeR писал(а):Ну по тому что я уже наваял общие рекомендации хотелось бы услышать, а то делаю, делаю, а как лучше будет не знаю.
Re: Знак Саламандры
И еще, на последок. У тебя проследуюется божественный код. Тоесть карта. она и рисуется и генерится. Все в одном. Это неправельно. Отдели генератор от карты. Пускай карта только рисуется, и идут проверки на предмет стен столкновений. Генератор вынеси отдельно. Это будет отдельный класс. у которого будет метод - генерировать(карта) на входе указатель на карту. Ибо генераторов может быть несколько. Один для подземелья, другой для замков, третий для городов итд. Поверь мне, нехорошо лепить все в один класс, запутаешся потом.
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Re: Знак Саламандры
Глобальные переменные - остатки того позора, что был раньше (там еще и карта была глобальным массивом, расползшимся на все файлы в качестве extern), просто пока отлаживаю функции работы с картой удобно использовать глобальное позиционирование, героя.
По генератору - я хочу сделать один генератор, просто в качестве параметра передавать тип подземелья, который мне нужен, а он через case уже сам заполняет карту.
По поводу вынесения в отдельный класс - опять же пока проверяю как отрабатываются функции, удобней прямой доступ к ним в классе карты.
Спасибо за рекомендации
По генератору - я хочу сделать один генератор, просто в качестве параметра передавать тип подземелья, который мне нужен, а он через case уже сам заполняет карту.
По поводу вынесения в отдельный класс - опять же пока проверяю как отрабатываются функции, удобней прямой доступ к ним в классе карты.
Спасибо за рекомендации
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Знак Саламандры
Кстати, а что такого плохого, что карта является глобальным массивом данных?
Она же и правда, хмм, глобальна.
Она же и правда, хмм, глобальна.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Знак Саламандры
Карт может быть несколько (речь ведь о карте уровня, а не о глобальной карте).
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Знак Саламандры
Ага, понял. Тогда да, возможны варианты.kipar писал(а):Карт может быть несколько (речь ведь о карте уровня, а не о глобальной карте).
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Re: Знак Саламандры
А вы не подскажете как лучше это сделать - через объявление friend класса GameMap для генератора или создание отдельного класса, наследующего от GameMap и генератора?Yozka писал(а):И еще, на последок. У тебя проследуюется божественный код. Тоесть карта. она и рисуется и генерится. Все в одном. Это неправельно. Отдели генератор от карты. Пускай карта только рисуется, и идут проверки на предмет стен столкновений. Генератор вынеси отдельно. Это будет отдельный класс. у которого будет метод - генерировать(карта) на входе указатель на карту. Ибо генераторов может быть несколько. Один для подземелья, другой для замков, третий для городов итд. Поверь мне, нехорошо лепить все в один класс, запутаешся потом.
UPD: Хотя я тут почитал про паттерны и пока оставлю как есть - в планах чтобы мир генерировался целиком 1 раз при новой игре. Так что потом перепишу под "Строитель", а сейчас при проверке генераторов сойдет и так.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
Re: Знак Саламандры
В двух словах опишу.
Соотвественно от базового класса генератора создадим уже конкретный класс генерации подземельев
также можно сделать генератор и для других типов местности. Нужно унаследоватся от базового класса AGenerator и перекрыть (переписать) виртуальный метод generate.
Базовые алгоритмы, которые одинаковые для всех типовв подземелья, можно вынести в базовый класс.
Как пользоватся?
AGeneratorDungeon g; //создадим генератор
g.generate(map); //вызовим виртуальный метод генерации
Ну и карта, это класс AMap, у которого есть метод отвечающий за отрисовку на экране, возвращение размеров getWidth, getHeight. установка значение клеток setCell(координата x, координата y, тип клетки) и соответсвенно возвращение по координатам тип клетки getCell(x,y).
Код: Выделить всё
class AMap; //ага, позднее связывание, напишем название класса, реализацию его сделаем позже
// базовый класс генератора
class AGenerator
{
public:
virtual void generate(AMap * const map)=0;//абстрактный метод генерации подземелья
//далее идет общий функционал для генераторов, это может быть нахождение свободных мест
//выпиливание комнат итд.
void clear(AMap * const map); //очистить всю карту
void tunnelVert(AMap * const map, const int x, const int y); //пробеваем туннель вертикально,
//от точки x,y до первой совбодной клетки
...
}
Код: Выделить всё
class AGeneratorDungeon
: public AGenerator //у наследуюмся от базового класса
{
virtual void generate(AMap * const map) //угу, уже напишем кокнретную реализацию генератора
{
//примерно так, конечно саму реализацию нужно писать в *.cpp
clear(map);//очистим уровень
for (int y = 0; y < map->getHeight(); y++)
for(int x = 0; x < map->getWidth(); x++)
{
//заполним уровень случайными точками
if (random(3) == 1)
{
map->setCell(x, y, стена); //установим в клетку карты стену
}
}
}
}
Базовые алгоритмы, которые одинаковые для всех типовв подземелья, можно вынести в базовый класс.
Как пользоватся?
AGeneratorDungeon g; //создадим генератор
g.generate(map); //вызовим виртуальный метод генерации
Ну и карта, это класс AMap, у которого есть метод отвечающий за отрисовку на экране, возвращение размеров getWidth, getHeight. установка значение клеток setCell(координата x, координата y, тип клетки) и соответсвенно возвращение по координатам тип клетки getCell(x,y).
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Re: Знак Саламандры
Интересное решение, я примерно так и хотел сделать, единственное что хочу еще менеджера генерации добавить - ему передается указатель на Объект карты и тип генерации подземелья - он вызывает функцию генерации и создает объект AGeneratorDungeon.
Я даже черновой вариант успел набросать (правда там через создание и копирование временной карты - не знаю пока как поведет себя моя карта в случае генерации через BSP дерево в примере LibTCod - у меня же карта - находится в закрытой части класса)
Там после вывода надо энтер жать. Закоментированы строки, там где временный объект не существует.
А объект AGeneratorDungeon все равно существует только пока работает функция внутри менеджера, так что память не засоряется.
Я даже черновой вариант успел набросать (правда там через создание и копирование временной карты - не знаю пока как поведет себя моя карта в случае генерации через BSP дерево в примере LibTCod - у меня же карта - находится в закрытой части класса)
Там после вывода надо энтер жать. Закоментированы строки, там где временный объект не существует.
А объект AGeneratorDungeon все равно существует только пока работает функция внутри менеджера, так что память не засоряется.
- Вложения
-
- Builder.zip
- (257.9 КБ) 250 скачиваний
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
- ShadoWalkeR
- Сообщения: 12
- Зарегистрирован: 28 ноя 2009, 16:47
- Откуда: Челябинск
- Контактная информация:
Re: Знак Саламандры
К сожалению по определенными причинам не могу постоянно посвящать время рогалику, поэтому был большой перерыв
В общем поглядев на то, что наделано сделал самое верное решение - Ctrl+A, Shift+Del и взять за основу 7DRL - TrollSlayer - у него продуманная структура, и адаптирую его под свои нужды. Правда минус - там почти нет комментариев и приходится разгребать код большой лопатой)
Пока только доделал создание консоли и выход через Q
В общем поглядев на то, что наделано сделал самое верное решение - Ctrl+A, Shift+Del и взять за основу 7DRL - TrollSlayer - у него продуманная структура, и адаптирую его под свои нужды. Правда минус - там почти нет комментариев и приходится разгребать код большой лопатой)
Пока только доделал создание консоли и выход через Q
- Вложения
-
- 2011.10.17 - Salamandras sign.zip
- (1.72 МБ) 215 скачиваний
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer
SDL + LibTCod + TrollSlayer
Re: Знак Саламандры
не запускается. жалуется на отсутствующую библиотеку.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 45 гостей