Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Swing的Java游戏_Java_Grid Layout - Fatal编程技术网

基于Swing的Java游戏

基于Swing的Java游戏,java,grid-layout,Java,Grid Layout,这是我一直在努力解决的问题 我需要为一些大学课程制作一个游戏。游戏基本上是一个4x4网格。当我点击一个按钮时,玩家应该在其位置的1平方之内随机移动 在网格上随机生成敌方宇宙飞船,如果玩家降落在宇宙飞船上,它就会摧毁它。如果在同一个广场上有两艘敌舰,并且玩家降落在该广场上,那么玩家将被摧毁 我已经使用gridlayout和移动播放器所需的按钮创建了一个GIU,但是我在尝试如何实际使用网格时遇到了问题。我创建了一个元素类来创建网格对象(即敌舰列表),但我不知道如何将该类与我的网格布局一起使用。我知道

这是我一直在努力解决的问题

我需要为一些大学课程制作一个游戏。游戏基本上是一个4x4网格。当我点击一个按钮时,玩家应该在其位置的1平方之内随机移动

在网格上随机生成敌方宇宙飞船,如果玩家降落在宇宙飞船上,它就会摧毁它。如果在同一个广场上有两艘敌舰,并且玩家降落在该广场上,那么玩家将被摧毁

我已经使用
gridlayout
和移动播放器所需的按钮创建了一个GIU,但是我在尝试如何实际使用网格时遇到了问题。我创建了一个
元素
类来创建网格对象(即敌舰列表),但我不知道如何将该类与我的
网格布局
一起使用。我知道我还必须在每次移动后重新绘制网格以反映更改,但我不知道是否需要为此创建自定义重画方法


任何朝正确方向的推动都会非常有帮助。

不久前,我创建了一款基于
网格布局的纸牌游戏。以下是一些用于驱动重大事件的代码:

CardPanel extends JPanel {

public CardPanel() {
    setLayout(gridLayout);
    placeCards(N);
    chatBoxText = new JTextArea(5, 30);
}

public void placeCards(int numCards) {
    for (int i = 0; i < numCards; i++) {
        Card card = deck.distributeCard();
        String cardImageName = card.getImageName();

        JLabel jLabel = makeImage(cardImageName);
        cardSet.add(new GraphicCard(card, jLabel));

        add(jLabel);
        jLabel.addMouseListener(this);
    }

    if (GameLogic.noSetsOnBoard(cardSet)) { 
        gridLayout.setRows(gridLayout.getRows() + 1);
        placeCards(3);
    }
}

public void updateCard(Integer location) {
    Card card = deck.distributeCard();
    String cardImageName = card.getImageName();

    JLabel jLabel = makeImage(cardImageName);
    cardSet.set(location, new GraphicCard(card, jLabel));

    jLabel.addMouseListener(this);
}
}
简言之,是的,这是习惯,但并不难。有比上面更好的方法,这样您就不需要清空整个面板来刷新它,我上面省略的逻辑值得这个特殊的解决方案

我使用的方法跟踪一个
CardPanel
对象,该对象是一个抽象,它不仅包含每个框所表示的信息(在我的例子中是一张带有一些值的卡),还包含要渲染的图形元素


这是很久以前的事了,所以我不记得确切的细节了,但希望这会有所帮助。

也许这篇关于Java Swing中的一个应用程序的文章会有所帮助。我不清楚您的
GraphicCard
方法的作用是什么?GraphicCard是my Card对象的一种扩展。在这个项目中有一些糟糕的OOP概念,它是在我的编码职业生涯的早期完成的,但希望能帮助解决您的问题。请随意浏览项目的其余部分
cardPanel.removeAll();

// Some other logic here

for (GraphicCard card: cardSet) {
    cardPanel.add(card.getJLabel());
}

cardPanel.revalidate();
cardPanel.repaint();