Авторизация



Счетчики

Обмен ссылками

Блог программиста
Главная Форум Интересные программы.
 Форум
Добро пожаловать Гость   [Зарегистрироваться]  Войти
Ответить
 Тема :Интересные программы... 07-03-2010 03:11:21 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Страдаю сейчас от такой проблемы: программировать интересно, но те задания, что дают в университете кажуться нетрудными и "скучными", а хотелось бы написать что-нибудь интересноо и хотя бы в какой-то степени полезное.
Если у кого есть подобные задания или просто возникли идеи - поделитесь пожалуйста.
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 10-03-2010 23:25:52 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
На мой взгляд, интересную и нетривиальную задачу составляет написание игр. Для создания даже простейшей из представляющих хоть какой-то интерес игр придется использовать достаточно большое число языковых средств, и при этом работающий продукт принесет удовлетворение не только как жизнеспособное детище, но и как любая игра.
Марио, Танчики, Pacman... Неплохой повод попрактиковаться в использовании ООП, STL, работе с графикой, и еще много в чем.
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 14-03-2010 20:40:26 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
в большинстве игр надо использовать DirectX, с которым я совершенно не знаком.
Я думал над чем-нибудь интересным, где можно использовать ООП, и хватило бы всего лишь компанентов TImage для реализации графической части игры, но, что-то, на ум ничего интересного и толкового не приходит.
У меня есть игра, там где самолет летит и скидывает бомбу на мишень, но она какая-то скучная, да и из языков средств там мало чего задействовано...
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 15-03-2010 03:55:01 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
DirectX - это, конечно, хорошо, но на первых порах вполне можно (и нужно!) обойтись и без него. В самом деле, сначала нужно разобраться с логикой создания игр и языковыми средствами. В C++ Builder'е вы можете с успехом использовать канву (Form1 -> Canvas).
Для начала вы можете попрактиковаться с рисованием примитивов с помощью функций TCanvas - Ellipse, Rectangle, FillRect, MoveTo, LineTo.
Потом, как освоитесь, используйте картинки. Создайте т.н. "банк текстур" - класс с массивом (динамическим) объектов типа картинка. В объекте картинки будет располагаться объект типа Graphics::TBitmap, параметры, такие как размеры изображения, конструктор, деструктор, функция рисования. Кстати, с TBitmap'ом вам придется работать через указатели, так что придется динамически выделять и освобождать память...
Сам банк текстур будет иметь конструктор, в котором происходит загрузка изображений с диска (информацию о необходимых файлах читаем еще из какого-нибудь файла), деструктор, освобождающий память, собственно массив картинок (удобно хранить их в ассоциативном массиве std::map, проиндексированном по строкам), функция рисования картинки по идентификатору (та самая строка, по которым картинки проиндексированы).
Вот вам уже в одном только рисовании использование ООП и STL.

А из игр - почему бы не реализовать танчики? Несколько танков на карте - объекты, препятствия - тоже объекты, пули - опять же объекты. При этом объекты могут уничтожаться, поэтому удобно использовать списки (std::list), так что вот вам вновь ООП и стандартные контейнеры.

При всем при этом вряд ли вы захотите хранить все яйца в одной корзине, то бишь весь код в одном файле, поэтому графика у нас пойдет в одну пару *.h - *.cpp, логика игры - в другой, а в главном файле будет их взаимодействие с интерфейсом программы, да еще и каждый модуль поместим в свое собственное пространство имен. Вот вам и работа с раздельно компилируемыми файлами.

Да, еще по поводу графики - тут уж никуда без двойной буферизации (смотрим здесь: http://trivialcoding.ru/Programs/Borland-C-Builder/flame-double-buffering.html).

В общем, и без использования сложных графических средств есть в чем попрактиковаться! При этом не обязательно использовать сразу все - например, для начала в игре Танчики можно рисовать танки, пули и препятствия примитивами, забыв напрочь про банк текстур, и вовсю налегая на ООП. Потом в отдельном проекте потренироваться в создании и загрузке картинок и легко перенести весь интерфейс и код в игру. А потом раскидать все по разным файлам и пространствам имен.
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 15-03-2010 04:59:47 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Из всего вами написанного могу сказать только про канву, что я с ней знаком, приходилось работать, и про двойную буфферизацию, которую я подключал
Form1->DoubleBuffering=true;
Спасибо за сообщение, буду дальше вникать в его содержание.
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 15-03-2010 13:00:38 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Я вот как раз DoubleBuffered никогда не использовал, да и, скорее всего, это не та буферизация. По логике вещей буферизация формы помогает корректному выводу "картинки" (результата работы одной функции рисования) в отдельности. Я же подразумеваю буферизацию каждого кадра в игре в целом. То есть это та буферизация, которую нельзя подключить, а нужно реализовывать. Коротенькое описание принципа и наглядную демонстрацию посмотрите по вышеприведенной ссылке.
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 15-03-2010 17:25:24 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
а можете поподробней рассказать что из себя представляет "банк текстур"?Или может есть места в интернете, где можно прочитать информацию о подобном?
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 17-03-2010 17:42:42 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Основное назначение банка текстур - хранить в себе картинки и по требованию рисовать их. При этом все необходимые картинки один раз загружаются с диска, а потом хранятся в оперативной памяти и используются по мере необходимости, что обеспечивает значительное увеличение быстродействия при приемлемых расходах оперативной памяти по сравнению с вариантом, когда все картинки каждый раз перед использованием загружаются с диска.
В принципе интерфейс банка текстур достаточно прост - у него есть конструктор, в котором происходит загрузка всех изображений, деструктор, освобождающий память, а также функция рисования нужного изображения в нужной точке экрана.
Внутренняя структура включает в себя список всех изображений, оформленный в зависимости от ваших предпочтений и соображений удобства использования. Это может быть простой динамический массив - тогда все изображения у вас просто пронумерованы, что не очень удобно, т.к. приходится постоянно смотреть, какой номер у нужной вам картинки. Более удобным я считаю хранение в виде ассоциативного массива (std::map), где изображения проиндексированы по строкам (идентификаторам).

При всем при этом, скорее всего, у вас будет отдельный класс для картинок, даже если они статичны. Ценность выделения их в отдельный класс вместо использования просто TBitmap особо ощутимой становится когда вы захотите сделать картинки с анимацией, поскольку усложненная процедура рисования такой картинки перекладывается на плечи самого этого класса, избавляя класс банка текстур от необходимости самому разбираться во внутреннем устройстве своих членов.

Кстати, один совет: поскольку при рисовании вам вокруг да около придется пользоваться парами чисел (координаты, размеры), то можно оформить эти пары в виде простой структуры:
Code:
struct MyPoint { MyPoint(int x = 0, int y = 0); int X, Y; }; MyPoint::MyPoint(int x, int y): X(x), Y(y) { }
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 26-03-2010 12:27:39 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Проблема вся в том, что мне не приходилось особо работать с граф. компонентами C++Builder, и я не очень представляю работу с графиком.
С чего начать?
IP сохранен
Цитировать
 Тема :Re:Интересные программы... 26-03-2010 14:15:31 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Суть в том, что вся графика в компонентах C++ Builder'а сведена к компоненту Canvas, имеющим тип TCanvas и являющийся членом некоторых других компонентов (TForm, TImage, TPaintBox, TBitmap...). Поэтому на всех этих компонентах можно рисовать, используя канву (Canvas), обеспечивая при этом совместную работу Canvas'ов различных компонентов.

Теперь коротко о рисовании с помощью Canvas. Можно получить доступ к отдельным пикселям канвы с помощью члена Pixels, являющегося двумерным массивом объектов типа TColor (кстати, система координат берет свое начало в левом верхнем углу компонента, ось X направлена слева направо, а ось Y - сверху вниз):
Code:
int x = 10, y = 20; if (Form1 -> Canvas -> Pixels[x][y] == clRed) Form1 -> Canvas -> Pixels[x][y]= TColor(0x00FF0000);

Тип TColor - это тип цвета. Для него существуют предопределенные константы, такие как clRed, clGreen, clBlue, clWhite, clSilver, clBtnFace и многие другие (вы можете посмотреть их список, например, открыв выпадающий список в Object Inspector в поле Color, например, компонента формы Form1). Также цвет можно определить на основе его RGB-представления. На первые знака в шестнадцатиричном представлении можете не обращать внимания без особой надобности - они обуславливают выбор палитры (их значения - 0x00, 0x01, 0x02). Как правило цвет будет определяться числом такого вида:
Code:
0x00BBGGRR
где RR - байты, отвечающий за красный цвет в представлении RGB, GG - за зеленый, BB - за синий (да, порядок цветов в записи обратный по отношению к аббревиатуре).

Цвета вам понадобятся также и для определения цветов рисуемых линий и цветов заливки внутренней области замкнутых фигур. Цвет линий хранится в члене Pen (тип TPen) компонента Canvas, а цвет заливки - в члене Brush (тип TBrush):
Code:
Form1 -> Canvas -> Pen -> Color = clLime; Form1 -> Canvas -> Brush -> Color = TColor(0x00FF0000); Form1 -> Canvas -> FillRect(TRect(10, 10, 50, 30));

Этот код нарисует прямоугольник со светло-зеленой окантовкой и синим цветом внутренней заливки.

Сделает это функция FillRect, принимающая в качестве аргумента объект типа TRect, который в свою очередь представляет прямоугольник. Конструктор типа TRect принимает четыре аргумента: первые два - это координаты верхнего левого угла прямоугольника (x, y), последние два - координаты правого нижнего угла.
Существуют и другие функции для рисования, такие как Ellipse (рисует эллипс, вписанный в прямоугольник, аргумент имеет тип TRect), MoveTo (переводит рисующий курсор в точку с указанными координатами, аргументы - координаты), LineTo (рисует прямую линию, исходящую из предыдущей позиции рисующего курсора, и заканчивающуюся в указанной точке, при этом переводя курсор в эту последнюю точку; аргументы - координаты этой точки) и другие (смотрите справку в разделе Methods на странице компонента TCanvas).

Еще одна крайне полезная функция - CopyRect, копирующая часть изображения в канву текущего компонента из канвы другого компонента. Ее аргументы - прямоугольник, в который вы будете копировать, Canvas из которого происходит копирование и копируемый прямоугольник в этом Canvas'е.
Code:
Form1 -> Canvas -> CopyRect(TRect(100, 100, 200, 150), Image1 -> Canvas, TRect(0, 0, 100, 50));

Этот код скопирует прямоугольник из Image1 в Form1.

***

Вот все основы, которых, на мой взгляд, достаточно для знакомства с рисованием в Borland C++ Builder. Если что-то я забыл - спрашивайте, объясню.
IP сохранен
Цитировать
Ответить
Страница # 


Powered by ccBoard