Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2013, 15:27   #1
Dmitry333
Пользователь
 
Аватар для Dmitry333
 
Регистрация: 13.11.2009
Сообщений: 60
По умолчанию repaint applet

Доброго времени суток, я в java новичок. По долгу учебы приходится выполнять практические задания, так вот одно из них - написание простой игры (реализация апплетом).
Что такое апплет я знаю, как с ним работать тоже, но вопрос следующий: всю логику приложения я решил реализовать в классе Game, в конструкторе класса апплета создаю экземпляр Game, в init - вызываю старт, в stop - пауза и тд. вот здесь я и столкнулся с вопросом рендеринга, а именно как мне прорисовывать форму, для себя я выбрал два варианта:
1. при создании экземпляра Game в конструктор внедрять зависимость типа Applet и передавать ссылку на класс приложения
2. в классе Game создать событие типа onRepaint, подписать на него апплет и вызывать game.render(g) в обработчике события?

Подскажите наилучший вариант или направьте в нужное русло, заранее спасибо...

Последний раз редактировалось Dmitry333; 18.03.2013 в 15:45.
Dmitry333 вне форума Ответить с цитированием
Старый 19.03.2013, 22:10   #2
Neketek
Пользователь
 
Регистрация: 22.03.2012
Сообщений: 26
По умолчанию

Знаете, мне профессор как то сказал что апплеты мертвы, но я все же немного поработал,ради интереса. Скажите для начала, умеете ли вы осуществлять двойную буфферизацию, для игры она понадобится, затем необходимо создать классы, которые будут содержать информацию о графических обьектах, после переопределить метод рисования так, что бы он мог вытаскивать из, выше указанных, классов информацию и выполнять отрисовку по ней, и, конечно, необходим массив этих классов. При переборе массива в рисовании for each вам в помощь. Кстати , лучше создать класс наследник апплета , который будет уметь рисовать так ,как необходимо, а затем наследовать его.
Что же касается логики , то ей в таком случае надо передать ссылку на массив обьектов , указанных выше, тогда это будет прекрасно работать. Хотя лично мне непонятно зачем в простой игре выносить логику отдельно. Если бы вы поток создали для параллельной работы примитивной физики, я бы это понял, но так не особо, простые приложения лучше не разбивать на два класса.

Последний раз редактировалось Neketek; 19.03.2013 в 22:19.
Neketek вне форума Ответить с цитированием
Старый 19.03.2013, 22:12   #3
Neketek
Пользователь
 
Регистрация: 22.03.2012
Сообщений: 26
По умолчанию

Сложно но , это универсальный метод. Для определения типа обьекта используйте оператор обьект instanseof тип , возвращает булеан.
Neketek вне форума Ответить с цитированием
Старый 19.03.2013, 23:06   #4
Dmitry333
Пользователь
 
Аватар для Dmitry333
 
Регистрация: 13.11.2009
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Neketek Посмотреть сообщение
Сложно но , это универсальный метод. Для определения типа обьекта используйте оператор обьект instanseof тип , возвращает булеан.
спасибо за содержательный ответ) насчет instanseof - как-то по детски, можно просто для всех объектов интерфейс прикрутить и полиморфно вызывать ну например render()
Dmitry333 вне форума Ответить с цитированием
Старый 19.03.2013, 23:13   #5
Dmitry333
Пользователь
 
Аватар для Dmitry333
 
Регистрация: 13.11.2009
Сообщений: 60
По умолчанию

ну ладно с графикой, я так подумал, никто от меня её так уж сильно не требует, поэтому решил обойтись просто созданием компонентов )) но тут проблемка нарисовалась, не обновляется форма (( вот код апплета

PS смысл игры - найти правильную кнопку за ограниченное время и нажить на неё, тогда следующий уровень и количество кнопок увеличивается и тд.

Код:

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Panel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class MyGame extends Applet {

    // контейнер для кнопок.
    Panel field;
    int level;
    
    public MyGame() throws HeadlessException {                
        setSize(400, 400);
        setLayout(new GridLayout(1, 1));
        field = new Panel();
        add(field);
        
        level = 1;
    }

    // создает кнопки.
    public void createLevel(Panel pn, int size)
    {
        pn.setVisible(false);
        pn.removeAll();
        pn.setLayout(new GridLayout(size, size));
    
        // правильная - случайная.
        int r = (int)(1+Math.random()*size*size);
                        
        for (int i = 1; i <= size; i++) 
            for (int j = 1; j <= size; j++) {
                
                // создание кнопки, в конструктор передаем правильная ли она.
                MyButton btn = new MyButton(r==(i-1)*size + j);
                btn.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        super.mouseEntered(e);                  
                        ((MyButton)e.getSource()).setColorByRight();
                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                        super.mouseExited(e);
                        
                        ((MyButton)e.getSource()).setDefaultColor();
                    }

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        super.mouseClicked(e); 
                        
                        onClick(((MyButton)e.getSource()));
                    }
                });
            
                pn.add(btn);                
            }
        
        pn.setVisible(true);        
    }
    
    public void onClick(MyButton btn)
    {
        if (btn.isRight()) {            
            level++;
            createLevel(field, level);            
        } else removeAll();                   
    }
    
    
    
    
    
    @Override
    public void init() {
        createLevel(field, level);   
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); 
    }

    @Override
    public void update(Graphics g) {
        super.update(g); 
    }
      
}

переопределенная кнопка

Код:

import java.awt.Button;
import java.awt.Color;
import java.awt.HeadlessException;


public class MyButton extends Button {
    
    private boolean isRight;

    public MyButton(boolean isRight) throws HeadlessException {
        super();
        
        this.isRight = isRight;
        
        setFocusable(false); 
        setDefaultColor();
    }
    
    public void setColorByRight()
    {
        if (isRight)
            setBackground(Color.GREEN);
        else
            setBackground(Color.RED);
    }
          
    public void setDefaultColor()
    {
        setBackground(Color.GRAY);
    }
    
    public boolean isRight()
    {
        return isRight;
    }
            
}
Dmitry333 вне форума Ответить с цитированием
Старый 20.03.2013, 04:19   #6
Neketek
Пользователь
 
Регистрация: 22.03.2012
Сообщений: 26
По умолчанию

Не люблю джавовские компоненты интерфейса , пользуюсь собственными , но в вашем случае, советую обновлять панель на которой вы это все рисуете, а не апплет, и если уж обновляете апплет, то используйте this.update() а не super update(). Функция обновления как по мне лучше выглядит в виде
Код:
	public void update(){
		this.paint(getGraphics());
	}
. Знаете я бы на вашем месте не морочил себе голову с кнопками, а написал бы классы хранящие в себе параметры рисования квадратов записал бы их в массив , а в апплете написал бы функцию
Код:
	protected GObject getElementAt(int x,int y){
		for(GObject go:mass){
			if(x>go.getX()&&y>go.getY()&&(x<go.getWidth()+go.getX())&&(y<(go.getY()+go.getHeight()))){
				return go;
			}
		}
		return null;
	}
где go обьект хранящий параметры и правильность вашей кнопки,
затем добавил бы слушатель мыши где вызывал бы получение обьекта с помощью вышеуказанной функции затем, затем перекрашивал квадратик в необходимый цвет и обновлял окно , как по мне это решит множество проблем , связанных с обновление и рисованием в форме, тем более, что форма не понадобится , если же вам принципиально необходимо использовать панель , то советую внимательно просмотреть ее методы, если память мне не изменяет, то она имеет собственный метод перерисовки, еще вы можете наследовать Canvas и там задать функции изменения фона по нажатию на них мышкой , позволяет создать отличный для вашей задачи способ решения.
Neketek вне форума Ответить с цитированием
Старый 20.03.2013, 09:37   #7
Dmitry333
Пользователь
 
Аватар для Dmitry333
 
Регистрация: 13.11.2009
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Neketek Посмотреть сообщение
Не люблю джавовские компоненты интерфейса , пользуюсь собственными , но в вашем случае, советую обновлять панель на которой вы это все рисуете, а не апплет, и если уж обновляете апплет, то используйте this.update() а не super update(). Функция обновления как по мне лучше выглядит в виде
Код:
	public void update(){
		this.paint(getGraphics());
	}
. Знаете я бы на вашем месте не морочил себе голову с кнопками, а написал бы классы хранящие в себе параметры рисования квадратов записал бы их в массив , а в апплете написал бы функцию
Код:
	protected GObject getElementAt(int x,int y){
		for(GObject go:mass){
			if(x>go.getX()&&y>go.getY()&&(x<go.getWidth()+go.getX())&&(y<(go.getY()+go.getHeight()))){
				return go;
			}
		}
		return null;
	}
где go обьект хранящий параметры и правильность вашей кнопки,
затем добавил бы слушатель мыши где вызывал бы получение обьекта с помощью вышеуказанной функции затем, затем перекрашивал квадратик в необходимый цвет и обновлял окно , как по мне это решит множество проблем , связанных с обновление и рисованием в форме, тем более, что форма не понадобится , если же вам принципиально необходимо использовать панель , то советую внимательно просмотреть ее методы, если память мне не изменяет, то она имеет собственный метод перерисовки, еще вы можете наследовать Canvas и там задать функции изменения фона по нажатию на них мышкой , позволяет создать отличный для вашей задачи способ решения.

я использую панель, чтобы сгруппировать компоненты, мне необходимо чтобы игровое поле было сверху - эта та панель которая сейчас есть, а ниже - панель состояния, там будет прогресбар и лейбл с текущим уровнем, (это кстати тоже вопрос, как разместить панели чтобы одна была сверху на 70%, а вторая ниже на все остальное пространство). Ваш вариант я тоже продумывал, но дело в том что мне нужно сделать проще и быстрее, а не писать свои объекты, алгоритмы прорисовки в другом потоке и двойную буферизацию
Dmitry333 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java Applet с содержимым веб-страницы motorway Общие вопросы по Java, Java SE, Kotlin 0 25.01.2013 00:00
Динамическое добавление компонентов (Проблема с repaint) BleStaR Общие вопросы по Java, Java SE, Kotlin 1 20.01.2011 16:52
Использование метода repaint() объекта класса JPanel Alexcomeback Общие вопросы по Java, Java SE, Kotlin 1 31.10.2010 13:12
проблема с repaint serguy Общие вопросы Delphi 2 27.05.2010 23:27
Applet Mitron Общие вопросы по Java, Java SE, Kotlin 0 13.04.2008 17:59