2014-11-29 2 views
-1

Это проблема, с которой я действительно борется сSwing based Java-игра

Мне нужно создать игру для некоторых курсовых работ университета. Игра в основном представляет собой сетку 4x4. Когда я нажимаю кнопку, игрок должен перемещаться случайным образом в пределах 1 квадрата своего местоположения.

Есть вражеские космические корабли, которые генерируются случайным образом по сетке, и если игрок приземляется на космический корабль, он уничтожает его. если на той же площади есть два вражеских корабля, и игрок приземляется на эту площадь, игрок уничтожается.

Я создал GIU, используя gridlayout и кнопку, которую мне нужно переместить, но у меня возникают проблемы с попыткой выяснить, как на самом деле использовать сетку. Я создал класс element для создания объектов для сетки (т. Е. Список вражеских кораблей), но я не знаю, как использовать этот класс с моим gridlayout. Я знаю, что мне также нужно перерисовать сетку после каждого перехода, чтобы отразить изменения, но я не знаю, нужно ли мне создавать для них настраиваемый метод перерисовки.

Любое нажатие в правильном направлении, чтобы я мог получить свою программу на самом деле, что-то действительно поможет.

+0

Возможно, эта статья о игре [2048] (http://java-articles.info/articles/?p=516) в Java Swing была бы полезна. –

ответ

0

Некоторое время назад я создал карточную игру, которая также работала на основе GridLayout. Ниже приведены некоторые из кода, который был использован для привода основных событий:

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 здесь является объектом, который представляет GridLayout (вы видите конструктор), а также некоторые из этих вспомогательных методов.

Далее, на конкретных действиях, у меня есть следующий код:

cardPanel.removeAll(); 

// Some other logic here 

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

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

Короче говоря, да, это обычай, но это не сложно. Есть лучшие способы сделать это, чем выше, так что вам не нужно очищать всю панель, чтобы ее обновить, логика, которую я пропустил выше, заслуживает этого конкретного решения.

Подход, который я использовал, отслеживал объект CardPanel, который был абстракцией, которая содержала не только информацию, представленную каждой коробкой (в моем случае карту с некоторыми значениями), но и графический элемент, который нужно визуализировать.

Это было какое-то время назад, поэтому я не помню точных данных, но, надеюсь, это полезно.

+0

Я смущен, что делает ваш метод «GraphicCard»? –

+0

https://github.com/mmscibor/GameSet/blob/master/src/GraphicCard.java GraphicCard - это расширение (вид) моего объекта карты. Некоторые бедные концепции ООП в этом проекте, это было сделано довольно рано в моей карьере кодирования, но, надеюсь, поможет с вашей проблемой. Не стесняйтесь перемещаться по остальной части проекта – mike