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

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

12.05.2009, 21:08. Показов 103658. Ответов 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
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
18.09.2009, 00:38  [ТС]
Студворк — интернет-сервис помощи студентам
Сделал,спасибо за советы.
Отака к тебе очень серьёзный вопрос:

C++
1
2
3
4
5
6
for (int i = 0; i < 600; i++) {
 ExtImage*base=new ExtImage();
 base->Load("1.bmp");
 ExtImage**i_tile;
 i_tile = BreakImageOnParts(base,32,32);
 i_tile[0]->DrawTo(Form1->Canvas->Handle,1,1);
Как только i доходит до 291 программа выкидывает ошибку :"The Handle is invalid." И ругаеться что то на память,что делать?

Эта часть кода для обработки текстуры таила.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Ttile
{
 public:
 int p,x,y;
};
TTList<Ttile*>*t_map;
//---------------------------------------------------------------------------
void TForm2::CreateTileMatrix(int w, int h)
{
t_map = new TTList<Ttile*>();
Ttile * tile0 = new Ttile();
for(int i=0;i<w*h;i++)
{
  tile0->p = 1;
  tile0->x = rnd(0,3);
  tile0->y = 0;
  t_map->Add(tile0);
}
Tile_C_W = w;
Tile_C_H = h;
map_size_x=Tile_C_W*TS-Form2->ClientWidth;
map_size_y=Tile_C_H*TS-Form2->ClientHeight;
}
//---------------------------------------------------------------------------
void TForm2::DrawTiles()
{
int indx = map_pos_x/TS;//Получаем индекс первого рисуемого блока по X
int indy = map_pos_y/TS;//по Y
 
int x;
int y=(map_pos_y-indy*TS)*-1;
for(int j=0;j<Tile_C_H;j++,y+=TS)
        {
        if((j+indy)>=Tile_C_H)break;
        x=(map_pos_x-indx*TS)*-1;
        for(int i=0;i<Tile_C_W;i++)
                {
                if((i+indx)>=Tile_C_W)break;
                DrawTiles(x,y,(indy+j)*Tile_C_W+(indx+i));
                x+=TS;
                }
        }
}
void TForm2::DrawTiles(int x,int y,int tile)
{
 int type,rx,ry;
 type = t_map->Get(tile)->p;
 rx = t_map->Get(tile)->x;
 ry = t_map->Get(tile)->y;
 ExtImage*base=new ExtImage();
 base->Load("1.bmp");
 ExtImage**i_tile;
 i_tile = BreakImageOnParts(base,TS,TS);
 //i_tile[ry*4+rx]->DrawTo(Form2->Canvas->Handle,x,y);
 //Back->Canvas->Draw(x,y,i_tile[ry*4+rx]);
}
Тут таилы построены на классе.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
18.09.2009, 08:45  [ТС]
Как сделать деструктор base и i_tile;
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.09.2009, 09:08
> Как только i доходит до 291 программа выкидывает ошибку :"The Handle is invalid." И ругаеться что то на память,что делать?

А в конце цикла делаешь "delete base"?
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
18.09.2009, 16:42  [ТС]
Тааак Evg спасибо,мы увеличили число i до 309
Проблема явно с памятью,что то от туда не удаляется.Потому что если увеличить размер разрезаемой картинки:
C++
1
i_tile = BreakImageOnParts(base,64,64);
То памяти хватает,то есть проблема,в
C++
1
i_tile = BreakImageOnParts(base,32,32);
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for (int i = 0; i < 600; i++) {
 ExtImage*base=new ExtImage();
 base->Load("1.bmp");
 ExtImage**i_tile;
 i_tile = BreakImageOnParts(base,32,32);
 i_tile[0]->DrawTo(Form1->Canvas->Handle,1,1);
 Form1->Canvas->TextOut(45,45,IntToStr(i));
 delete i_tile;
 delete base;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.09.2009, 17:52
Я так понимаю, что вместо "delete i_tile;" надо пройтись циклом по i_tile и сначала удалить все указатели, и только потом удалять i_tile. Я понятия не имею, что возвращает BreakImageOnParts, но подозреваю, что примерно так - прочти мануал
1
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
18.09.2009, 18:51
Evg, абсолютно правильно.
Нужно делать так:

C++
1
2
3
4
5
6
7
8
9
//Сначала узнаем количество кусочков которые получились из картинки.
int wc=base->Width/32;//Делим на ширину кусочка
int hc=base->Height/32;//Делим на высоту кусочка
int count=wc*hc;
for(int i=0;i<count;i++)
           {
           delete i_tile[i];
           }
delete i_tile;
Вроде бы так.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.09.2009, 18:57
> Нужно делать так:

А неужто для этой херни в библиотеке не предусмотрена процедура в нагрузку к BreakImageOnParts?
1
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
18.09.2009, 19:02
Нет, так как эта функция была набросана мною в окошке редактирования сообщений при написании поста №204. Потом, правда, я её проверил(как пришел домой). А удаление я оставил на совести KTYJIX.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
19.09.2009, 23:05  [ТС]
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
 Back = new Graphics::TBitmap();
 Back->Width=Form2->ClientWidth;
 Back->Height=Form2->ClientHeight;
 map_pos_x = 0;
 map_pos_y = 0;
 Tile_C_W=-1;
 Tile_C_H=-1;
 TS = 32;
 CreateTileMatrix(40,30);
 CurrentSelectedTile = 2;
 Form2->Canvas->Draw(0,0,Back);
}
//---------------------------------------------------------------------------
class Ttile
{
 public:
 int p,x,y;
};
TTList<Ttile*>*t_map;
//---------------------------------------------------------------------------
void TForm2::CreateTileMatrix(int w, int h)
{
t_map = new TTList<Ttile*>();
Ttile * tile0 = new Ttile();
for(int i=0;i<w*h;i++)
{
  tile0->p = 1;
  tile0->x = rnd(0,1);
  tile0->y = 0;
  t_map->Add(tile0);
}
Tile_C_W = w;
Tile_C_H = h;
map_size_x=Tile_C_W*TS-Form2->ClientWidth;
map_size_y=Tile_C_H*TS-Form2->ClientHeight;
}
//---------------------------------------------------------------------------
void TForm2::DrawTiles()
{
int indx = map_pos_x/TS;//Получаем индекс первого рисуемого блока по X
int indy = map_pos_y/TS;//по Y
 
int x;
int y=(map_pos_y-indy*TS)*-1;
for(int j=0;j<Tile_C_H;j++,y+=TS)
        {
        if((j+indy)>=Tile_C_H)break;
        x=(map_pos_x-indx*TS)*-1;
        for(int i=0;i<Tile_C_W;i++)
                {
                if((i+indx)>=Tile_C_W)break;
                DrawTiles(x,y,(indy+j)*Tile_C_W+(indx+i));
                x+=TS;
                }
        }
}
 
void TForm2::DrawTiles(int x,int y,int tile)
{
 int type,rx,ry;
 type = t_map->Get(tile)->p;
 rx = t_map->Get(tile)->x;
 ry = t_map->Get(tile)->y;
 ExtImage*base=new ExtImage();
 base->Load("1.bmp");
 ExtImage**i_tile;
 i_tile = BreakImageOnParts(base,TS,TS);
 i_tile[ry*4+rx]->DrawTo(Back->Canvas->Handle,x,y);
 for(int i=0;i<base->Width/TS*base->Height/TS;i++)
  {
  delete i_tile[i];
  }
 delete i_tile;
 delete base;    
 
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
 DrawTiles();
 Form2->Canvas->Draw(0,0,Back);
}
//---------------------------------------------------------------------------
Вот реализовал,теперь памяти хватает.
Но появляется проблема резкого падения фпс,это можно как то избежать?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
19.09.2009, 23:10
Так ведь тебе нужно сначала в OnCreate формы разбить твою картинку с тайлами на куски и сохранить в массив, а в функции прорисовки просто рисовать их на экран.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
20.09.2009, 12:48  [ТС]
Отака, у меня алгоритм такой:
1.Drawtiles() задаёт мне координаты,где я буду рисовать таил,и выдаёт номер таила из массива t_map;
2.В Drawtiles(int x,int y,int tile) я беру номер текстуры и координаты куска текстуры,который мне понадобиться.
3.Загружаю текстуру в base согласно уровню таила.
4.Разбиваю её на кусочки,кусочек рисую,и всё удаляю.

Так что,твой вариант инициализации заранее не подходит.

Я думаю может сделать так:
Можно, чтоб я загрузил в base каринку,а потом сказал
C++
1
2
3
4
base->Weight = 32;
base->Height = 32;
base->PicturePosX = rx;
base->PicturePosY = ry*4;
PicturePos - позиция загруженной картинки внутри base.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.09.2009, 14:49
Ну не знаю. Я не совсем понял этот алгоритм, но вообще-то нужно всегда сначала разбить картинку на тайлы при инициализации, а уже потом...
Хотя можно было бы сделать по другому. Зачем каждый раз резать картинку на мелкие кусочки?
Можно ведь просто копировать из большой картинки "библиотеки" тайлов кусочек который отвечает за конкретный по номеру тайл, сразу же на рабочую поверхность. Экономия времени и памяти на лицо.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
20.09.2009, 15:12  [ТС]
А у нас же много картинок,ты предлагаешь мне инициализировать вначале 6(допустим у нас 6 таилов)
массивов BreakeImagesOnParts? А потом использовать который мне нужно?

Просто по моему удобнее он загрузил,разбил,нарисовал,всё удалил,но почему то быстрее не получается.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.09.2009, 15:16
Заранее лучше. Потому что операции выделения памяти и удаления её проходят довольно медленно, а по прохождении Nнного количества времени начнет сказываться эффект фрагментации памяти, что также будет негативно отражатся на производительности.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
20.09.2009, 15:24  [ТС]
Хорошо,значит будем реализовывать огромную "библиотеку таилов".
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.09.2009, 15:28
Насчет одной огромной я бы тебя поостерег. Лучше сделай несколько библиотчек поменьше, тематических: карта тайлов окружения, библиотека врагов, библиотека оружия... Так ведь проще дополнять и редактировать.
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
20.09.2009, 16:01  [ТС]
И ешё.
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
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
 Back = new Graphics::TBitmap();
 Back->Width=Form2->ClientWidth;
 Back->Height=Form2->ClientHeight;
 
 map_pos_x = 0;
 map_pos_y = 0;
 
 Tile_C_W=-1;
 Tile_C_H=-1;
 TS = 32;
 
 ExtImage*base=new ExtImage();
 base->Load("tiles.bmp");
 ExtImage**i_tile;
 i_tile = BreakImageOnParts(base,TS,TS);
 delete i_tile;
 delete base;
 
 CreateTileMatrix(40,30);
 CurrentSelectedTile = 2;
 
 Form2->Canvas->Draw(0,0,Back);
}
Как сделать чтоб я мог обращаться к i_tile[] из любого места кода.

Добавлено через 17 минут
Просто,если объявить i_tile заранее в:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define testH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
public:
ExtImage**i_tile;
Graphics::TBitmap*Map;
Graphics::TBitmap*Back;
То выскакивает ошибка:

Access violation at address 00402226 in module "test_prj.exe". Read of address 0000004.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.09.2009, 16:50
Вообще-то так делать можно, только нужно сделать так:
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
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
 Back = new Graphics::TBitmap();
 Back->Width=Form2->ClientWidth;
 Back->Height=Form2->ClientHeight;
 
 map_pos_x = 0;
 map_pos_y = 0;
 
 Tile_C_W=-1;
 Tile_C_H=-1;
 TS = 32;
 
 ExtImage*base=new ExtImage();
 base->Load("tiles.bmp");
// ExtImage**i_tile;   //                      нужно закоментить вот эту строку, иначе i_tile у нас локальная переменная
 i_tile = BreakImageOnParts(base,TS,TS);
 delete i_tile;
 delete base;
 
 CreateTileMatrix(40,30);
 CurrentSelectedTile = 2;
 
 Form2->Canvas->Draw(0,0,Back);
}
И кстати, ты неправильно удаляешь i_tile. Посмотри на несколько постов ранее, я писал как удалять этот массив.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
20.09.2009, 21:38  [ТС]
Otaka,ещё заметил:
Ты говорил чтобы изменить в положение пули надо делать так:
C++
1
bullets->Get(i)->X+=bullets->Get(i)->dX;
Но когда я применяю тоже самое к одному таилу:
C++
1
t_map->Get(0)->p = 2;
У всех таилов "p" почему то то же меняется на 2,что делать?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
20.09.2009, 21:51
Честно говоря я не знаю что такое t_map и зачем у него там параметр p, но могу предположить, что ты где-то ошибся в проектировании.
По правде, я уже давно потерял нить разработки и плохо понимаю структуру твоей игры, поэтому мне сложно что-либо говорить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2009, 21:51

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
240
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru