Форум: "Игры";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизАрканоид. Алгоритм отражения от стен. Найти похожие ветки
← →
Igit © (2004-05-08 12:19) [0]Игру решил попытаться написать на паскале, все зделал, вот только шарик никак не могу заставить ровно летать (то он не отражается, то отражается). Может кто-нибудь подсказать, как это делается? Спасибо.
← →
miek © (2004-05-08 13:06) [1]Код в студию.
← →
Igit © (2004-05-08 15:02) [2]C отражением от стен разобрался:
if (Bsprt[1].x + 10*64 + Bsprt[1].dx) >= 319*64 then
Bsprt[1].dx := -Bsprt[1].dx;
if (Bsprt[1].x + Bsprt[1].dx) <= 0 then
Bsprt[1].dx := -Bsprt[1].dx;
if (Bsprt[1].y + 10*64 + Bsprt[1].dy) >= 199*64 then
Bsprt[1].dy := -Bsprt[1].dy;
if (Bsprt[1].y + Bsprt[1].dy) <= 0 then
Bsprt[1].dy := -Bsprt[1].dy;
Bsprt[1].x := Bsprt[1].x +Bsprt[1].dx*64;
Bsprt[1].y := Bsprt[1].y +Bsprt[1].dy;
Здесь Bsprt[1] - это спрайт мячика 10*10 пикселов.
dx, dy - его скорость и направленние.
А вот как быть с остальными спрайтами (кирпичиками 20*20 пикселов), как отслеживать от них удары - не пойму. Платформа зделана тоже из тех же спрайтов (три кирпича вместе).
Пытался зделать что-то вроде этого вроде этогоfor i:=1 to NumBlocks do
Полный исходник http://bzdun.haos.net/game.rar
begin
if (Bsprt[1].x+10*64+Bsprt[1].dx) >=Sprt[i].x then
Bsprt[1].dx := -Bsprt[1].dx;
if (Bsprt[1].x+Bsprt[1].dx) <= (Sprt[i].x+20*64) then
Bsprt[1].dx := -Bsprt[1].dx;
if (Bsprt[1].y+Bsprt[1].dy)<=(Sprt[i].y+20*64) then
Bsprt[1].dy := -Bsprt[1].dy;
if (Bsprt[1].y+Bsprt[1].dy)>=(Sprt[i].y-10*64) then
Bsprt[1].dy := -Bsprt[1].dy;}
end;
← →
Igit © (2004-05-08 17:32) [3]Вот я еще подумал, вот что надумал:
Летит мячик, сверху вниз, под ним скоро будет спрайт (кирпичик). И мячику нужно догадаться, когда отскакивать... я допускаю что я мячик =) и тогда на его месте я рассуждал бы так:1 условие: ball.x+(ball.xSize div 2)>sprt[i].x
2 условие: ball.x+(ball.xSize div 2)<=sprt[i].x + sprt[i].xSize
3 условие: ball.y+ball.ySize = sprt[i].y
но что-то мои рассуждения дают трещину, никак не работает. Код такой:for i:=1 to NumBlocks do
begin
if ((Bsprt[1].x+5*64 + Bsprt[1].dx) > sprt[i].x)
and (Bsprt[1].x+5*64 + Bsprt[1].dx <= sprt[i].x +20*64)
then
if (Bsprt[1].y + Bsprt[1].dy + 10*64 = sprt[i].y)
then
Bsprt[1].dy := -Bsprt[1].dy;
end {begin};
← →
Proger (2004-05-08 18:53) [4]2 Igit.До меня не допрёт зачем умножение на 64?
← →
miek © (2004-05-08 18:58) [5]Это он, видимо, пытается сделать арифметику с фиксированной запятой. Но с ошибками (надо тогда все умножать на 64 - и x, и константы). Мой совет - забить на это и использовать обычную плавающую точку. По крайней мере, пока. Других ошибок с ходу не вижу.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.037 c