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

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

12.05.2009, 21:08. Показов 100248. Ответов 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
01.02.2010, 21:08
Студворк — интернет-сервис помощи студентам
Ради каждой пули создавать TImage, это слишком накладно будет. При перемещении одного компонента по поверхности другого, будет посылаться туча всевозможнейших сообщений о перерисовке компонентов которые находятся ниже, а если у тебя там множество объектов, то это ой как плохо будет, конечно на наших быстрых компах это не сильно заметно, но ты попробуй подними количество объектов до тысячи(так теста ради), и посмотри что будет.
Нужно один раз грузить картинку пули, а потом просто её рисовать столько раз сколько нужно. Никаких сообщений, дополнительных обработок проводится не будет. Так делаются все спрайтовые игры.
0
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
02.02.2010, 00:19
Цитата Сообщение от Otaka Посмотреть сообщение
Ради каждой пули создавать TImage, это слишком накладно будет. При перемещении одного компонента по поверхности другого, будет посылаться туча всевозможнейших сообщений о перерисовке компонентов которые находятся ниже, а если у тебя там множество объектов, то это ой как плохо будет, конечно на наших быстрых компах это не сильно заметно, но ты попробуй подними количество объектов до тысячи(так теста ради), и посмотри что будет.
Нужно один раз грузить картинку пули, а потом просто её рисовать столько раз сколько нужно. Никаких сообщений, дополнительных обработок проводится не будет. Так делаются все спрайтовые игры.
Тоесть .. по правильному .. надо загрузить один раз картинку, а потом она будет рисоваться а не создаваться?!

А через что это делается ? (Draw?)

Просто я почитал тут ... и мне показалось что у вас тут выстрелы это линии (по скринам судил) . Хочется все таки чтобы патрон эффектно смотрелся
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
02.02.2010, 14:40
Цитата Сообщение от Deimon Посмотреть сообщение
Хочется все таки чтобы патрон эффектно смотрелся
Просто KTYJIX решил делать так. А что уж там будет рисоваться(линия или пуля), это абсолютно не важно.
А рисуется оно просто через Canvas->Draw()(это если ты через GDI делаешь а не через DirectDraw) на заднем буфере.
0
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
14.02.2010, 22:04
Otaka, помоги мне... Допустим мы имеем
C++
1
2
3
4
int x1=100;
int y1=100;
int x2=500;
int y2=700;
Допустим что я эти координаты соединил линией.
C++
1
2
Canvas->MoveTo(x1,y1);
Canvas->LineTo(x2,y2);
Вопрос, а как сделать, чтоб эту линию продлить на 500 по x и y и при этом чтоб она осталась прямой?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.02.2010, 22:09
А ты сначала вычисляешь угол от точки x1,y1 до x2,y2(можно посмотреть FPoint в файле myclasses.cpp), а потом уже можно полярными координатами дорисовать необходимый кусок.
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
14.02.2010, 22:14
Otaka, можешь пожалуйста написать код Я просто плохо знаю твой "MyClasses.cpp" и функцию FPoint
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.02.2010, 22:23
Вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<myclasses.cpp>
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FPoint p1(100,100);
FPoint p2(400,300);
Canvas->Pen->Width=1;
Canvas->Ellipse(p1.x-5,p1.y-5,p1.x+5,p1.y+5);
Canvas->Ellipse(p2.x-5,p2.y-5,p2.x+5,p2.y+5);
float angle=p1.Polar(&p2);
Canvas->Pen->Width=3;
int X=cos(angle)*500+p2.x;
int Y=sin(angle)*500+p2.y;
Canvas->Ellipse(X-5,Y-5,X+5,Y+5);
Canvas->MoveTo(p2.x,p2.y);
Canvas->LineTo(X,Y);
}
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
14.02.2010, 22:28
Благодарствую
0
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
14.02.2010, 23:06
В данном случае удобно было бы работать с векторами.
например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <complex.h>
typedef complex<double>Complex;
int x1=100;
        int y1=100;
        int x2=200;
        int y2=300;
    Complex point1(x1,y1);
        Complex point2(x2,y2);
        Complex Vector=(point2-point1);
        Complex point3=Complex(real(Vector)*100,imag(Vector)*100);
        Image1->Canvas->Pen->Color=clBlue;
        Image1->Canvas->MoveTo(real(point1),imag(point1));
        Image1->Canvas->LineTo(real(point2),imag(point2));
        Image1->Canvas->Pen->Color=clRed;
        Image1->Canvas->LineTo(real(point3),imag(point3));
Подправил.. сначала прибавил к вектору число.. а надо было умножить на него, чтобы получившаяся линия продолжала первоночальную

Добавлено через 16 минут
Я извиняюсь, случайно удалил вторую точку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <complex.h>
typedef complex<double>Complex;
int x1=100;
        int y1=100;
        int x2=200;
        int y2=300;
        Complex point1(x1,y1);
        Complex point2(x2,y2);
        Complex Vector=(point2-point1);
        Complex point3=point2+Complex(real(Vector)*100,imag(Vector)*100);
        Image1->Canvas->Pen->Color=clBlue;
        Image1->Canvas->MoveTo(real(point1),imag(point1));
        Image1->Canvas->LineTo(real(point2),imag(point2));
        Image1->Canvas->Pen->Color=clRed;
        Image1->Canvas->LineTo(real(point3),imag(point3));
Добавлено через 20 минут
Вообще, для перемещения в 2д или в 3д Вам я бы сказал, что Вам просто необходимо использовать вектора.
Потому, что имея 2 точки, очень легко получить направление. Отняли от второй точки первую и у вас уже есть нужный Вам вектор. И отправить "объект" из этих двух точек в данном направлении, просто. умножили вектор на скаляр (на число). и прибавили его к вашей текущей точке, которая должна быть перемещена.
Слегкостью можно получить угол вектора(направления) функцией double arg(Complex)
Единственное, что Вам нужно сделать для работы с векторами, это нормализовывать их. Так как вектор может иметь разную длинну, и если Вы его будете умножать на число, например, для перемещения объекта, то ваш объект будет передвигаться очень быстро(если вектор имеет очень большую длинну), или наоборот, очень меделло(если длина вектора мала).
Нормализовать вектор - значит свести его длину к единице.

C++
1
2
3
4
5
6
7
8
9
Complex Normalize(Complex Vector)
{
    double x=real(Vector);
    double y=imag(Vector);
    double length=sqrt(x * x + y * y);
    x = x/length;
    y = y/length;
    return Complex(x,y);
}
1
 Аватар для 13__Apostol
13 / 3 / 0
Регистрация: 07.11.2009
Сообщений: 12
15.02.2010, 11:56
Всем привет! Я тоже делаю 2D игрушку, искал разный материал и случайно наткнулся на эту тему. К этому времени уже разработал редактор карт, и часть движка игры. Выкладываю для примера свою версию редактора, если увидите что-то полезное могу выкинуть исходник.

P.S. Делается все от нефиг делать, и чтобы не отупеть т.к. сейчас несу службу в нашей доблестной армии
Вложения
Тип файла: rar MapsEdit.rar (258.7 Кб, 37 просмотров)
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
15.02.2010, 16:04
13__Apostol, хороший редактор Потом кинешь исходники(если можно)

Добавлено через 1 час 44 минуты
Otaka, есть вопрос, как реализовать передвижение от точки к точке?
Т.Е. Допустим мы имеем:
C++
1
2
3
4
5
int x1=0,y1=0;
int x2=10,y2=200;
int x3=200,y3=150;
int x4=100,y4=50;
int x5=100,y5=0;
Надо, чтоб нпс сам передвигался по этим точкам и ещё поворачивался лицом к ним
0
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
15.02.2010, 16:25
Да кстати, кому интересно, вот игра(точнее то что есть )

Даю краткое описание функций в классе Actor:

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
Create(AnsiString NameOfMemory,int type,AnsiString file_name,int x,int y)
/*
NameOfMemory - Имя в памяти(любое). Регистр влияет на имя!!!
file_name - Моделька(формат *.bmp).
x и y - координаты создания(можно указать по 0 и 0).
*/
PutAt(AnsiString NameOfMemory,int x,int y)
/*
NameOfMemory - Имя модели в памяти. Повторяю - Регистр влияет на имя!!!
x и y - координаты
*/
Move(AnsiString NameOfMemory,int enable_move_left,int enable_move_top,int move_speed,int client_width,int client_height)
/*
NameOfMemory - Имя модели в памяти.
enable_move_left и enable_move_top - разрешение на передвижение. enable_move_left: -1 на передвижение влево и 1 на передвижение вправо. enable_move_top: -1 на передвижение вверх и 1 на передвижение вниз. Можно использовать enable_move_left и enable_move_top одновременно.
move_speed - скорость.
client_width и client_height - длина и ширина клиентской части. (Не всей ФОРМЫ!!!).
*/
loaded(AnsiString NameOfMemory) //Загружен ли NameOfMemory в память.
Rotate(AnsiString NameOfMemory, int gpoint_x,int gpoint_y,Graphics::TBitmap *Backbuffer)
/*
Здесь происходит и поворот NameOfMemory и сразу же его прорисовка.
gpoint_x и gpoint_y - координаты. Не знаю как объяснить. Экспериментируйте :D
Backbuffer - это Задний буфер. (Я лично рисую в задний буфер. Если хотите можете поменять на TCanvas)
*/
AttackAcotr(AnsiString NameOfMemory_Attacker, AnsiString NameOfMemory_Defender)
/*
Только сегодня доработал эту функцию. Была путаница с памятью. Немножко подглючивает.
NameOfMemory_Attacker - имя в памяти атакующего.
NameOfMemory_Defender - имя в памяти обороняющего.
*/
Вложения
Тип файла: rar test.rar (285.8 Кб, 33 просмотров)
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
15.02.2010, 16:29
Неправильный пост
ПРЕДУПРЕЖДАЮ ВСЕХ, У КОГО СЛАБЕНЬКИЕ КОМПЫ!!! У МЕНЯ ПОЧЕМУ-ТО НЕ РАБОТАЕТ УДАЛЕНИЕ ПУЛЬ!!! ПОЭТОМУ ПАМЯТЬ НЕ ОСВОБОЖДАЕТСЯ!!!


Предупреждаю всех, у кого слабенький комп!!! У меня почему-то не работает удаление пуль!!! Поэтому память не освобождается!!!
0
 Аватар для 13__Apostol
13 / 3 / 0
Регистрация: 07.11.2009
Сообщений: 12
15.02.2010, 18:25
Цитата Сообщение от black-eye Посмотреть сообщение
13__Apostol, хороший редактор Потом кинешь исходники(если можно)

Добавлено через 1 час 44 минуты
Otaka, есть вопрос, как реализовать передвижение от точки к точке?
Т.Е. Допустим мы имеем:
C++
1
2
3
4
5
int x1=0,y1=0;
int x2=10,y2=200;
int x3=200,y3=150;
int x4=100,y4=50;
int x5=100,y5=0;
Надо, чтоб нпс сам передвигался по этим точкам и ещё поворачивался лицом к ним
C++
1
2
3
4
5
6
7
8
9
10
11
12
// расчет координат по углу
// X,Y - текущие координаты, RAD = 0.01745333 или ПИ/180
// speed - индекс скорости, angle - угол движения
 
X+=cos(RAD*angle)*speed; 
Y+=sin(RAD*angle)*speed;
 
// угол между двумя точками, GR = 57.29564553 или 180/ПИ
 
float rx = x1 - x2;
float ry = y1 - y2;
if (rx != 0 && ry != 0) angle = atan2 (ry, rx) * GR;

P.S. И исходник редактора лови
Вложения
Тип файла: rar MapsEdit_project.rar (350.1 Кб, 43 просмотров)
2
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
16.02.2010, 11:30  [ТС]
Всем день добрый! (%

Я вернулся к вам с вопросиком относительно Луа.
Задача, через луа код создаётся временный текст(функция Message), после того как этот текст пропадает, должен запускаться скрипт с музыкой. Как это должно реализовываться?


Класс временного текста TText:
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
//--------------------MoonClasses.cpp--------------------------
 
class TText
{
 public:
 int x,y,time,indx; String str;
 int Destruct(int indx);
 int Lua_Load(lua_State*st)
 {
    TLua lua(st);
    int top = lua.GetTop();
    if(top>0)
    {
        x = lua.ToNumber(top-3);
        y = lua.ToNumber(top-2);
        time = lua.ToNumber(top-1);
        str = lua.ToString(top);
        return 1;
    }
    return 0;
 }
 void Render(TCanvas* Canvas)
    {
     Canvas->TextOutA(x,y,str);
     Canvas->TextOutA(x,y+10,IntToStr(time));
     time--;
     if(time==0)Destruct(indx);
    }
};
 
//---------------------------Engine.cpp-------------------------------------
 
int TText::Destruct(int indx)
{
    Txt->Delete(indx);
    //Смещение всех индексов на одну единицу влево.
    for(int i=indx;i<Txt->Count;i++)Txt->Get(i)->indx--;
}
Есть функция Lua_Message, которая добавляет в массив классов, новый класс:
C++
1
2
3
4
5
6
7
int Lua_Message(lua_State*st)
{
 TText *Txt0 = new TText;
 Txt0->Lua_Load(st);
 Txt0->indx = Txt->Count;
 Txt->Add(Txt0);
}
И есть скрипт Start.lua:


Message(300,300,150,"Message script work, and here comes the music")

if a == 1 then
dofile("Sound.lua")
end

Я понимаю, что это должно реализоваться через lua.PushNumber(), но куда его надо вставить, чтоб скрипт загружался после того как временный текст пропадёт?

Спасибо.

P.s - Рад, что тема жива (%
0
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
16.02.2010, 18:36
Я не очень понял, что ты хотел, KTYJIX, но вот тебе пример с возвращением параметров
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "lua.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TLua Lua;
 
int Lua_ShowMessage(lua_State*st)
{
TLua lua(st);
int top=lua.GetTop();
if(top>0) ShowMessage(lua.ToString(top));
return 0;
}
 
int Lua_Return(lua_State*st)
{
TLua lua(st);
lua.Push(1);
return 1;
}
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Lua.RegFunction("ShowMessage",Lua_ShowMessage);
Lua.RegFunction("Return",Lua_Return);
Lua.DoFile("test.lua");
}
//---------------------------------------------------------------------------
А вот сам луа:

a=Return()
msg=""
if a==1 then
msg="TRUE"
else
msg="FALSE"
end
ShowMessage(msg)
Добавлено через 2 минуты
Если в функции - int Lua_Return(lua_State*st) - поставить допустим lua.Push(2), то результат выполнения луа будет другим
0
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
16.02.2010, 19:45
Итак, сделал, чтоб нпс ходил по координатам
Вложения
Тип файла: rar движение нпс.rar (422.6 Кб, 51 просмотров)
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
16.02.2010, 20:48
Сначала чертим путь , потом нажимаем на Enter и смотрим

Добавлено через 1 час 2 минуты
Как проверить столкновение пули и нпс'ников?
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
16.02.2010, 20:52  [ТС]
Создание игры(2d)

Все ссылки в шапке, будь внимательнее.
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
16.02.2010, 20:56
Спасибо конечно, KTYJIX, но я не знаю как этим пользоваться А ещё у меня структура игры отличается от вашего варианта. Так-что жду новых предложений

Добавлено через 26 секунд
Если надо, код игры могу кинуть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2010, 20:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
360
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
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 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru