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

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

12.05.2009, 21:08. Показов 102377. Ответов 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
22.07.2009, 19:14
Студворк — интернет-сервис помощи студентам
Отлично. Для начала пойдет. Теперь ты должен смастерить нечто типа редактора, в котором можно будет выбирать размер уровня и мышкой рисовать этими тайлами, результат (структура уровня) будет сохранятся в файл. Ты должен выбрать некоторую структуру файла сохранения.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
23.07.2009, 22:42  [ТС]
Теперь ты должен смастерить нечто типа редактора, в котором можно будет выбирать размер уровня и мышкой рисовать этими тайлами, результат (структура уровня) будет сохранятся в файл. Ты должен выбрать некоторую структуру файла сохранения.
Я как понял, для этого надо посмотреть туторы по графическому редактору в билдере(что то типо MS Paint).А вот насчёт структуры можешь по точнее написиать,или на туториал какой нибудь ссылку кинуть?

Добавлено через 4 часа 54 минуты 28 секунд
Полезный материал на данную тематку: http://netra.narod.ru/files/tiles.html

Добавлено через 3 часа 50 минут 2 секунды
C++
1
2
3
4
if (0 < map_pos_x < map_size_x) {
if (IsRightDown == true) {map_pos_x += 1;}
if (IsLeftDown == true) {map_pos_x -= 1;}
}
Почему if (0 < map_pos_x < map_size_x) не работает?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
24.07.2009, 11:16
C++
1
if (0 < map_pos_x < map_size_x)
чет я не совсем понял, что ты хочешь этим сделать, но думаю, что лучше разбить это на два условия.
Насчет структуры файла:
Для того, чтобы можно было создавать, хранить и загружать уровни из файла, нужно придумать способ хранения этого самого уровня в файле. Что там должно сохраняться:
Версия файла уровня.
Размеры(в клеточках) X,Y.
Информация о тайлах.
Информация об объектах.
Информация про живых существ(врагов, друзей).

Нужно выбрать приемлемый способ хранения всего этого. Вариантов масса - простой текстовый файлик, XML(достаточно удобно), бинарный файл с придуманной нами структурой (я так всегда делаю).

Вот как я всегда делаю в таких случаях.
В файле myclasses.cpp есть класс TFStream, им то мы и воспользуемся.
C++
1
TFStream*file=new TFStream("level1.lvl",fmCreate);
А теперь по созданной ранее структуре файла, мы его начинаем заполнять.
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
#define SAVE_FILE_VERSION 1
...
file->Put(SAVE_FILE_VERSION);//Версия нам нужна для того, чтобы в случае изменения, по каким-то нашим мотивам, способа хранения данных, программа могла разобраться, каким же способом хранит информацию данный файл.
 
file->Put(“LEV_SIZE”);//Я думаю, что удобно перед каждой записью ставить её название, так гораздо проще расширять данный файл.
file->Put(map_size_x);
file->Put(map_size_y);//Я предполагаю, что здесь у нас размер карты в клеточках
 
file->Put(“TAILE”);
for (int j=0;j<map_size_y;j++)
    for (int i=0;i<map_size_x;i++)
        {
        file->Put(map_info[i][j]);//Я не знаю, где у тебя там хранятся номера тайлов карты.
}
file->Put(“OBJECT”);
file->Put(Obj->Count); //Записали количество объектов.
//У каждого объекта и непися собственная сложная структура, поэтому её еще нужно придумать, но пока ничего с ними можно и не делать. 
...
 
file->Put(“NPC”);
file->Put(npc->Count);
…
…
…
delete file;

Загружать все тоже очень просто:
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
40
int version=file->GetInt();
if (version==1)
{
while (file->Size!=file->Position)
{
    String Mark=file->GetString();//Получили название записи.
    
if(Mark==”LEV_SIZE”)
        {
        map_size_x=file->GetInt();
        map_size_y=file->GetInt();
delete [] map_info;
map_info=new int[map_size_x* map_size_y];
}
        if(Mark==”TAILE”)
            {
for(int j=0;j<map_size_y;j++)
    for(int i=0;i<map_size_x;i++)
        {
        map_info[i][j]=file->GetInt();
}
            }
        if(Mark==”OBJECT”)
            {
int ObjCount=file->GetInt();
for(int i=0;i<ObjCount;i++)
    {
    LoadObj(file);
}
}
        if(Mark==”NPC”)
            {
int NPCCount=file->GetInt();
for(int i=0;i<NPCCount;i++)
    {
    LoadNPC(file);
}
}               
}
}
Вот так вот, ну и, конечно же, записываем туда еще все то, что понадобится.
Хотя есть еще и другие варианты записи, но я люблю сохранять все так.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
27.07.2009, 13:05  [ТС]
Так,что то до меня никак не доходит.
Как мне отслеживать какая часть карты сейчас на экране,потом узнавать какая эта часть матрицы,и из неё брать числа,а в зависимости от этих чисел выводить текстуру на экран?
0
Человек
 Аватар для mustardandrew
97 / 82 / 7
Регистрация: 16.06.2009
Сообщений: 229
27.07.2009, 13:51
Как мне отслеживать какая часть карты сейчас на экране
Тебе нужно хранить координаты Свалкера на карте
(х, у), а также смещение (хо, уо), которое будет показывать смещение в клетке
карты, так как у тебя Свалкер наверно меньший за одину клетку.

После чего тебе необходимо обсчитывать количество клеток
на основе центральных координат.
После чего выводить на канвас картинки используя смещение.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 14:25
Все правильно. Свалкер находится у тебя в клетке X=x/Taile_sizex Y=y/Taile_size_y.
X,Y - это будет номер центрального тайла. Теперь нужно взять еще парочку тайлов влево, вправо, вверх, вниз, чтобы закрасить экран.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
27.07.2009, 14:59  [ТС]

Не по теме:

Off top:Otaka репутация:666 - этоне к добру =)



Мы говорим про редактор сейчас.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 18:13
Вот я тебе набросал остовчик для редактора.
Вложения
Тип файла: rar Editor.rar (93.8 Кб, 32 просмотров)
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
27.07.2009, 18:18  [ТС]
Из-за кучи ошибок,не запустился.

[BCC32 Error] Unit1.cpp(42): E2450 Undefined structure 'ExtImage'
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 19:49
myclasses.cpp пложи в папку с исходниками и измени там
C++
1
#include "myclasses.cpp"
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
27.07.2009, 20:16  [ТС]
Можешь ещё раз кинуть,просто часть кода в "myclasses.cpp" у меня не работала пришлось удалить,щас если скинишь,я покажу какие ошибки)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 20:38
Думаю, что так будет лучше.
Вложения
Тип файла: rar Editor.rar (408.8 Кб, 137 просмотров)
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
27.07.2009, 20:50  [ТС]
Эх,просто обалденно,мнеб теперь разобраться бы ещё в коде
А так очень круто

Посмотри кстати,как тут устроенно,нам не составит труда сделать так же?
Вложения
Тип файла: rar game004-tiles.rar (130.9 Кб, 106 просмотров)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.07.2009, 21:07
Ты имеешь ввиду авто создание пограничных зон(или переходов)?
В принципе это несложно.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
28.07.2009, 15:44  [ТС]
Вот,ошибки сдесь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Create(String MappingName,String FileName)
        {
        file=INVALID_HANDLE_VALUE;
        if(FileName!="" && FileName!="0")
                {
                file=CreateFile(FileName.c_str(),GENERIC_READ|GENERIC_WRITE,
                                FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,
                                FILE_ATTRIBUTE_NORMAL,NULL);
                if(file==INVALID_HANDLE_VALUE)throw "Error FileMapping. File not found";
                }
 
        FMap=CreateFileMapping(file,NULL,PAGE_READWRITE,0,MaxSize,MappingName.c_str());
        Base=MapViewOfFile(FMap,FILE_MAP_ALL_ACCESS,0,0,0);
        if(Base==NULL)throw "Can't Mapp the file";
        }
};
1) [BCC32 Error] myclasses.cpp(316): E2034 Cannot convert 'wchar_t *' to 'const char *'
2) [BCC32 Error] myclasses.cpp(316): E2342 Type mismatch in parameter 'lpFileName' (wanted 'const char *', got 'wchar_t *')
C++
1
 FILE_ATTRIBUTE_NORMAL,NULL);
