Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Взаимодействия спрайтов   Найти похожие ветки 

 
Cash ©   (2003-11-08 19:49) [0]

Я знаю, что этот вопрос уже здесь мелькал. Смотрел, читал и не предал значения. Дело такое :
В игре сталкиваются спрайты, нужно определить, с кокой стороны -
верх, низ, лево, право.
Надо создать иммитацыю опоры и стен, и т. д.
Форум весь облазил - ненашел, но помню упоминания о процедуре.


 
Google   (2003-11-09 12:25) [1]

Не помню, где я это нашел, но:

"Советы по созданию аркадной игры. Как сделать игру? Как создать аркаду? Ответы вы найдёте здесь. Delphi, Дельфи, Делфи, Delphi5, DelphiX, аркадные игры, игра, гама, make game, боты в двухмерной игре, расчёт столкновения, создание спецэффектов, оружие, прыжки, падение, физика, полет, бег, ускорение, исходники. 2D графика, при этом можно использовать технологии 3D Super, супер, DirectX, OpenGL
Советы по созданию аркадной игры
Предисловие
Я полагаю, что вы пишете аркадную игру с использованием DelphiX и спрайтов из DXSprites. Разработчики DelphiX учли далеко не всё, что может потребоваться GAMEMAKERу и поэтому многие нужные функции мне пришлось писать самому. Если перед вами стоит та же проблема - эта страничка для вас!

Проверка на столкновение
В методе DoCollision разработчики не учли того, что game-мейкеру нужно знать не только о том, что игрок вписался в стену, но и с какой стороны эта стена находится! Средства DelphiX не дают никакой возможности узнать это :(
Но всегда можно что-нибудь придумать:)

Нужно чтобы игрок падал только если все 3 красных квадратика пусты (нет стен).
У нас есть TRect который ограничивает игрока (например: 0,3,width,height-3) и координаты игрока. Используя их, мы будем рассчитывать столкновения со стенами. У нас также есть массив вроде Background.Chips, которй содержит карту. Тогда процедура CanMoveDown будет выглядеть примерно так:

function TPlayer.CanMoveDown:boolean;
var i:integer;
const cannotmovedown:set of byte=[1,5];
begin
Result:=true;
for i:=0 to (((FullRect.Right-FullRect.Left) div 16)) do
if (Background.Chips[Trunc((xx+FullRect.Left{+1})/16)+i,Trunc((yy+FullRect.Bottom)/16)]in cannotmovedown) then Result:=false;
if (Background.Chips[Trunc((xx+FullRect.Right{-1})/16),Trunc((yy+FullRect.Bottom)/16)]in cannotmovedown) then Result:=false;
end;


Вначале мы просматриваем в цикле красные клетки, а потом отдельно - синюю.

Аналогично делаем CanMoveLeft, CanMoveRight, Can.MoveUp

function TPlayer.CanMoveUp:boolean;
var i:integer;
const cannotmoveup:set of byte=[1];
begin
Result:=true;
for i:=0 to (((FullRect.Right-FullRect.Left) div 16)) do
if (Background.Chips[Trunc((xx+FullRect.Left{+1})/16)+i,Trunc((yy+FullRect.Top)/16)]in cannotmoveup) then Result:=false;
if (Background.Chips[Trunc((xx+FullRect.Right{-1})/16),Trunc((yy+FullRect.Top)/16)]in cannotmoveup) then Result:=false;
end;
function TPlayer.CanMoveRight:boolean;
var i:integer;
const cannotmoveright:set of byte=[1];
begin
Result:=true;
for i:=0 to (((FullRect.Bottom-FullRect.Top) div 16)) do
if (Background.Chips[Trunc((xx+FullRect.Right)/16),Trunc((yy+FullRect.Top{+1})/16)+i]in cannotmoveright) then Result:=false;
if (Background.Chips[Trunc((xx+FullRect.Right)/16),Trunc((yy+FullRect.Bottom{-1})/16)]in cannotmoveright) then Result:=false;
end;
function TPlayer.CanMoveLeft:boolean;
var i:integer;
const cannotmoveleft:set of byte=[1];
begin
Result:=true;
for i:=0 to (((FullRect.Bottom-FullRect.Top) div 16)) do
if (Background.Chips[Trunc((xx+FullRect.Left)/16),Trunc((yy+FullRect.Top{+1})/16)+i]in cannotmoveleft) then Result:=false;
if (Background.Chips[Trunc((xx+FullRect.Left)/16),Trunc((yy+FullRect.Bottom{-1})/16)]in cannotmoveleft) then Result:=false;
end;


Способ работает, но неправильно, так как в данном случае (см рис. ниже)

Программа, проверит красную клетку и скажет, что влево идти нельзя!
Чтобы исправить этот глюк, раскомментируйте в коде {+1}{-1}.

Как убрать проскок сквозь стены на большой скорости
Пусть есть такие строчки:

TPlayer=class(TImageSprite)
privat
...
vx,vy:double;
...

Тогда вместо стандартного y:=y+vy напишите:

procedure TPlayer.DoMove(MoveCount: Integer);
var n: integer
begin
n:=0;
While (n<vy)and CanMoveUp do begin
Inc(n);
Y:=Y-1;
end;
n:=0;
While (n>vy)and CanMoveDown do begin
Dec(n);
Y:=Y+1;
end;
end;


Громозко, конечно, но зато работает на все 100! :).
Кстати, если между 3-й и 4-й строчкой вставить vy:=vy-g, то будет рассчитываться и падение (прим. g нужно подобрать самостоятельно. g не равно 9.8 как в физике!) Аналогично и с vx."


 
Cash ©   (2003-11-09 14:53) [2]

Вспомнил... IntersectRect. И не процедура, а функцыя.
Пример мощный.


 
JibSkeart ©   (2003-11-09 15:49) [3]

Ну это еще все зависит от того как ты хочешь писать игрущку

сдесь есть мой пример
http://delphigfx.mastak.ru/samples7.htm

довольно кривой , идея не нова ,
я думаю это должно навести тебя на мысли .


 
Cash ©   (2003-11-09 21:53) [4]

JibSkeart: Пример хороший. Читается давольно легко. Малость коментариев нехватает, из-за этого становится сложнее разбирать Engine.pas. Немного неясно общее описание CLine, CLines, Li. В общем: коментарии и по подробнее, как учили на первом курсе.


 
JibSkeart ©   (2003-11-10 11:59) [5]

Да надо посмотреть , давно я это делал уже
непомню что да как .


 
Cash ©   (2003-11-10 15:35) [6]

Я на эту тему по нету полазил, да и наскреб статейку на www.mirgames.ru. Малость глупая, но всеравно помогла.
Да. Там еще много всякого.
JibSkeart : я подожду твоих пояснений, параллельно разбирая сырцы примеров.


 
JibSkeart ©   (2003-11-14 15:44) [7]

Оппаньки
я оказывается слил туды исходники без комментариев
дома посмотрю может остались
с аомментариями

а сейчас я взглянул темный лес (уже почти ничего не помню)
проще новую игрушку написать :)


 
Cash ©   (2003-11-16 01:22) [8]

JibSkeart: Лады".:) Я тут сам по статейкам пошкрябал, да и налепил кой-чего.
Всем СПАСИБО.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.031 c
14-1081417892
Карелин Артем
2004-04-08 13:51
2004.05.02
Как отмазаться от армейки. Совет от MS Word.


1-1081915609
msgipss
2004-04-14 08:06
2004.05.02
Как можно определить тип данных в Variant


3-1080873104
AVP_opck
2004-04-02 06:31
2004.05.02
Работа с полем типа Time (firebird 1.5) через компоненты InterBas


14-1080761044
dilvish
2004-03-31 23:24
2004.05.02
Как написать веб-приложение для локальной сети???


7-1079007671
Vasek
2004-03-11 15:21
2004.05.02
Регистрация типа файлов в системе и их запуск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский