Главная
Поиск
Карта сайта
Форум
Все страницы
Главное меню
Главная
Стандартный C++
Borland C++ 3.1
Borland C++ Builder
Учебник C++
Скачать программы
Гостевая
Форум
Учебник по созданию игр
Авторизация
Логин
Пароль
Запомнить меня
Забыли пароль?
Забыли логин?
Счетчики
Обмен ссылками
Блог программиста
Главная
Форум
Интересные программы.
Форум
Список форумов
Последние сообщения
Добро пожаловать Гость
[Зарегистрироваться]
Войти
Ответить
Тема :Интересные программы...
07-03-2010 03:11:21
rudolf
char
Онлайн с
: 24-02-2010 11:03:24
Сообщения
: 31
Среда обитания
:
0
Страдаю сейчас от такой проблемы: программировать интересно, но те задания, что дают в университете кажуться нетрудными и "скучными", а хотелось бы написать что-нибудь интересноо и хотя бы в какой-то степени полезное.
Если у кого есть подобные задания или просто возникли идеи - поделитесь пожалуйста.
IP сохранен
Цитировать
Тема :Re:Интересные программы...
10-03-2010 23:25:52
Captain
int main()
Онлайн с
: 28-03-2009 11:37:34
Сообщения
: 39
Среда обитания
:
0
На мой взгляд, интересную и нетривиальную задачу составляет написание игр. Для создания даже простейшей из представляющих хоть какой-то интерес игр придется использовать достаточно большое число языковых средств, и при этом работающий продукт принесет удовлетворение не только как жизнеспособное детище, но и как любая игра.
Марио, Танчики, Pacman... Неплохой повод попрактиковаться в использовании ООП, STL, работе с графикой, и еще много в чем.
IP сохранен
Цитировать
Тема :Re:Интересные программы...
14-03-2010 20:40:26
rudolf
char
Онлайн с
: 24-02-2010 11:03:24
Сообщения
: 31
Среда обитания
:
0
в большинстве игр надо использовать DirectX, с которым я совершенно не знаком.
Я думал над чем-нибудь интересным, где можно использовать ООП, и хватило бы всего лишь компанентов TImage для реализации графической части игры, но, что-то, на ум ничего интересного и толкового не приходит.
У меня есть игра, там где самолет летит и скидывает бомбу на мишень, но она какая-то скучная, да и из языков средств там мало чего задействовано...
IP сохранен
Цитировать
Тема :Re:Интересные программы...
15-03-2010 03:55:01
Captain
int main()
Онлайн с
: 28-03-2009 11:37:34
Сообщения
: 39
Среда обитания
:
0
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
Среда обитания
:
0
Из всего вами написанного могу сказать только про канву, что я с ней знаком, приходилось работать, и про двойную буфферизацию, которую я подключал
Form1->DoubleBuffering=true;
Спасибо за сообщение, буду дальше вникать в его содержание.
IP сохранен
Цитировать
Тема :Re:Интересные программы...
15-03-2010 13:00:38
Captain
int main()
Онлайн с
: 28-03-2009 11:37:34
Сообщения
: 39
Среда обитания
:
0
Я вот как раз DoubleBuffered никогда не использовал, да и, скорее всего, это не та буферизация. По логике вещей буферизация формы помогает корректному выводу "картинки" (результата работы одной функции рисования) в отдельности. Я же подразумеваю буферизацию каждого кадра в игре в целом. То есть это та буферизация, которую нельзя подключить, а нужно реализовывать. Коротенькое описание принципа и наглядную демонстрацию посмотрите по вышеприведенной ссылке.
IP сохранен
Цитировать
Тема :Re:Интересные программы...
15-03-2010 17:25:24
rudolf
char
Онлайн с
: 24-02-2010 11:03:24
Сообщения
: 31
Среда обитания
:
0
а можете поподробней рассказать что из себя представляет "банк текстур"?Или может есть места в интернете, где можно прочитать информацию о подобном?
IP сохранен
Цитировать
Тема :Re:Интересные программы...
17-03-2010 17:42:42
Captain
int main()
Онлайн с
: 28-03-2009 11:37:34
Сообщения
: 39
Среда обитания
:
0
Основное назначение банка текстур - хранить в себе картинки и по требованию рисовать их. При этом все необходимые картинки один раз загружаются с диска, а потом хранятся в оперативной памяти и используются по мере необходимости, что обеспечивает значительное увеличение быстродействия при приемлемых расходах оперативной памяти по сравнению с вариантом, когда все картинки каждый раз перед использованием загружаются с диска.
В принципе интерфейс банка текстур достаточно прост - у него есть конструктор, в котором происходит загрузка всех изображений, деструктор, освобождающий память, а также функция рисования нужного изображения в нужной точке экрана.
Внутренняя структура включает в себя список всех изображений, оформленный в зависимости от ваших предпочтений и соображений удобства использования. Это может быть простой динамический массив - тогда все изображения у вас просто пронумерованы, что не очень удобно, т.к. приходится постоянно смотреть, какой номер у нужной вам картинки. Более удобным я считаю хранение в виде ассоциативного массива (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
Среда обитания
:
0
Проблема вся в том, что мне не приходилось особо работать с граф. компонентами C++Builder, и я не очень представляю работу с графиком.
С чего начать?
IP сохранен
Цитировать
Тема :Re:Интересные программы...
26-03-2010 14:15:31
Captain
int main()
Онлайн с
: 28-03-2009 11:37:34
Сообщения
: 39
Среда обитания
:
0
Суть в том, что вся графика в компонентах 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 сохранен
Цитировать
Ответить
Страница #
5
10
15
20
25
30
50
100
Все
Powered by
ccBoard