Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2010, 14:26   #111
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Во втором уровне почему-то исчезают текстуры, если уехать далеко от начала. Это связано с тем, что я рисую закрашенный прямоугольник на весь экран (для эффекта затемнения), потому что когда убираю этот прямоуг, все рисуется норм. Я вообще запутался с этой функцией PR2D_RECT, чего она хочет?
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 20.04.2010 в 14:55.
Андрей 93 вне форума Ответить с цитированием
Старый 20.04.2010, 19:01   #112
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Она ничего не хочет. Ты где-то намудрил. Хочешь помощи сделай демку с проблемой и показывай код. Процедура то везде корме этого места нормально работает.
Вадим Буренков вне форума Ответить с цитированием
Старый 21.04.2010, 13:16   #113
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

А чем моя игра не демка? код состоит из одной функции
Код:
pr2d_rect(cam.x,cam.y,640,480,$000000,effect_alpha,PR_FILL);
где effect_alpha - это переменная целочисленного типа, которая меняет значение от 0 до 255, когда это нужно.
Я заметил, что текстуры пропадают только при условии, если спрайт фона находится за пределами экрана.
Поэтому я сделал фон на весь уровень, это всё равно необходимо. Вопрос закрываю
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 21.04.2010 в 13:54.
Андрей 93 вне форума Ответить с цитированием
Старый 21.04.2010, 19:08   #114
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Как очистить все переменные модуля? По порядку один за другим, или можно как-то по-другому? Просто в этом модуле (в нем выполняется создание карты и обработка всей физики) глобальные переменные остаются после закрытия уровня, а при загрузке другого уровня в массивах остаются объекты (касаемо только статичных массивов). Была мысль все массивы сделать динамическими, но все же хочется как-то чистить все переменные, будто модуль подключен заново (как бы глупо это ни звучало).
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 21.04.2010, 21:02   #115
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Как очистить все переменные модуля?
Если о физике в чипманке есть соответствующие функции. Если о своих данных то я использую переменные-указатели в памяти (^), они создаются new и удаяляются dispose. Храню все данные в масивах по строению аналогичных chipmunk'овским.
Не особо понял в чем проблема, показывай код.
Вадим Буренков вне форума Ответить с цитированием
Старый 22.04.2010, 10:47   #116
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Это типы кнопки и двери:
Код:
 type button = record
   body:pBody;
   id:integer;
   enabled:boolean;
   end;

  type door = record
   body:pBody;
   id,a:integer;
   p1,p2,velocity:cpVect;
   end;
в блоке var модуля объявлены
Код:
but_arr:array [0..10] of button;
doors: array [0..10] of door;
kol_doors, kol_but:integer;
в процедуре draw
Код:
  for i := 0 to kol_but - 1 do
    if but_arr[i].enabled then
     ssprite_draw(but_e,but_arr[i].body.p.x-15,but_arr[i].body.p.y-15,30,30)
    else  ssprite_draw(but_d,but_arr[i].body.p.x-15,but_arr[i].body.p.y-15,30,30);

  for I := 0 to kol_doors - 1 do
    if doors[i].a=0 then
     ssprite_draw(door_tex,doors[i].body.p.x-10,doors[i].body.p.y-55,20,110)
    else ssprite_draw(door_tex,doors[i].body.p.x-10,doors[i].body.p.y-55,20,110,255,90);
на переменные в процедуре ssprite_draw не смотри. Суть там в том, как переворачивать спрайт двери (предусмотрены горизонтальное и вертикальное положения) и каким цветом рисовать кнопку (в зависимости от вкл\выкл).
При закрытии уровня все физ. тела удаляются (cpSpaceClear), но остаются массивы и переменные, показывающие кол-во элем. массива, поэтому даже в другом уровне эти физически несуществующие двери и кнопки будут рисоваться.
Надо переводить doors и but_arr в дин. массивы.
В моём случае использование указателей не обязательно, вся работа с этими данными находится в 1 модуле. А способ хранения данных в чипманке является предком динамических массивов, т.е. в принципе, то же самое
Вложения
Тип файла: rar 111.rar (871.3 Кб, 11 просмотров)
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 22.04.2010 в 10:50.
Андрей 93 вне форума Ответить с цитированием
Старый 22.04.2010, 10:58   #117
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Сделал массивы динамическими и все заработало нормально. нраица
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 22.04.2010, 16:47   #118
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Научись более рационально подходить к коду. Делай каждый тип независимым, со своими процедурами (работать с типом нужно (желательнее) не в коде самой игры, а через эти процедуры). Храни данные физики в типе, сам тип желательно делать указателем (это не обязательно, но помогает).
То есть "правильнее" делать примерно так (пример типа для объекта уровня):

Код:
type
TDynObj=record
body:PcpBody;
shape:PcpShape;
Texture:PTexture;
ID:integer;
end;

Function CreateObject(bodyData:bData;ID:integer):TDynObj;
Procedure DrawObject(obj:TDynObj);
Procedure UpdateObject(obj:TDynObj);
Procedure FreeObject(obj:TDynObj);
//итд
Это тип объекта. Таким же образом делаются двери и другие необходимые вещи. Благодаря тому, что мы сохранили указатели на Body и Shape мы можем удалить физический объект, при этом не очищая все тела chipmunk (тут хорошо видно преимущество переменных-указателей).

Для еще лучшей организации кода можно сделать тип уровня:
Код:
type 
TGameLevel=record
DynObjects: array of TDinObj;
DynObjectsNum:integer;
BackgroundTex:TTexture;
end;
И у него тоже будут свои процедуры:

Код:
Function CreateLevel(filename:string):TGameLevel;
Procedure DrawLevel(level:TGameLevel);
Procedure UpdateLevel(level:TGameLevel);
Procedure FreeLevel(level:TGameLevel);
Так мы получаем иерархию объектов в игре:


TGameLevel->TDynObj->ChipmunkBody
.............//->TGameButton->ChipmunkBody
.............//->TGameDoor

Каждый тип ссылается (через переменную указатель) или содержит (в себе) подчиненный тип, и управляет им. Например тип уровня имеет процедуру DrawLevel, она в свою очередь вызывает отрисовку всех объектов по очереди процедурой DrawObject (то есть уровень управляет подчиненными ему объектами, то же самое с обработкой и удалением).
Еще удобство метода в том, что можно хорошо разделить код на модули (Levels.pas,DynObjects.pas итд), и они будут ссылаться друг на друга. Код не будет в одной куче. Основной модуль освободится от всяких кусков кода типа:
Код:
  for i := 0 to kol_but - 1 do
    if but_arr[i].enabled then
     ssprite_draw(but_e,but_arr[i].body.p.x-15,but_arr[i].body.p.y-15,30,30)
    else  ssprite_draw(but_d,but_arr[i].body.p.x-15,but_arr[i].body.p.y-15,30,30);
В процедуре Draw движка будет всего лишь:
Код:
DrawLevel(Level1);
ИМХО Предлагаю принять выше написанное как истину (аксиому ) и использовать без сомнений.
P.S. Ты сам фон для уровня нарисовал?
P.P.S. Пропадают текстуры как только перестает видится фон. Попробуй убрать
Код:
pr2d_rect(cam.x,cam.y,640,480,$000000,effect_alpha,PR_FILL
Или так сделай:
Код:
if effect_alpha<>0 then
pr2d_rect(cam.x,cam.y,640,480,$000000,effect_alpha,PR_FILL
(хотя мне кажется дело не в затемнении)

Последний раз редактировалось Вадим Буренков; 22.04.2010 в 16:56.
Вадим Буренков вне форума Ответить с цитированием
Старый 22.04.2010, 18:08   #119
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Разложить код по полочкам руки не доходят, да и не за чем это пока кода мало. Я ещё не запутываюсь. Когда-нибудь займусь этим. Фон рисовал сам, так же как и все остальное.
Насчет затемнения: если совсем уберу будут какие-то некрасивые переходы, в начале у меня была мысль сделать как будто шторки фотоаппарата закрываются (просто сужение круга, а за пределами круга чернота), только это для меня сложно. А если поставить условие if effect_alpha<>0, то текстуры всё равно пропадут, когда начнется затемнение, так что легче сделать картинку фона побольше, чтобы всё охватывала, или же изменять её координаты относительно камеры не как cam.x/5 и cam.y/5, а как cam.x/7 и cam.y/7
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 22.04.2010, 19:44   #120
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
не за чем это пока кода мало
Когда станет много будет слишком поздно...
Сделай отдельную демку с переходом где видна проблема и выложи сюда ее код.
Вадим Буренков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Физика в 2D играх Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 32 02.11.2010 22:00
Искуственый интелект в играх VintProg Gamedev - cоздание игр: Unity, OpenGL, DirectX 26 01.08.2009 23:09
Сюжет в 2D играх ZotaC Свободное общение 8 05.07.2009 15:42
Физика программы. Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 09.05.2008 18:14
Анимация в играх frai Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 25.11.2007 14:28