Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Арканоид. Алгоритм отражения от стен.   Найти похожие ветки 

 
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
       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;
Полный исходник http://bzdun.haos.net/game.rar


 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.063 c
3-1090972330
AleKo
2004-07-28 03:52
2004.08.22
Проверка на вхождение в операторе WHERE IN


9-1084098338
jet_set
2004-05-09 14:25
2004.08.22
игра построенная с помощью массивов.


3-1091156571
Abrams
2004-07-30 07:02
2004.08.22
FastReport - динамически сменить ориентацию страницы


1-1091786912
gigabytepretender
2004-08-06 14:08
2004.08.22
Своя орфография в Word98


1-1092119059
sdw_syscoder
2004-08-10 10:24
2004.08.22
Как разместить надпись или кнопку в правой стороне ToolBar a