Java:从数组中绘制图形

时间:2013-04-29 11:10:06

标签: java multidimensional-array draw graphics2d

我正在研究我的第一个学校项目的java游戏,我在根据数组中的信息绘制图形时遇到了一些问题。

我基本上要做的是创建一个2D数组(矩阵),它将存储玩家可以移动的世界的所有信息。所以数组中的一些元素将包含一个墙,其他元素可以让玩家进入,等等......

我有一个我正在使用的示例代码:

/**
*
* @author Rasztemberg
*/
package simpleGame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;


/**
 * GameBoard is a part of JPanel. 
 * It has a Graphical Object {@link Graphics}
 * that can be used to render shapes etc. Pass it's reference to any object you 
 * want to display in the gameBoard panel.
 */


public class GameBoard extends JPanel implements KeyListener{



Player player; 
Player enemy;

public GameBoard(){

    // SETUP PLAYER ON THE BOARD;
    int xPos = 0; 
    int yPos = 0; 
    int width = 20; 
    int height = 20; 
    Color playerC = Color.BLUE;

    player = new Player(xPos, yPos, width, height, playerC);

    // SETUP ENEMY ON THE BOARD;
    enemy = new Player(100, 100, width, height, Color.RED);

    addKeyListener(this);
}


/*
 * 
 * JPanel function to display all gameBoard object graphics.
 */

@Override
public void paint(Graphics g){
    super.paint(g); // Call it's parent for proper rendering.

    player.display(g);
    enemy.display(g);
}


@Override
public void keyTyped(KeyEvent e) {}

@Override
public void keyPressed(KeyEvent e) {

    int keyCode = e.getKeyCode();
    if (keyCode == KeyEvent.VK_LEFT) {
         player.moveLeft();
     }

     if (keyCode == KeyEvent.VK_RIGHT) {
         player.moveRight();
     }

     if (keyCode == KeyEvent.VK_DOWN) {
         player.moveDown();
     }

     if (keyCode == KeyEvent.VK_UP) {
         player.moveUp();
     }
}

@Override
public void keyReleased(KeyEvent e) {}


/**
 * Set's focus on the panel so key events are catch. 
 */

public boolean isFocusTraversable() {
    return true;
}

}

/**
* @author Rasztemberg
*/
package simpleGame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import javax.swing.JPanel;


/** 
 *  This is main player Class. 
 *  
 */


public class World  {

 // Snake parameters

 private int x; 
 private int y; 
 private int width; 
 private int height; 
 private Color color;

 /** 
 *  Class constructor. Called when instantiated.
 *  Assigns x and y coordinates to position the player. 
 *  Sets width, height and color to the rendered object.
 * 
 */


public World(int x, int y, int w, int h, Color c){

    this.x = x; 
    this.y = y; 
    this.width = w; 
    this.height = h;
    this.color = c;
}

/**
 * Accepts Graphics object to render 
 * player 1 shape
 */

public void display(Graphics g) {

    // This is player rendered graphics.
    Graphics2D walls = (Graphics2D) g;    // Graphical library to render shapes.
    walls.setColor(color);
    walls.drawRect(x, y, width, height);
    walls.fillRect(x, y, width, height);
} 
}

现在,我使用for循环来填充测试数组:

int[][] wallArray = new int[800][600];

        for (int x = 0; x < wallArray.length; x++) {
            for (int y = 0; y < wallArray.length; y++) {
                wallArray[x][y] = 1;
            }
        }

        wallArray[100][100] = 0;
        greatWall = new World(wallArray);

你知道怎么画这个数组吗?我为代码的长度道歉...

2 个答案:

答案 0 :(得分:2)

只需在GameBoard的绘画中根据数组绘制一些东西:

@Override
public void paint(Graphics g){
    super.paint(g); // Call it's parent for proper rendering.
    for (int i = 0; i<wallArray.length; i++)
        for (int j = 0; j<wallArray[0].length; j++){
            //do something for every field in the array
            //i.e. g.setColor(Color.getColor(wallArray[i][j], 50, 50)); 
            //g.drawLine(i,j,i,j);
    }
    player.display(g);
    enemy.display(g);
}

但是你应该首先阅读一些关于Java绘画的教程: http://www.oracle.com/technetwork/java/painting-140037.html

答案 1 :(得分:2)

最好将墙壁作为

List<Rectangle> walls = new ArrayList<>();

这是更优化的,你可以这样做:

for (Rectangle rect: walls) {
    g.fillRect(rect.x, rect.y, rect.width, rect.height);
}

墙壁检测相似。