Моя игра запускается со скоростью секунды на кадр, когда я рисую тайловую карту на игровой панели, поскольку она делает это каждый кадр и просто засоряется. Я включу некоторый код классов плитки, карты и панели. надеюсь, кто-нибудь сможет помочь.
мне хотелось бы создать способ создать карту и отобразить ее один раз, а все остальное будет обновляться поверх нее. я новичок в 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
Java – есть ли способ рисовать мою тайловую карту один раз, а не каждый кадр? ⇐ JAVA
Программисты JAVA общаются здесь
1735604493
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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79318903/java-is-there-a-way-to-draw-my-tilemap-once-instead-of-every-frame[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия