将块放置在屏幕第2部分

时间:2017-07-10 17:25:22

标签: java events mouse

好的,所以我已经发布了一个与此类似的问题,并询问每当我点击鼠标按钮时如何在屏幕上放置块。我已经有了这个工作。这是通过一些答案的帮助以及制作一个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);
}

}

1 个答案:

答案 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