3) [BCC32 Error] myclasses.cpp(320): E2034 Cannot convert 'wchar_t *' to 'const char *'
4) [BCC32 Error] myclasses.cpp(320): E2342 Type mismatch in parameter 'lpName' (wanted 'const char *', got 'wchar_t *')
C++
1
 FMap=CreateFileMapping(file,NULL,PAGE_READWRITE,0,MaxSize,MappingName.c_str());
Добавлено через 3 часа 19 минут 54 секунды
И что такое ExtImage,и чем он нам поможет?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.07.2009, 16:26
Да ExtImage, я использовал для того, чтобы не морочить себе голову с jpg,bmp, а так можно использовать обычный TBitmap.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
28.07.2009, 17:05  [ТС]
Хе-хе
C++
1
BG->Canvas->Draw(x,y,tiles_b[tile[(indy+j)*Tile_C_W+(indx+i)]]);
Что здесь происходит =)
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.07.2009, 18:16
Тут "хитрый" код рисования тайла в бэкбуффер. ты эту строку вырвал из цикла, который определяет что нужно рисовать на экран. Вот собственно эта функция
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
void TForm1::DrawTiles()
{
int VisibleTileCountX=Form1->ClientWidth/100+1;
int VisibleTileCountY=Form1->ClientHeight/100+1;
Back->Canvas->Brush->Color=clBlack; //Хотя очистка по сути и не нужна.
Back->Canvas->FillRect(Rect(0,0,Back->Width,Back->Height));
 
int indx=sbW->Position/100.0;//Получаем индекс первого рисуемого блока по X
int indy=sbH->Position/100.0;//по Y
 
int x;
int y=(sbH->Position-indy*100)*-1;
for(int j=0;j<VisibleTileCountY;j++,y+=100)
        {
        if((j+indy)>=Tile_C_H)break;
        x=(sbW->Position-indx*100)*-1;
        for(int i=0;i<VisibleTileCountX;i++)
                {
                if((i+indx)>=Tile_C_W)break;
                Back->Canvas->Draw(x,y,tiles_b[tile[(indy+j)*Tile_C_W+(indx+i)]]);
                x+=100;
                }
        }
}
Мы смотрим на смещение картинки(это скроллбары sbW и sbH), и определяем, которые из тайлов находятся за предлелами экрана
слева
C++
1
2
int indx=sbW->Position/100.0;//Получаем индекс первого рисуемого блока по X
int indy=sbH->Position/100.0;//по Y
и справа - VisibleTileCountX.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
02.08.2009, 21:56  [ТС]
Спс,

C++
1
2
Tile_C_W=-1;
Tile_C_H=-1;
Вот это вот,часто фигурирует но для чего непонятно)

C++
1
tile[TY*Tile_C_W+TX]=CurrentSelectedTile;
А так нельзя? (:
C++
1
TY*Tile_C_W+TX=CurrentSelectedTile;
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
02.08.2009, 22:23
C++
1
TY*Tile_C_W+TX=CurrentSelectedTile;
Вот так точно нельзя.

C++
1
2
Tile_C_W=-1;
Tile_C_H=-1;
А это просто показатель того, что матрица уровня пустая.
Tile_C_W - количество тайлов в ширину (TILE_COUNT_WIDTH)
Tile_C_H - количество тайлов в высоту (TILE_COUNT_HEIGHT)

Да, я соглашусь с тобой, что там немного сложноватая арифметика вычисления, но куда же дется.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2009, 22:23

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru