Знак Саламандры

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Знак Саламандры

Сообщение ShadoWalkeR » 28 июн 2011, 14:47

Я только изучаю С++ и библиотеку LibTCod, уже несколько раз пытался задать здесь вопросы - но каждый раз сам решал их, так что просто прикладываю код с экзешниками.

Пишется все в Code::Blocks 10.05, заголовочные файлы от LibTCod помещаются в CodeBlocks\MinGW\include\LibTCod, от SDL CodeBlocks\MinGW\include\SDL

Если есть какие то советы, прошу отписать.

2011.07.05 - Переписал код, опять же хочу услышать комментарии
Вложения
20110705 - SS.zip
(1.54 МБ) 236 скачиваний
Последний раз редактировалось ShadoWalkeR 05 июл 2011, 17:10, всего редактировалось 1 раз.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: Знак Саламандры

Сообщение BreakMT » 28 июн 2011, 15:42

Окно обновляется только после действия? Если переключится на другое окно и вернуться в игровое - не обновится...

Ну а в целом - смотреть нечего, или я чего-то недопонял?

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Re: Знак Саламандры

Сообщение ShadoWalkeR » 28 июн 2011, 16:18

Ну по тому что я уже наваял общие рекомендации хотелось бы услышать, а то делаю, делаю, а как лучше будет не знаю.

По обновлению окна - пока только изучаю возможности, так что очень многого нет (в ближайшее время скорее всего и не будет - разбираюсь с алгоритмом генерации подземелья). Забыл сказать, что в обработчике клавиатуры есть комбинация "Shift r" - заново сгенерировать пещеру.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: Знак Саламандры

Сообщение Yozka » 28 июн 2011, 17:47

Извини, тебя буду критиковать.
Сорц 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;
};
присваение координат героя. когда у тебя одни объект то все номано.. НННООО когда ты от Character унаследуешь NPC или монстряка, то при движении монстряка или NPC ВНЕЗАПНО будет двигатся герой. шо не есть гуууудддд.

Как решить?
Уберай 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);

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: Знак Саламандры

Сообщение BreakMT » 28 июн 2011, 17:51

ShadoWalkeR писал(а):Ну по тому что я уже наваял общие рекомендации хотелось бы услышать, а то делаю, делаю, а как лучше будет не знаю.
А, понятно, рекомендации в плане кода? :-#

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: Знак Саламандры

Сообщение Yozka » 28 июн 2011, 17:57

И еще, на последок. У тебя проследуюется божественный код. Тоесть карта. она и рисуется и генерится. Все в одном. Это неправельно. Отдели генератор от карты. Пускай карта только рисуется, и идут проверки на предмет стен столкновений. Генератор вынеси отдельно. Это будет отдельный класс. у которого будет метод - генерировать(карта) на входе указатель на карту. Ибо генераторов может быть несколько. Один для подземелья, другой для замков, третий для городов итд. Поверь мне, нехорошо лепить все в один класс, запутаешся потом.

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Re: Знак Саламандры

Сообщение ShadoWalkeR » 29 июн 2011, 01:56

Глобальные переменные - остатки того позора, что был раньше (там еще и карта была глобальным массивом, расползшимся на все файлы в качестве extern), просто пока отлаживаю функции работы с картой удобно использовать глобальное позиционирование, героя.
По генератору - я хочу сделать один генератор, просто в качестве параметра передавать тип подземелья, который мне нужен, а он через case уже сам заполняет карту.
По поводу вынесения в отдельный класс - опять же пока проверяю как отрабатываются функции, удобней прямой доступ к ним в классе карты.

Спасибо за рекомендации
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Знак Саламандры

Сообщение Jolly Roger » 29 июн 2011, 05:19

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

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Знак Саламандры

Сообщение kipar » 29 июн 2011, 07:04

Карт может быть несколько (речь ведь о карте уровня, а не о глобальной карте).

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Знак Саламандры

Сообщение Jolly Roger » 29 июн 2011, 07:20

kipar писал(а):Карт может быть несколько (речь ведь о карте уровня, а не о глобальной карте).
Ага, понял. Тогда да, возможны варианты.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Re: Знак Саламандры

Сообщение ShadoWalkeR » 30 июн 2011, 12:39

Yozka писал(а):И еще, на последок. У тебя проследуюется божественный код. Тоесть карта. она и рисуется и генерится. Все в одном. Это неправельно. Отдели генератор от карты. Пускай карта только рисуется, и идут проверки на предмет стен столкновений. Генератор вынеси отдельно. Это будет отдельный класс. у которого будет метод - генерировать(карта) на входе указатель на карту. Ибо генераторов может быть несколько. Один для подземелья, другой для замков, третий для городов итд. Поверь мне, нехорошо лепить все в один класс, запутаешся потом.
А вы не подскажете как лучше это сделать - через объявление friend класса GameMap для генератора или создание отдельного класса, наследующего от GameMap и генератора?

UPD: Хотя я тут почитал про паттерны и пока оставлю как есть - в планах чтобы мир генерировался целиком 1 раз при новой игре. Так что потом перепишу под "Строитель", а сейчас при проверке генераторов сойдет и так.
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: Знак Саламандры

Сообщение Yozka » 30 июн 2011, 16:27

В двух словах опишу.

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

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, стена); //установим в клетку карты стену
                    }   
               }
     }
}
также можно сделать генератор и для других типов местности. Нужно унаследоватся от базового класса AGenerator и перекрыть (переписать) виртуальный метод generate.
Базовые алгоритмы, которые одинаковые для всех типовв подземелья, можно вынести в базовый класс.
Как пользоватся?
AGeneratorDungeon g; //создадим генератор
g.generate(map); //вызовим виртуальный метод генерации

Ну и карта, это класс AMap, у которого есть метод отвечающий за отрисовку на экране, возвращение размеров getWidth, getHeight. установка значение клеток setCell(координата x, координата y, тип клетки) и соответсвенно возвращение по координатам тип клетки getCell(x,y).

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Re: Знак Саламандры

Сообщение ShadoWalkeR » 30 июн 2011, 17:51

Интересное решение, я примерно так и хотел сделать, единственное что хочу еще менеджера генерации добавить - ему передается указатель на Объект карты и тип генерации подземелья - он вызывает функцию генерации и создает объект AGeneratorDungeon.
Я даже черновой вариант успел набросать (правда там через создание и копирование временной карты - не знаю пока как поведет себя моя карта в случае генерации через BSP дерево в примере LibTCod - у меня же карта - находится в закрытой части класса)
Там после вывода надо энтер жать. Закоментированы строки, там где временный объект не существует.
А объект AGeneratorDungeon все равно существует только пока работает функция внутри менеджера, так что память не засоряется.
Вложения
Builder.zip
(257.9 КБ) 250 скачиваний
Code::Blocks Nightly build + TDM-GCC + GDB
SDL + LibTCod + TrollSlayer

Аватара пользователя
ShadoWalkeR
Сообщения: 12
Зарегистрирован: 28 ноя 2009, 16:47
Откуда: Челябинск
Контактная информация:

Re: Знак Саламандры

Сообщение ShadoWalkeR » 17 окт 2011, 15:51

К сожалению по определенными причинам не могу постоянно посвящать время рогалику, поэтому был большой перерыв :)
В общем поглядев на то, что наделано сделал самое верное решение - 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

Аватара пользователя
KeeperVX
Сообщения: 117
Зарегистрирован: 29 ноя 2010, 12:21
Откуда: Санкт-Петербург

Re: Знак Саламандры

Сообщение KeeperVX » 28 окт 2011, 07:10

не запускается. жалуется на отсутствующую библиотеку.
Накормим планету сдобным рогаликом!
Изображение

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя