Java – есть ли способ рисовать мою тайловую карту один раз, а не каждый кадр?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java – есть ли способ рисовать мою тайловую карту один раз, а не каждый кадр?

Сообщение Anonymous »

Моя игра запускается со скоростью секунды на кадр, когда я рисую тайловую карту на игровой панели, поскольку она делает это каждый кадр и просто засоряется. Я включу некоторый код классов плитки, карты и панели. надеюсь, кто-нибудь сможет помочь.
мне хотелось бы создать способ создать карту и отобразить ее один раз, а все остальное будет обновляться поверх нее. я новичок в Java и раньше писал игры на pygame (что странно, поскольку я думал, что у меня будет больше подобных проблем с Python из-за GIL)
//first the GamePanel class.

package main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

import entity.Player;

import tile.TileMap;

public class GamePanel extends JPanel implements Runnable {
// Screen Settings
public final int tileSize = 25;
public final int maxScreenColumn = 26;
public final int maxScreenRow = 18;

final int screenWidth = tileSize * maxScreenColumn;
final int screenHeight = tileSize * maxScreenRow;

final int FPS = 60;

Thread gameThread;

KeyHandler keyH = new KeyHandler();

public int playerX = tileSize * 13;
public int playerY = tileSize * 10;
public int playerSpeed = 3;

TileMap tileM = new TileMap(this);

Player player = new Player(this, keyH);

// set player's default pos

public GamePanel() {
this.setPreferredSize(new Dimension(screenWidth, screenHeight));
this.setBackground(Color.black);
this.setDoubleBuffered(true);
this.addKeyListener(keyH);
this.setFocusable(true);

}

public void startGameThread() {
gameThread = new Thread(this);
gameThread.start();
}

public void run() {

double drawInterval = 1000000000/FPS;
double nextDrawTime = System.nanoTime() + drawInterval;

while (gameThread != null) {

// 1. Update info such as character pos etc...
update();
// 2. Draw to the gamePanel object...
repaint();

try {
double remainingTime = nextDrawTime - System.nanoTime();

if (remainingTime < 0) {
remainingTime = 0;
}

Thread.sleep((long)remainingTime / 1000000);

nextDrawTime += drawInterval;

} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public void update() {

player.update();

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D)g;

tileM.drawTileMap(g2);

// tile.draw(g2);

player.draw(g2);

g2.dispose();

}

}

// Next is the TileMap class
package tile;

import main.GamePanel;
import java.awt.Graphics2D;

public class TileMap {

GamePanel gp;

public String tileMap[][] =
{
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" },
{"G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G" }

};

public TileMap(GamePanel gp) {

this.gp = gp;

}

public void drawTileMap (Graphics2D g2) {

for (int col = 0; col < gp.maxScreenColumn-1; col++) {
for (int row = 0; row < gp.maxScreenRow-1; row++) {
if (tileMap[row][col].equalsIgnoreCase("g")) {

Tile tile = new Tile(gp, col*gp.tileSize, row*gp.tileSize, "/res/tiles/grass1.png");
tile.draw(g2);

}
}
}

}

}

// Finally the Tile class.
package tile;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

import main.GamePanel;

public class Tile {

private BufferedImage image;
public boolean collision = false;

GamePanel gp;

int x;
int y;

public String path;

public Tile (GamePanel gp, int x, int y, String path) {

this.gp = gp;
this.x = x;
this.y = y;
this.setImage(path);

}

public BufferedImage getImage () {
return image;

}

public void setImage (String path) {
try {

this.image = ImageIO.read(getClass().getResourceAsStream(path));
// this.image = ImageIO.read(new FileInputStream(path));
} catch (IOException e) {

e.printStackTrace();
System.out.println(path);
} catch (IllegalArgumentException e1) {

e1.printStackTrace();
System.out.println(path);
}
}

public void draw (Graphics2D g2) {
g2.drawImage(image, x, y, gp.tileSize, gp.tileSize, null);
}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... very-frame
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»