1

私は学校のプロジェクトで初めての 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);

この配列をどのように描画できるか知っていますか? コードが長くてすみません…

4

2 に答える 2

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

于 2013-04-29T11:23:31.740 に答える
2

壁を次のようにする方が良い

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

あなたが簡単にできるように、それはより最適です:

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

壁の検出も同様です。

于 2013-04-29T11:24:11.137 に答える