网格线碰撞检查

时间:2016-06-23 09:00:05

标签: java swing japplet

最近我一直在研究网格线检测系统,我知道有一种算法完全按照我想要它做的,但我是那种想要的人自己做东西。 ;)

所以我在使用1行检查时取得了一些成功,但现在我使用20x20的网格来检查它不再有效的线条。

问题出现在我为此系统制作的碰撞类中。

不知何故,数字从网格阵列中消失,我不知道为什么

这是代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * beschrijving
  *
  * @version 1.0 van 22-6-2016
  * @author 
  */

public class gridline extends JApplet {
  // Begin variabelen
  int[][] grid = new int[20][20];
  int[] light = new int[2];
  int[][] line = new int[2][2];
  // Einde variabelen

  public void init() {
    Container cp = getContentPane();
    cp.setLayout(null);
    cp.setBounds(0, 0, 600, 600);
    // Begin componenten
    for (int a=0; a<20; a++) {
      for (int b=0; b<20; b++) {
        grid[a][b] = (int) (Math.random()*10);
      } // end of for
    } // end of for

    line[0][0] = (int) (Math.random()*20);
    line[0][1] = (int) (Math.random()*20);
    line[1][0] = (int) (Math.random()*20);
    line[1][1] = (int) (Math.random()*20);

    light[0] = (int) (Math.random()*20);
    light[1] = (int) (Math.random()*20);
    // Einde componenten

  } // end of init
  //Custom classes
  private boolean collide(int x1, int y1,int x2, int y2) {
    boolean collide = true;

    int tempx = x1 - x2;
    int tempy = y1 - y2;
    int sx = 0;
    int sy = 0;
    int x = 0;
    int y = 0;
    if (tempx == 0) {
      tempx = 1;
      sx = 1;
    } // end of if
    if (tempy == 0) {
      tempy = 1;
      sy = 1;
    } // end of if
    if (sx == 0) {
      x = tempx + tempx/Math.abs(tempx);
    } // end of if
    else {
      x = tempx;
    } // end of if-else
    if (sy == 0) {
      y = tempy + tempy/Math.abs(tempy);
    } // end of if
    else {
      y = tempy;
    } // end of if-else
    int absx = Math.abs(x);
    int absy = Math.abs(y);
    int nex = x/absx;
    int ney = y/absy;
    int off = 0;
    float count = 0;
    float step = 0;
    if (absx != absy) {
      if (absx == Math.min(absx,absy)) {
        step = (float) absx/absy;
        calc1: for (int a=0; a<absy; a++) {
          count += step;
          if (count > 1 && x1+off != x2) {
            count -= 1;
            off += nex;
          } // end of if
          if (grid[x1+off][y1+a*ney] == 9) {
            collide = false;
            break calc1;
          } // end of if
        } // end of for
      } // end of if
      else{
        step = (float) absy/absx;
        calc2: for (int a=0; a<absx; a++) {
          count += step;
          if (count > 1 && y1+off != y2) {
            count -= 1;
            off += ney;
          } // end of if
          if (grid[x1+a*nex][y1+off] == 9) {
            collide = false;
            break calc2;
          } // end of if
        } // end of for
      }
    } // end of if
    else {
      calc3: for (int a=0; a<absx; a++) {
        if (grid[x1+a*nex][y1+a*ney] == 9) {
          collide = false;
          break calc3;
        } // end of if
      } // end of for
    } // end of if-else

    return collide;
  }

  private int length(int x1, int y1, int x2, int y2) {
    double distance = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
    return (int) distance;
  }

  // Begin eventmethoden
  public void paint (Graphics g){
    boolean draw = true;
    Color col;
    for (int a=0; a<20; a++) {
      for (int b=0; b<20; b++) {
        draw = collide(a,b,light[0],light[1]);

        if (draw) {
          int len = Math.max(255-length(a*30+15,b*30+15,light[0]*30+15,light[1]*30+15),0);
          col = new Color(len,len,len);
          g.setColor(col);
          g.fillRect(a*30,b*30,30,30);
        } // end of if
        else{
          col = new Color(0,0,0);
          g.setColor(col);
          g.fillRect(a*30,b*30,30,30);
        }
      } // end of for
    } // end of for
  }
    // Einde eventmethoden

} // end of class gridline

如果没有人想要查看与此类似的代码,我会理解它,但它可能对您自己的项目有所帮助,如果您复制并粘贴我的代码,我完全可以使用它你的项目。

非常感谢先生。

0 个答案:

没有答案