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

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

12.05.2009, 21:08. Показов 100169. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты 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. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru