Форум: "Игры";
Текущий архив: 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.47 MB
Время: 0.03 c