Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Какой Layout выбрать для игры "колобок" ?


Автор: Wowa 21.5.2006, 02:19
Какой Layout выбрать для игры "колобок" ? Будет колобок, который передвигается по 2Д лабиринту.
 

Автор: boevik 21.5.2006, 07:22
Если не графика, то BorderLayot. 

Автор: Wowa 21.5.2006, 09:37
Цитата(boevik @  21.5.2006,  06:22 Найти цитируемый пост)
Если не графика, то BorderLayot.  

Т.е. не графика? Графика конечно, хоть и примитивная.

Добавлено @ 09:39 
Если брать BorderLayot, то получается, что лабиринк и колобка надо в центр засовывать, но как сделать тогда передвижение рисунка. Можно ли как-то координаты его задавать?

Код

        ImageIcon icon = new ImageIcon("Grafik-Daten/smile.gif");
        JLabel label = new JLabel("hello",icon,SwingConstants.RIGHT);
        frame.getContentPane().add(label, BorderLayout.CENTER);
 

Автор: LSD 21.5.2006, 10:35
Если ты сам будешь двигать колобка, то от LayoutManager придется отказаться. И управлять координатами вручную. 

Автор: Wowa 21.5.2006, 10:53
А нельзя ли взять BorderLayot, но в центре(там где игровое поле будет) указывать координаты вручную?

Насколько кстати распространены случаи, когда приходится отказываться от LayoutManager? 

Автор: LSD 21.5.2006, 10:58
Цитата(Wowa @  21.5.2006,  11:53 Найти цитируемый пост)
А нельзя ли взять BorderLayot, но в центре(там где игровое поле будет) указывать координаты вручную?

LayotManager все равно будет перераспределять компоненты сам. Как вариант можно засунуть в центр BorderLayot - JPanel, по краям другие элементы управления. А вот уже непосредсвенно у JPanel установить LayoutManager в null, и двигать там колобка.


Цитата(Wowa @  21.5.2006,  11:53 Найти цитируемый пост)
Насколько кстати распространены случаи, когда приходится отказываться от LayoutManager?

Эсли это обычное приложение, то это редкость. А для игр, не в курсе. 

Автор: Wowa 21.5.2006, 12:26
Цитата(LSD @  21.5.2006,  09:58 Найти цитируемый пост)
Как вариант можно засунуть в центр BorderLayot - JPanel, по краям другие элементы управления.

Я тоже думал об этом, но идет ругань на строчку:
Код

frame.getContentPane().add(game_frame, BorderLayout.CENTER);


Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at GUI.init(GUI.java:97)
    at ххх.main(ххх.java:45)  

Автор: LSD 21.5.2006, 12:33
Он ругается не на это. Судя по всему у тебя game_frame окно (JFrame, JWindow или еще что подобное). А ты пытаешься засунуть его в контейнер, так делать нельзя. Окно нельзя добавить ни в какой другой компонент, оно должно самостоятельно отображаться на экране.
Замени окно на панель. 

Автор: Wowa 21.5.2006, 15:07
Цитата(LSD @  21.5.2006,  09:35 Найти цитируемый пост)
Если ты сам будешь двигать колобка, то от LayoutManager придется отказаться. И управлять координатами вручную.  

В Лабиринте ведь будут стены, всякие сюрпризы и т.п. Не проще ли взять GridBagLayout  для JPanel с полем игры? 

Автор: LSD 21.5.2006, 15:49
Цитата(Wowa @  21.5.2006,  16:07 Найти цитируемый пост)
В Лабиринте ведь будут стены, всякие сюрпризы и т.п. Не проще ли взять GridBagLayout  для JPanel с полем игры?

С точки зрения производительности, лучше один раз отрендерить картинку с полем. А затем рисовать ее в качесве фона панели. Просто двигать колобка в контейнере с GridBagLayout, можно только меняе его GridBagConstraints. А так можно получить только движение по клеткам.

Добавлено @ 15:51 
Отрендерить картинку можно например так:
Код
package wowa;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class MazePanel
{
  public static void main(String[] args) throws IOException
  {
    JPanel panel = new JPanel();
    JFileChooser fileChooser = new JFileChooser("C:\\");
    JColorChooser colorChooser = new JColorChooser(Color.GREEN);
    panel.add(fileChooser);
    panel.add(colorChooser);

    JFrame frame = new JFrame();
    frame.getContentPane().add(panel);
    frame.pack();

    Dimension size = panel.getPreferredSize();
    BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
    panel.paint(img.getGraphics());

    ImageIO.write(img, "PNG", new File("img.png"));

    frame.dispose();
  }
}
 

Автор: Wowa 21.5.2006, 21:40
Цитата(LSD @  21.5.2006,  14:49 Найти цитируемый пост)

С точки зрения производительности, лучше один раз отрендерить картинку с полем. А затем рисовать ее в качесве фона панели.


А потом расставить элементы и колобка на поле без использования LayoutManager? Как мне тогда можно определить, что колобок движется, например, в стенку? В массиве нужно хранить все объекты на поле и их координаты получается. Так ? 

Автор: Goliath 21.5.2006, 22:07
Я когда-то писал подобное. Я делал следующим образом:
1. Делал сетку из квадратов, если изометрия то из ромбиков.
2. Брал двухмерный массив индексы соответствовали каждому графическому квадратику, а значение тип преграды. Например 1 – стена, 2 вода и т.д 
3. Определил передвижение юнита и делал проверку на его место положение.
4. Если он натыкался на преграду определял  тип и делал необходимые действия 
Если нужен код могу поискать и выложить его.
 

Автор: LSD 21.5.2006, 22:08
Цитата(Wowa @  21.5.2006,  22:40 Найти цитируемый пост)
В массиве нужно хранить все объекты на поле и их координаты получается. Так ?

По идее да. У тебя есть некая карта, которая описывает как расставлены элементы лабиринта, на ее основе ты создаешь MazePanel и генерируешь "карту проходимости".
В простейшем варианте, можно представить карту в виде клеток и для каждой простосто определить проходима она или нет. Колобок может находится, строго по центру одной клетки. Исключение момент перехода из одной клетки в другую, в этот момент он занимает 2 клетки и отображается где-то посередине.
Приблизительно такая схема была реализована в WarCraft II. 

Автор: Goliath 21.5.2006, 22:16
Цитата(LSD @  21.5.2006,  22:08 Найти цитируемый пост)
В простейшем варианте, можно представить карту в виде клеток и для каждой простосто определить проходима она или нет. Колобок может находится, строго по центру одной клетки. Исключение момент перехода из одной клетки в другую, в этот момент он занимает 2 клетки и отображается где-то посередине.

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

Автор: Samuil 24.5.2006, 12:10
Блин а не проше все далать в методе pain()? и никаких проблем у Вас не будет smile  

Автор: Zandr 26.5.2006, 13:51
проблем не будет, будет pain smile
Об paint() и идет уже разговор насколько я понял. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)