Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/516: Рейтинг темы: голосов - 516, средняя оценка - 5.00
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168

Создание игры(2d)

12.05.2009, 21:08. Показов 100140. Ответов 423
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно идея такого создать нечто на подобиe ->
http://www.newgrounds.com/portal/view/494301

Буду сюда задвать свои вопросы,думаю всем кто будет увлечён создание игры тоже будет интресно)

Otaka,этот задний буфер замещает собой background плюс курсор оставляет на неём свои артефакты,как его очищать,да так чтоб ещё и background у нас был.

________________________________________ ________________________________________ _________________________
Основные моменты
Вычисление угла поворота персонажа в зависимости от положения курсора мыши
То же
Поворот изображения(тут еще как смещать точку поворота)
Делаем пули
Все еще непонятки с пулями
Начинаем вычисление коллизий
Идея про то, как это должно быть
Как это должно быть реализовано
Как повернуть массив точек(регион)?
А тут код(в нем есть глюк. Потом есть исправленная версия)
Находим столкновение региона и линии. Исправленная версия столкновения регионов
Как это должно выглядеть в принципе?
Начинается долгое обсуждение того как делать редактор уровней
...
...
Первый вариант редактора
Снова эти пули
Функция которая бьет изображения на мелкие куски(тайлы)
Версия редактора
Загрузка сохранение
Еще версия
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2009, 21:08
Ответы с готовыми решениями:

Создание игры
Извините за очередную тему подобного рода, но все же не могу не спросить: Мечтаю о создании игры, пусть и очень простой.. Сейчас для меня...

Создание игры
Доброго времени суток! Лабораторная работа - сделать игру. Есть идея. Нужны любые советы, коментарии, пожелания и критика. Спасибо! ...

Создание игры
Люди есть у кого нибудь исходники игры на подобие игр от ALAWAR, что бы разобрать и поучиться на этом примере? Или подскажите где можно...

423
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.05.2009, 17:39
Студворк — интернет-сервис помощи студентам
а ты написал
C++
1
TTList<TBullet*>*bullets;
как член данных формы? или как глобальную переменную на худой конец?

C++
1
2
3
4
5
6
7
class TTList;
class TForm1 : public TForm
{
...
public:
TTList<TBullet*>*bullets;
}
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
26.05.2009, 17:43  [ТС]
Ясен,всё заработало.

C++
1
bullets->Get
Что Get делает?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.05.2009, 17:49
Берем элемент по индексу i, и возвращаем его указатель.
C++
1
2
3
4
if(bullets->Get(0)->X>Form1->Width)
{
//удалить пулю 0, так как она вылезла за экран.
}
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
26.05.2009, 18:54  [ТС]
XDDD Когда больной,совсем туплю.
Как движение организовать через X,Y,dX,dY
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.05.2009, 20:43
Очень просто.
Создаешь пулю так
C++
1
2
3
4
5
6
TBullet*bul=new TBullet();
bul->X=Позиция Х нашего персонажа.
bul->Y=Позиция Y нашего персонажа.
 
bul->dx=cos(angle)*HodbaSpeed;
bul->dy=sin(angle)*HodbaSpeed;
а движение так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i=0;i<bullets->Count;i++)
{
//Перемещаем пули
bullets->Get(i)->X+=bullets->Get(i)->dX;
bullets->Get(i)->Y+=bullets->Get(i)->dY;
 
//Смотрим не вылезли ли они за экран
if((bullets->Get(i)->X>PoleWidth)||(bullets->Get(i)->X<0)||
(bullets->Get(i)->Y>PoleHeight)||(bullets->Get(i)->Y<0)||)//Например мы вылезли за экран
     {
     delete bullets->Get(i);//Очищаем память
     bullets->Delete(i);//Удаляем указатель из списка
     i--;
     }
}
Вот и все.

Добавлено через 34 секунды
Не забудь, что угол должен быть в радианах
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
26.05.2009, 21:17  [ТС]
Слушай вообе мега вопрос

Вот допустим если мы пишем
C++
1
2
3
4
5
6
[+]void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Блаблабла....
....
........
};
И вот слева от Void стоит [+] И если на него нажать,то весь код скрываеться,а как жтот плюс где угодно создавать,а то просто в таймере код громадный и ореинтироваться неудобно)))))))
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.05.2009, 21:49
В 6 такого нету. Поэтому не знаю. В Вижуале можно выделить кусок и нажать некую хитрую кнопочку, и создается такая же скрываемая область.

Добавлено через 24 минуты 37 секунд
Чтобы в одной функции код не разростался очень сильно, подели его на отдельные функции. Найди повторяющиеся куски, или куски которые делают приблизительно одинаковые операции, или например обработку пуль вынеси в ProcessBullet, обработку свалкера в ProcessSvalker, и тд. Тогда ничего разростаться не будет. И все сразу станет понятнее. В твоем распоряжении вся мощь ООП - классы. Хорошо бы разбить(произвести декомпозицию) задачи на подзадачи, и устроить управляющие классы. Правда если ты так сходу сядешь без опыта проэктирования, то ничего путнего не выйдет, тут нужен опыт( мне его тоже ооооочень недостает в таких делах).
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
11.06.2009, 00:08  [ТС]
Вопрос назрел. Вот смотри, мы с тобой умеем поворачивать, перемещать картинку,а как насчёт её маштаба?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
11.06.2009, 16:57
StretchBlt рисует в любом масштабе.
В myclasses.cpp там в классе ExtImage есть StretchDrawTo().
Так вот, берешь создаешь TRect r(0,0,картинка->Width*МАСШТАБ,картинка->Height*МАСШТАБ).
А потом
картинка->StretchDrawTo(BG->Canvas->Handle,&r,угол). и таким образом все будет нарисовано под углом.
Наверное, надо бы в реализацию функции внести SetViewportOrg, для того, чтобы поворачивать относительно центра.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
15.06.2009, 23:44  [ТС]
Как делать сглаживание через GDI+?(после того как я его #Include gdiplus.dll)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
16.06.2009, 15:23
Вот так написано в MSDN:
C++
1
2
3
4
5
6
7
8
9
10
11
12
VOID Example_SetSetSmoothingMode(HDC hdc)
{
   Graphics graphics(hdc);
 
   // Set the smoothing mode to SmoothingModeHighSpeed, and fill an ellipse.
   graphics.SetSmoothingMode(SmoothingModeHighSpeed);
   graphics.FillEllipse(&SolidBrush(Color(255, 0, 0, 0)), 0, 0, 200, 100);
 
   // Set the smoothing mode to SmoothingModeHighQuality, and fill an ellipse.
   graphics.SetSmoothingMode(SmoothingModeHighQuality);
   graphics.FillEllipse(&SolidBrush(Color(255, 0, 0, 0)), 200, 0, 200, 100);
}
Ты это хотел узнать?
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
16.06.2009, 20:02  [ТС]
А чтоб GDI+ можно?) И как твой способ использовать?)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
16.06.2009, 20:45
Чет не понял. Graphics graphics(hdc) - это же из Gdi+, разве нет? Какой способ?
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
16.06.2009, 22:22  [ТС]
Как это код использовать для отдельны компонентов,допустим я хочу ,чтоб у меня гг был сглаженый мне сделать так?
C++
1
Example_SetSetSmoothingMode(ГГ)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
16.06.2009, 22:29
Даже и не знаю. Готовый компонент может и нельзя заставить сглаживаться, а может и можно. хз.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
17.06.2009, 19:34  [ТС]
Я тут написал проверку его местоположения,чтоб он с объектами сталкивался.
А вот что делать если, он повернут я не знаю?(просто мой код подходит, если он имеет градус 0,90,180,270)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void Move()
{
//Обозначим переменные ближайшего объекта
int Xd = 170;
int Yd = 180;
int Xm = 356;
int Ym = 375;
int Xsmesh = Stalker->Width/2;
//Проверяем не сталкнёться ли ГГ с объектом
if (IsRightDown == true){
if (StPosX+speed>Xd && StPosX<Xm && StPosY>Yd && StPosY<Ym){}
else{
//если нет двигаем его
   StPosX += speed;
   StPosMinusX+= speed;
    }
}
if (IsLeftDown == true){
   if (StPosX-speed<Xm && StPosX>Xd && StPosY>Yd && StPosY<Ym){}
   else{
   StPosX -= speed;
   StPosMinusX -= speed;
  }
}
if (IsDownDown == true){
   if (StPosX>Xd && StPosX<Xm && StPosY+speed>Yd && StPosY<Ym){}
   else{
   StPosY += speed;
   StPosMinusY   += speed;
   }
}
if (IsUpDown == true) {
   if (StPosX>Xd && StPosX<Xm && StPosY-speed<Ym && StPosY>Yd){}
   else{
   StPosY -= speed;
   StPosMinusY  -= speed;
   }
}
}
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
17.06.2009, 19:46
А ты делай не так.
Предположим, что у тебя есть Rect(прямоугольник) твоего перса и все Rectы препятствий. Берешь, на основе поворота вычисляешь будущее положение персонажа и создаешь новый TRect tempPos. Потом в цикле смотришь, не сталкивается ли этот tempRect с различными объектами, если сталкивается, значит никуда не идем, а стоим на месте. Если ни одного столкновения не обнаружено, то позиция нашего персонажа становится такой же как и в tempPos. Пересечение Ректов - Апи функция IntersectRect. Способ универсальный, должен работать.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
17.06.2009, 20:01  [ТС]
А как это в коде выглядит написать можешь,если влом не пиши сам попробую)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
17.06.2009, 20:20
Создаешь рект
C++
1
TRect tp(StalkerPosX-10,StalkerPosY-10,StalkerPosX+10,StalkerPosY+10);//Предполагаю, что перс - квадратик 20*20
Определяем координаты нового положения.
C++
1
2
int ndx=cos(StalkerAngle)*Stalker_Speed;
int ndy=sin(StalkerAngle)*Stalker_Speed;
Смещаем наш прямоугольник с персонажем в его типа будущую позицию:
C++
1
2
3
4
tp.Left+=dx;
tp.Right+=dx;
tp.Top+=dy;
tp.Bottom+=dy;
Все, желаемые координаты получены. Вычисляем коллизии:
Я предполагаю, что препятствия находятся в массиве TRect Prep[PrepCol];
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TRect intRect;//Никому не надо, но функция пересечения требует.
bool Finded=false;//Мі еще ни с чем не столкнулись
for(int i=0;i<PrepCol;i++)
     {
     if(IntersectRect(&intRect,&tp,&Prep[i]))
            {
            Finded=true;//Нашли столкновение
            break;
            }
     }
if(Finded==false)
     {
     stalkerPosX=tp.Left+10;
     stalkerPosY=tp.Top+10;
     }
Вроде бы ничего не забыл.

Добавлено через 1 минуту 15 секунд
Враги, кстати, это тоже препятствия, поэтому ты их тоже обрабатывай.

Добавлено через 4 минуты 40 секунд
Враги тоже должны делать такие же обработки. Поэтому лучше всего, если ты сделаеш,к примеру, класс CPeople в нем реализуешь такие вот функции как хождение, рисование себя на экране и тд, а потом наследуй от него несколько классов CHunter(это типа игрок), CZombie1, CZombie2, CSupperZombie(это если ты хочешь, чтобы были немного разные враги: обычные, главари...) и тд.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
17.06.2009, 21:30  [ТС]
А каким образом это будет работать в таком случае?
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.06.2009, 21:30
Помогаю со студенческими работами здесь

Создание игры
Здравствуйте форумчане, мой вопрос состоит в том. Я молодой парень, который знает языки C++, C# и т.д. Ести небольшой интерес к созданию...

Создание игры
Добрый вечер. Начал работу над собственным проектом, и задался вопросом. (gamedev и прочие сайты перечитывал, но так ответа и не нашел....

Создание игры
Посмотрел как сейчас на коленке люди клепают инди игры под андроид\иос e.t.c. Созрел вопрос - куда двинуть, что использовать чтобы написать...

Создание игры на C++
Скажите , а можно ли создавать игры на С++? Если да , то буду рад увидеть примеры как это все реализовать и где можно. Возможно это С++...

Создание 3д игры
Извиняюсь, если такая тема уже была, не нашел. Хочу написать свою игрушку. Игрушка по типу что то gta sa. Но со своим смыслом и тп. Я готов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru