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

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

12.05.2009, 21:08. Показов 102479. Ответов 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
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
03.08.2009, 21:28
Студворк — интернет-сервис помощи студентам
я читал читал, смотрел смотрел, так и не понял как у вас осуществлён поворот объекта типа TBitmap, может кто нить может объяснить?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
04.08.2009, 12:09
Так ведь поворот с помощью стандартных преобразований системы координат виндовса. Вот только если ты заметил, то только один вызов RotateDC не поможет, так как поворачивается еще и исходная точка нашего рисования. Чтобы такого не происходило нужно выполнять перед рисованием объекта функцию SetViewOrgExt, и сместить координаты 0,0 на точку от которой будет рисоваться фигура. После того как мы это сделали мы можем рисовать объект(картинку) на координату 0,0. 0,0, так как 0,0 не изменяется после поворота системы координат. После рисования данного объекта стоит вернуть систему координат в исходное положение. При рисовании следующего объекта нужно все это повторить.
Собственно все.
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
06.08.2009, 19:50
C++
1
2
3
4
5
6
7
8
XFORM xform;   
angle = angle * 3.1416 / 180.0;   
xform.eDx = 0.0f; 
xform.eDy = 0.0f; 
xform.eM11 = cos(angle); 
xform.eM12 = sin(angle); 
xform.eM21 = -sin(angle); 
xform.eM22 = cos(angle);
что это значит и что здесь вычисляется, объясните если не сложно

Добавлено через 10 минут 47 секунд
а ещё почемупри поворачивании объекта на угол он движется по окружности а не стоит на месте и поворачивается и как этого избежать?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
06.08.2009, 22:21
Я же говорю, что при поворотах используются апи функция. Эта функция использует структуру XFORM для указания того, как именно выполнять преобразования. Почему именно там и там всякие там синусы и косинусы я не знаю, но в МСДН написано использовать именно так. Я даже тебе ссылочку дам:http://msdn.microsoft.com/en-u... S.85).aspx
При разных параметрах можно получать поворот, масштабирование, сдвиг, смещение. Очень полезная функция, но, правда, замедляет вывод на экран.

Почему объект движется по окружности? Повторю еще раз:
Чтобы такого не происходило нужно выполнять перед рисованием объекта функцию SetViewOrgExt, и сместить координаты 0,0 на точку от которой будет рисоваться фигура. После того как мы это сделали мы можем рисовать объект(картинку) на координату 0,0. 0,0, так как 0,0 не изменяется после поворота системы координат. После рисования данного объекта стоит вернуть систему координат в исходное положение. При рисовании следующего объекта нужно все это повторить.
Если не совсем понятно, то посмотри в этой теме ответ №35(это я пытался объяснить как этим пользоваться).
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
07.08.2009, 11:07
спасибо, понял, всё работает)

Добавлено через 10 часов 20 минут 28 секунд
Otaka а как заставить объект перемещаться по прямой, т.е как заставить пулю лететь в нужную сторону? я знаю что через таймер, просто угол нам известен, сама картинка пули поворачивается в нужную сторону но я что то не пойму как описать её движение, не подскажешь?
И сразу как сделать так чтобы могло прорисовыватся столько пуль сколько нам нужно, и возможно ли это ведь для каждой пули надо описать такую конструкцию
C++
1
2
3
4
5
SetViewportOrgEx(back->Canvas->Handle,xf,yf,NULL);
RotateDC(back->Canvas->Handle,OldAngle+90);
back->Canvas->Draw(-1*gfire->Width/2,-1*gfire->Height/2,gfire);
SetViewportOrgEx(back->Canvas->Handle,0,0,NULL);
RotateDC(back->Canvas->Handle,0);
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
07.08.2009, 11:19
KTYJIX, вроде, как с этим разобрался. Объяснить еще раз?
У нас есть структура

C++
1
2
3
4
5
6
7
8
9
class Bullet
{
public:
  float x;
  float y;
  float speed_x;
  float speed_y;
  float angle;
}
Теперь нужно расчитать значения speed_x и speed_y для данного угла и скорости.
Не забудь, что функции синуса и косинуса работают с углами в радианах.
C++
1
2
3
4
5
6
7
8
9
10
Bullet*CreateBullet(float angle,float speed,int start_x,int start_y)
{
  Bullet*b=new Bullet();
  b->x=start_x;
  b->y=start_y;
  b->angle=angle;
  b->speed_x=cos(angle)*speed;
  b->speed_y=sin(angle)*speed;
  return b;
}
Теперь возвращенные этой функцией указатели ты должен сохранить в какой-нибудь список(TList например). Далее при обработке пуль ты в цикле обходи все элементы списка и приплюсовуй к x speed_x, а к y добавляй speed_y. Так вот все это делается.
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
07.08.2009, 14:03
спс, кажется понял, сейчас попробую сделать

Добавлено через 1 час 37 минут 54 секунды
извиняюсь за надоедливость и за тупые вопросы но я знаю ооп в общих чертах поэтому прошу объяснить как создать массив из объектов класса Bullet
C++
1
Bullet*b[300]=new Bullet();// это не правильно я что то вроде забыл?
Добавлено через 2 минуты 14 секунд
ну или динамический массив
C++
1
Bullet*b[n]=new Bullet();
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.08.2009, 14:04
"Bullet b[300];"

Если это в глобальной части - то время жизни массива - вся программа. Если внутри процедуры или лексического блока - соотвественно время жизни ограничивается парой фигурных скобок. Если тебе на каждого персонажа нужно выделять, а затем удалять массив - "Bullet *b = new Bullet[300];"
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
07.08.2009, 14:17
Нужно в цикле присваивать... Кроме того, конструктор без параметров так не вызывается. Нужно как-то так:
C++
1
2
Bullet *b[300];
for(int i = 0; i < 300; i++) b[i] = new Bullet;
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.08.2009, 14:29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h>   
int G;   
class C {   
  public:     
    int x;     
    C()     {       
      x = ++G;       
      cout << "constr " << x << endl;     
    }
 };   
int main (void) {   
  C *c = new C[10];     
  for (int i = 0; i < 10; i++)     cout << "val " << c[i].x << endl;     
  return 0; 
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
constr 1
constr 2
constr 3
constr 4
constr 5
constr 6
constr 7
constr 8
constr 9
constr 10
val 1
val 2
val 3
val 4
val 5
val 6
val 7
val 8
val 9
val 10
Добавлено через 1 минуту 49 секунд
Haster, в твоём способе имеется 300 указателей, а потом 300 раз выделяется объект. В моём способе имеется 1 указатель, а память под 300 объектов выделяется за раз. При этом, действительно, нельзя вызвать конструктор с параметрами, но для данной задачи, подозреваю, это неактуально, ибо сначала нужно иметь 300 пуль, а потом рассчитывать им координаты или что-то ещё
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
07.08.2009, 14:54
Evg, согласен, твой способ лаконичней ))
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.08.2009, 15:21
[XandeR], а вообще для вопросов по Си++ (безотносительно к теме игры) лучше создавай отдельную тему. Чтобы тут мусор не разводить
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
08.08.2009, 11:18
Haster спасибо) твой способ работает)
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
14.08.2009, 16:09  [ТС]
Otaka,как ты сделал чтоб у тебя второе окно вместе с первым открывалось?
Form2->Show() - у мну не работает почему то (
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.08.2009, 16:28
Так ты в редакторе свойств второй формы поставь Visible=true, и все.

Добавлено через 1 минуту 23 секунды
Form2->Show() ты наверно вызываешь в OnCreate формы1, а это событие происходит до создания формы2, поэтому и не получается.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
14.08.2009, 17:32  [ТС]
Слушай,а как у тебя работает механизм нажатия на выбранный таил,просто я код перекопировал с компонентами на свою форму,а клеточки пустые,и когда щёлкаю на них ничего не происходит (:
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.08.2009, 19:33
Ты имеешь ввиду на форме2(библиотека тайлов)?
Если да, то обрати внимание, что у стринггрида определено событие onClick(там оно называется sgTileClick()) и OnDrawCell(sgTileDrawCell).
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
14.08.2009, 21:15  [ТС]
Ок,начал делать переходы.

Otaka,чего то я подзабыл,как мне узнать число тайла.

Тобишь,что в нём находиться 1(песок) 2(трава) или ещё что то,чтоб он мне цифру выдал.
То есть,как работать с массивом где матричные числа хранятся.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.08.2009, 22:07
Ну, так как у нас информация о тайлах хранится в линейном массиве, то нужно сделать функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Tile_C_W;
int Tile_C_H;
...
//-----------------------------------
int GetTile(int x,int y)
{
return tile[y*Tile_C_W+x];
}
//------------------------------------
int SetTile(int x,int y,int TileIndex)
{
tile[y*Tile_C_W+x]=TileIndex;
}
Сделай там еще проверку на выпадение за границы массива, тобишь x и Tile_C_W, а y с Tile_C_W.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
15.08.2009, 18:56  [ТС]
У меня есть что то типа,вот этой картинки,как мне выводить его кусочками на экран.
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2009, 18:56

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru