проблема с обработкой столкновения

369
15 февраля 2017, 22:12

в классе "math" есть метод "p" отвечаюший за движение персонажа

перед движением он проверяет то место куда пойдет

но почемуто это работает не во все направления

с 2х сторон черного квадрата он не может пройти а с 2х других может

package test3;

import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent;

import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel;

public class maen { public static void main(String[]args){ draw d=new draw(); math m=new math(); m.setplace(); JFrame f=new JFrame(); f.setVisible(true); f.setSize(200,200); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(d);

    //--------------------------------------------------------------------
    JButton b1=new JButton(new AbstractAction() {
        public void actionPerformed(ActionEvent arg0) {
            m.p(1);
            d.rp();
        }
    });
    JButton test=new JButton();
    JButton b2=new JButton(new AbstractAction() {
        public void actionPerformed(ActionEvent arg0) {
            m.p(2);
            d.rp();
        }
    });
    JButton b3=new JButton(new AbstractAction() {
        public void actionPerformed(ActionEvent arg0) {
            m.p(3);
            d.rp();
        }
    });
    JButton b4=new JButton(new AbstractAction() {
        public void actionPerformed(ActionEvent arg0) {
            m.p(4);
            d.rp();
        }
    });
    //--------------------------------------------------------------------
    f.add(b1);
    f.add(b2);
    f.add(b3);
    f.add(b4);
}

} class draw extends JPanel{ math m=new math(); public void rp(){ repaint(); } public void paintComponent(Graphics g){ for(int x=0;x<10;x++){ for(int y=0;y<10;y++){ g.setColor(Color.blue); g.fillRect((x*10)+20,(y*10)+20,10,10); if(m.xy[x][y]>0){ switch(m.xy[x][y]){ case 1: g.setColor(Color.red); g.fillRect((x*10)+20,(y*10)+20,10,10); break; case 2: g.setColor(Color.BLACK); g.fillRect((x*10)+20,(y*10)+20,10,10); break; }

            }    
        }
    }
}

} class math{ static int[][] xy=new int[10][10];

int x=4; int y=8; public void setplace(){ this.xy[6][6]=2; this.xy[3][3]=2; } public void p(int bv){ int x=this.x; int y=this.y; int xb=x; int yb=y; int xp=x++; int yp=y++; int xm=x--; int ym=y--; switch(bv){ case 1: if(xy[xp][y]<2) this.x--; break; case 2: if(xy[xm][y]<2) this.x++; break; case 3: if(xy[x][yp]<2) this.y--; break; case 4: if(xy[x][ym]<2) this.y++; break; } System.out.println(this.x+" "+this.y); this.xy[xb][yb]=0; this.xy[this.x][this.y]=1; System.out.println("xym"+xy[xm][y]+xy[x][ym]+xy[x][y]); System.out.println("xyp"+xy[xp][y]+xy[x][yp]+xy[x][y]); }

}

Answer 1
public void p( int bv ) {
    int start_x = x;
    int start_y = y;
    int x_plus = x+1;
    int y_plus = y+1;
    int x_minus = x-1;
    int y_minus = y-1;
    switch ( bv ) {
        case 1://LEFT
            if ( x_minus < 0 )
                return;
            if ( xy[x_minus][y] < 2 )
                this.x = x_minus;
            break;
        case 2://RIGHT
            if ( x_plus > 9 )
                return;
            if ( xy[x_plus][y] < 2 )
                this.x = x_plus;
            break;
        case 3://UP
            if ( y_minus < 0 )
                return;
            if ( xy[x][y_minus] < 2 )
                this.y = y_minus;
            break;
        case 4://DOWN
            if ( y_plus > 9 )
                return;
            if ( xy[x][y_plus] < 2 )
                this.y = y_plus;
            break;
    }
    this.xy[start_x][start_y] = 0;
    this.xy[this.x][this.y] = 1;
}

PS: Давайте переменным человекопонятные наименования; направления движения можно оформить в виде enumа; имена классов принято писать с заглавной.
PPS: Чем проще и примитивнее выглядит код - тем лучше: ваш стиль написания трудночитаем( именно этот метод ), т.к. чтобы понять какое значение вы хотите присвоить приходится пробегать глазами весь код выше, при этом учитывая что использовался постинкремент. Всё это осложняет поиск ошибки и хотя скорее всего она была проста, было легче переписать чем разобраться.

READ ALSO
Использование @hide в javadoc

Использование @hide в javadoc

Не раз встречался с аннотацией @hide в JavadocИзвестно что эта аннотация запрещает доступ к методу после релиза (доступ всё так же можно получить...

391
Drag And Drop Files

Drag And Drop Files

ЗдравствуйтеК сожалению возникла потребность реализовать Drag And Drop в desktop приложении, на Swing

363
Кроссдоменные запросы Post,Get через javascript и Java?

Кроссдоменные запросы Post,Get через javascript и Java?

Уже много дней пытаюсь понять 2 вещи:

481
Можно ли сделать границу (border) у элемента Floating Action Button?

Можно ли сделать границу (border) у элемента Floating Action Button?

Можно ли у элемента FAB сделать заливку границ по периметру кнопки другим цветом? Можно ли задать ширину границы?

322