2015-12-17 3 views
0

Я пытаюсь сделать pacman, и я сделал несколько столкновений:Можно ли как-нибудь сократить этот код столкновения?

Так что это только столкновение для верхней стены, но это не нужно. Вот изображение http://i.epvpimg.com/XsXvg.png Итак, как работает моя игра, у меня есть много форм, в которых пакман прыгает, если он ходит так немного, как урожай. Это не идеальное движение, но это не главное.

Код говорит: Если pacman (Shape1) находится в том же месте, что и другие фигуры, то вы не можете подняться.

Так что я хочу знать. Есть ли способ сократить код с помощью массивов или каким-то образом.

// COLLISION 
    IF (Shape1.Top=Shape30.Top) 
    or (Shape1.Top=Shape41.Top) and (Shape1.Left=Shape41.Left) 
    or (Shape1.Top=Shape42.Top) and (Shape1.Left=Shape42.Left) 
    or (Shape1.Top=Shape56.Top) and (Shape1.Left=Shape56.Left) 
    or (Shape1.Top=Shape57.Top) and (Shape1.Left=Shape57.Left) 
    or (Shape1.Top=Shape58.Top) and (Shape1.Left=Shape58.Left) 
    or (Shape1.Top=Shape72.Top) and (Shape1.Left=Shape72.Left) 
    or (Shape1.Top=Shape74.Top) and (Shape1.Left=Shape74.Left) 
    or (Shape1.Top=Shape76.Top) and (Shape1.Left=Shape76.Left) 
    or (Shape1.Top=Shape118.Top) and (Shape1.Left=Shape118.Left) 
    or (Shape1.Top=Shape120.Top) and (Shape1.Left=Shape120.Left) 
    or (Shape1.Top=Shape122.Top) and (Shape1.Left=Shape122.Left) 
    or (Shape1.Top=Shape143.Top) and (Shape1.Left=Shape143.Left) 
    or (Shape1.Top=Shape144.Top) and (Shape1.Left=Shape144.Left) 
    or (Shape1.Top=Shape160.Top) and (Shape1.Left=Shape160.Left) 
    or (Shape1.Top=Shape162.Top) and (Shape1.Left=Shape162.Left) 
    or (Shape1.Top=Shape175.Top) and (Shape1.Left=Shape175.Left) 
    or (Shape1.Top=Shape176.Top) and (Shape1.Left=Shape176.Left) 
    or (Shape1.Top=Shape192.Top) and (Shape1.Left=Shape192.Left) 
    or (Shape1.Top=Shape194.Top) and (Shape1.Left=Shape194.Left) 
    or (Shape1.Top=Shape167.Top) and (Shape1.Left=Shape167.Left) 
    or (Shape1.Top=Shape168.Top) and (Shape1.Left=Shape168.Left) 
    or (Shape1.Top=Shape182.Top) and (Shape1.Left=Shape182.Left) 
    or (Shape1.Top=Shape184.Top) and (Shape1.Left=Shape184.Left) 
    or (Shape1.Top=Shape186.Top) and (Shape1.Left=Shape186.Left) 
    or (Shape1.Top=Shape235.Top) and (Shape1.Left=Shape235.Left) 
    or (Shape1.Top=Shape267.Top) and (Shape1.Left=Shape267.Left) 
    or (Shape1.Top=Shape289.Top) and (Shape1.Left=Shape289.Left) 
    or (Shape1.Top=Shape219.Top) and (Shape1.Left=Shape219.Left) 
    or (Shape1.Top=Shape220.Top) and (Shape1.Left=Shape220.Left) 
    or (Shape1.Top=Shape221.Top) and (Shape1.Left=Shape221.Left) 
    or (Shape1.Top=Shape269.Top) and (Shape1.Left=Shape269.Left) 
    or (Shape1.Top=Shape273.Top) and (Shape1.Left=Shape273.Left) 
    or (Shape1.Top=Shape283.Top) and (Shape1.Left=Shape283.Left) 
    or (Shape1.Top=Shape284.Top) and (Shape1.Left=Shape284.Left) 
    or (Shape1.Top=Shape230.Top) and (Shape1.Left=Shape230.Left) 
    or (Shape1.Top=Shape231.Top) and (Shape1.Left=Shape231.Left) 
    or (Shape1.Top=Shape232.Top) and (Shape1.Left=Shape232.Left) 
    or (Shape1.Top=Shape246.Top) and (Shape1.Left=Shape246.Left) 
    or (Shape1.Top=Shape248.Top) and (Shape1.Left=Shape248.Left) 
    or (Shape1.Top=Shape250.Top) and (Shape1.Left=Shape250.Left) 
    or (Shape1.Top=Shape262.Top) and (Shape1.Left=Shape262.Left) 
    or (Shape1.Top=Shape263.Top) and (Shape1.Left=Shape263.Left) 
    or (Shape1.Top=Shape264.Top) and (Shape1.Left=Shape264.Left) 
    or (Shape1.Top=Shape278.Top) and (Shape1.Left=Shape278.Left) 
    or (Shape1.Top=Shape280.Top) and (Shape1.Left=Shape280.Left) 
    or (Shape1.Top=Shape282.Top) and (Shape1.Left=Shape282.Left) 
    or (Shape1.Top=Shape294.Top) and (Shape1.Left=Shape294.Left) 
    or (Shape1.Top=Shape303.Top) and (Shape1.Left=Shape303.Left) 
    or (Shape1.Top=Shape320.Top) and (Shape1.Left=Shape320.Left) 
    or (Shape1.Top=Shape322.Top) and (Shape1.Left=Shape322.Left) 
    or (Shape1.Top=Shape335.Top) and (Shape1.Left=Shape335.Left) 
    or (Shape1.Top=Shape336.Top) and (Shape1.Left=Shape336.Left) 
    or (Shape1.Top=Shape309.Top) and (Shape1.Left=Shape309.Left) 
    or (Shape1.Top=Shape339.Top) and (Shape1.Left=Shape339.Left) 
    or (Shape1.Top=Shape357.Top) and (Shape1.Left=Shape357.Left) 

    then 
    begin 
     Up:=false; 
    end; 
+3

Это, безусловно, совершенно неправильный подход к графическому приложению. Вы должны делать все свое рисование самостоятельно, не используя элементы управления - и эти строки должны быть виртуальными. Вы будете вести больше кошмаров, как это дальше, чем дальше. –

+3

Да, вы можете сократить этот код с помощью массивов. И да, использование элементов управления для ваших актеров - плохая идея. –

+0

Хорошо Спасибо. Знаете ли вы, как я могу сократить его? И да, новичок, и я не знаю больше этого. – HDGoldenGaming

ответ

0

Во-первых, вам нужно отделить графику от самой игры. Так что в вашем случае может быть что-то вроде

Тип TCellType = (ctEmpty, ctWall, ctPacMan, ctGhost); //и т.д.

затем создать 2 двумерный массив

вар Game = массив [1..GameWidth, 1..GameHeight] из TCellType;

Это имеет (по крайней мере) два преимущества. Во-первых, у вас нет накладных расходов на визуальные компоненты. Во-вторых, обнаружение столкновения становится намного проще в том, что вам нужно только посмотреть на одну ячейку (ту, куда вы пытаетесь идти). Поэтому, если позиция pacman (PacX, PacY), вам нужно только посмотреть на игру в игре [PacX-1, PacY], если вы двигаетесь влево.

Если вы переехали, перекрасьте ячейки, в которые вы двигаетесь.

Я оставлю детали для вас.