2015-04-23 3 views
0

Я делаю игру Maze прямо сейчас, и я изо всех сил пытался написать код для обнаружения столкновений. Предполагается, что Ball (Number 4) перемещается только на sandimage (который назначен на номер 1), но не должен перемещаться по белому изображению (номер 2 в массиве). Это массив Я использую для карты:Maze Game Collision Detection

int [] map1 = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 
        2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 
        2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
        2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 
        2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
        2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 
        2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
        2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
        2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
        3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; 

И это код для кнопок, которые назначены на номера в массиве:

for(int nCount= 0; nCount < 208; nCount++) //for loop which goes from 0 to 208 
     { 
      JGridButton[nCount] = new JButton(""); //inserts a button for every count in the for loop 
      JPanelnorth.add(JGridButton[nCount]); //this line of code adds the buttons to the named panel 
      JGridButton[nCount].setBorderPainted(false); 
     if(map1[nCount]==1) // the image on the button will be set to sandimage, if the number in the array = 1 
     { 
      JGridButton[nCount].setIcon(sandimage); 
     } 
     if(map1[nCount]==2) // the image on the button will be set to whiteimage, if the number in the array = 2 
     { 
      JGridButton[nCount].setIcon(whiteimage); 
     } 
     if(map1[nCount]== 4) // the image on the button will be set to goldenball, if the number in the array = 4 
     { 
      JGridButton[nCount].setIcon(goldenball); 
     } 
     if(map1[nCount]== 3) // the image on the button will be set to sandstone, if the number in the array = 3 
     { 
      JGridButton[nCount].setIcon(sandstone); 
     } 
     } 
+0

Извините, мне кажется, что код фактического движения отсутствует. Я вижу карту и то, что кажется красками. как вы собираетесь заставить мяч двигаться по лабиринту? Клавиатура? нажмите на одну из ваших кнопок? – user666412

+0

Это код, который я использую для перемещения мяча через лабиринт: public void actionPerformed (событие ActionEvent) { \t Object source = event.getSource(); if (source == Jbuttonup) \t { \t \t JButtoncompass.setIcon (iconCompassnorth); \t JTextField3.setText ("N"); \t JGridButton [nPosition -16] .setIcon (goldenball); \t JGridButton [nPosition] .setIcon (sandimage); \t nPosition = nPosition -16; \t \t} \t код для пустых, левых и правых аналогичен этому –

+0

1) Вместо '208' используйте' map.length'. 2) Вместо нескольких операторов 'if' используйте один оператор' switch'. 3) Вам будет проще использовать «карту» между массивом чисел и массивом кнопок. 4) Вы можете использовать «Карта» между цифрами и изображениями. – user1803551

ответ

0

Что вам нужно сделать, это получите ли он координаты раздела, к которому должен идти мяч. Поэтому, если пользователь нажимает стрелку вниз, он получает координаты, проверяет, является ли этот элемент в массиве белым, а затем, если он не движется.

Кроме того, вы определенно должны использовать 2D-массив, а не 1d-массив для вашей карты, чтобы вы могли получить доступ к позициям по x, y. int[][] map1 = {firstRow of stuff},{second row of stuff}, {etc}; , а затем boolean isTouchingWhite = map1[x][y] == 2;

+0

Здравствуйте, спасибо вам за ваш собеседник, но мой лектор сказал мне, что мы не должны использовать 2D-массивы и придерживаться 1D-массивов для этого проекта. Можете ли вы использовать тот же код для массива 1D? Подобно этому boolean isTouchingWhite = map [] == 2; –

+0

Я действительно не знаю, как должен выглядеть ваш конечный продукт ... можете ли вы опубликовать ссылку на скриншот лабиринта, который должен выполнять пользователь? –

+0

@UmeerRama также вы можете сделать свой 1d массив 2d с помощью умной маленькой формулы. Позиция в вашем массиве равна координате x плюс координата y, умноженная на ширину массива. В более короткой форме 'pos = x + (y * width)' вы можете сделать 'boolean isTouchingWhite = map1 [x + (y * MAP1_WIDTH)] == 2;' –

0

Мне кажется, вы не проверили границы, прежде чем перейти ваш камень. Вот как я хотел бы сделать код для перемещения, от того, что вы показали:

public void actionPerformed(ActionEvent event) 
{ 
    Object source = event.getSource(); 
    int next = nPosition - 16; 
    if(source == Jbuttonup && next >= 0 && map1[next] == 1) 
    { 
     JButtoncompass.setIcon(iconCompassnorth); 
     JTextField3.setText("N"); 
     // update the map 
     map1[next] = 4; 
     map1[nPosition] = 1; 
     nPosition = next; 
     // let the paint method draw the updated map. 
     repaint(); 
    } 
} 

Для левой границы проверки, я бы реализовать, как (next >= 0 && (nPosition % 16) != 0), правая проверка граница должна быть (next < map1.length && (next % 16) != 0) и вниз граничная проверка должен быть (next < map1.length). Ключ должен проверить, что map1[next] == 1