好的,所以我已经发布了一个与此类似的问题,并询问每当我点击鼠标按钮时如何在屏幕上放置块。我已经有了这个工作。这是通过一些答案的帮助以及制作一个List来实现的,当按下鼠标按钮时,某个图块被添加到该列表中(每个图块都有一个图像),然后重新绘制。现在因为我的游戏中有多个瓷砖,所以我显然已经制作了草地砖图。我有这个问题,当我放置一个块,事件注册但它没有在地图上显示,但确实显示在默认屏幕上(普通JFrame窗口没有任何东西)。这将允许完美的块放置,因此它们不会相互重叠。
我的想法是,而不是说当按下鼠标按钮并在鼠标坐标处绘制一个块时,我想找到一种方法来替换瓷砖。例如,如果我运行我的游戏,我有一个10 x 10的瓷砖地图,用草砖填充,当我点击草砖时,其中一个草砖将被石砖取代。
我想这样做的方法就是 -
public void mousePressed(MouseEvent e) {
if(MouseEvent.BUTTON1 == Tile.grassTile.id) {
tiles.add(new StoneTile(e.getX() - 16, e.getY() - 16,0));
}
}
我之所以这么做是因为我已经为所有的tile分配了一个id,当e.getX()和e.getY()(鼠标坐标)遇到了一个具有特定id的tile时,然后执行上面if语句中的代码。显然这不起作用,但它是有道理的,我仍然认为这可能有用,但我很可能错过了一些东西。我知道这不是唯一的方式,并且对所有比我更好的想法持开放态度。
谢谢
这是为我的游戏建模的可运行程序。
GameFrame -
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GameFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String TITLE = "Tile Game"; // Game Frame Window Title
private final JPanel gamePanel;
public GameFrame(int width, int height) {
gamePanel = new GamePanel(width, height);
}
public void createAndShow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(TITLE);
add(gamePanel);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GameFrame gameFrame = new GameFrame(640, 480);
gameFrame.createAndShow();
}
});
}
}
的GamePanel
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList
import java.util.List;
import javax.swing.JPanel;
public class GamePanel extends JPanel {
private List<stoneTileAdder> tiles; // Stores the Tile objects to be displayed
public GamePanel(int width, int height) {
tiles = new ArrayList<>();
setPreferredSize(new Dimension(width, height));
addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
// Do nothing
}
@Override
public void mousePressed(MouseEvent e) {
tiles.add(new StoneTile(e.getX(), e.getY(),0));
// Repaint the JPanel, calling paint, paintComponent, etc.
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
// Do nothing
}
@Override
public void mouseExited(MouseEvent e) {
// Do nothing
}
});
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // Make sure you do this
// For this example, using black as the color to draw
g.setColor(Color.BLACK);
// Iterate over the tile list and draw them to the JPanel
for (stoneTileAdder tile : tiles) {
Rectangle tileRect = tile.getBounds();
g.fillRect(tileRect.x, tileRect.y, tileRect.width, tileRect.height);
}
}
}
StoneTile -
public class StoneTile extends stoneTileAdder {
public StoneTile(int x, int y,int id) {
super(x, y, Tile.TILEWIDTH,Tile.TILEHEIGHT, id);
}
}
stoneTileAdder -
import java.awt.Rectangle;
public abstract class stoneTileAdder {
private int x, y, width, height,id;
public stoneTileAdder(int x, int y, int width, int height,int id) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.id = id;
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
}
答案 0 :(得分:0)
添加切片的更简单方法是找到鼠标按下的Component,如下所示:
@Override
public void mousePressed(MouseEvent e) {
Component selectedTile = findComponentAt(e.getPoint());
if(MouseEvent.BUTTON1 == Tile.grassTile.id && selectedTile instanceof Tile) {
tiles.add(new StoneTile(selectedTile.getX(), selectedTile.getY(), 0));
}
}
这会点击拼贴的坐标,并在其上方放置StoneTile
。