Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбрать цвет игрока с помощью JColorChooser 
:(
    Опции темы
Qawra
Дата 24.12.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



Мне нужно что бы два игрока определились каким цветом они играют . В tutorial  нашла код для JColorChooser
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
                
public class JColorChooserTest extends JFrame
                               implements ActionListener {
  public static void main(String[] args) {
    new JColorChooserTest();
  }

  public JColorChooserTest() {
    super("");
   
    Container content = getContentPane();
    content.setBackground(Color.white);
    content.setLayout(new FlowLayout());
    JButton colorButton
      = new JButton("Choose Your Color");
    colorButton.addActionListener(this);
    content.add(colorButton);
    setSize(300, 100);
    setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
    // Args are parent component, title, initial color
    Color bgColor
      = JColorChooser.showDialog(this,"Choose Background Color",
                                                  getBackground());
    if (bgColor != null)
      getContentPane().setBackground(bgColor);
  }
}


Это работает .Но оно же выбирает Background причём я не вижу никаких чисел отображающих выбранный цвет .Если бы я их видела можно было бы  присвоить их цвету игрока и всё . Приходит в голову что  надо что-то подобное написать  
Код

playercolor.getSelectionModel().addChangeListener(this);
public void stateChanged(ChangeEvent e) {
    Color newColor = playercolor.getColor();
    banner.setForeground(newColor);
}


И в классе игрок создать конструктор для игрока который будет вызывать метод из JColorChooser..
Код

public Player ( int color) // constructor
    { getColor();
    } 

хотя по опыту я знаю что скорее всего ошибаюсь ...
PM MAIL   Вверх
math64
Дата 24.12.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Цвет хранится в классе Color, не в int.
Код

class GameFrame extends JFrame implements ActionListener {
  private Player player;
  ...
  public void actionPerformed(ActionEvent e) {
    // Args are parent component, title, initial color
    Color color
      = JColorChooser.showDialog(this,"Choose Background Color",
                                                  player.getColor());
    if (color != null) {
      player.setColor(color);
      repaint();
    }
  }
}
class Player {
private Color color;
Color getColor() { return color; }
void setColor(Color color) { this.color = color; }
...
}

PM   Вверх
Qawra
Дата 24.12.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



спасибо.. пытаюсь осознать как здесь GUI отделить от кода программы ( нам в школе сказали их надо обязательно отделить ) .Видимо JColorChooser это GUI в данном случае а всё остальное  уже код игры.. Мне не нужен отдельный класс что бы прописать там JColorChooser ?  Я сейчас попробую без него ..
PM MAIL   Вверх
SoulKeeper
Дата 24.12.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 2
Всего: 15



Color не имеет отношения к GUI.

Это класс содержащий информацию о цвете.
PM MAIL   Вверх
Qawra
Дата 24.12.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



А может ColorChooser выдавать название цвета в виде String ?
Мне тут пришло в голову  что в конструкторе для игрока можно присвоить игроку имя по названию выбранного цвета .. Красный , лиловый , фиолетовый ... разные  получатся игроки !


Это сообщение отредактировал(а) Qawra - 24.12.2008, 14:04
PM MAIL   Вверх
Qawra
Дата 24.12.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



У меня получается что это ColorChooser использует класс Player а не  наоборот как я предполагаю должно быть 
когда мы нажимаем кнопку в стартовом окошке 
Код

 public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(startButton)) 
    {new Grids("BattleGraund", 800, 800, 30, 30).setVisible(true);
        
    } else if (e.getSource().equals(firstPlayerButton)) 
    { Player first = new Player(1);
        
            
    } else if (e.getSource().equals(secondPlayerButton)) 
    { Player second= new Player(2);
    }

у меня создаются игроки и стрелочка рисуется к классу Player где прописан конструктор 
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Player 
 {
  private Color color;
  
  private int orderOfPlayers ;
  
  public Player(int orderOfPlayers) // constructor 
  { this.getColor();
    }
          
  public void setColor(Color color) 
  { this.color = color; 
    }
  public Color getColor() 
  { return color; 
    }
 }

Методы set и getColor возможно лишнии . Потому что private Color это же обьект в данном случае . Наверно ему не нужны set и get методы...
Вторую стрелочку BlueJ рисует от класса ColorChooser к классу Player .
Я поняла что this.getColor(); 
не даёт   выбор  цвета потому что  метод getColor() уже переписан внутри класса .
Мне надо теперь  создать обьект Color внутри конструктора Player ?


 
PM MAIL   Вверх
math64
Дата 24.12.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Класс Color имеет отношение к gui (если ты захочешь чтобы твоя игра запускалась на телефоне - там нет класса Color, а цвета задаются в виде int). Если хочешь иметь чистое разделение вид/модель используй два класса: game.model.Player и game.gui.swing.SwingPlayer:
Код

package game.model;
public class Player {
private String name;
public String getName() { return name; }
...
}

Код

package game.gui.swing;
import game.model.*;
import java.awt.*;
public class SwingPlayer implements ActionListener {
private Player player;
private Color color;
private Grids grids;
private JButton button;
public SwingPlayer(Player player, Grids grids, JButton button) {
this.player = player;
this.grids = grids;
this.button = button;
button.addActionListener(this);
}
public Player getPlayer() { return player; }
public Color getColor() { if (color == null) color = Color.WHITE; return color; }
public void setColor(Color color) { this.color = color; grids.repaint(); }
public Grids getGrids() { return grids; }

public void actionPerformed(ActionEvent e) {
  Color color = JColorChooser.showDialog(this,"Choose Color for Player " + player.getName(),  getColor());
  if (color != null)
    setColor(color);
}

}

Методы getColor/setColor и т.д. нужны поскольку поле color private, и доступ к нему возможен только из содержащего их класса.
Кроме того, они могут производить дополнительные действия.
Методы get/set среда разработки может создать автоматически.

Это сообщение отредактировал(а) math64 - 24.12.2008, 16:54
PM   Вверх
Qawra
Дата 24.12.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



Я по моему перезанималась Java  потому что в голове у меня всё путается.
Но второй блок кода мне нравится больше.. Правда
BlueJ пишет что import game.model.*; package doesn't exist .. 
вариант import game.model.swing.*;
тоже не принимает
PM MAIL   Вверх
Rpahut
Дата 25.12.2008, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: нет
Всего: 7



Qawra, если вы делаете только для двух игроков, цвета можно прибить вручную.
У меня конструктор класса Player принимает цвет в качестве параметра:
Код

public Player(Color col) {
 color = col;
}


Создать двух игроков мона так (лучше конечно их в массив положить, а не в отдельные переменные):
Код

Player player1 = new Player(new Color(1.0f, 0.0f, 0.0f)); // красный цвет
Player player2 = new Player(new Color(0.0f, 0.0f, 1.0f)); // синий цвет

На мой взгляд оптимальный вариант. Не желательно принуждать игрока выбирать цвет, если мы можем сделать это сами.
Выбор цвета можно будет добавить потом, в виде отдельного меню или еще как-то.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
math64
Дата 25.12.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Класс game.model.Player должен находиться в файле Player.java в подкаталоге game/model каталога, где хранятся исходники (ну  и аналогично другие файлы).
Если у тебя уже есть класс Player в пакете по умолчанию, в среде разработки выбери рефакторинг/переместить класс в другой пакет, и автоматически класс переместится в нужный каталог и добавятся нужные package и import. (Правда я не знаю умеет ли это делать BlueJ, но NetBeans, Idea, JBuilder, Eclipse умеют)
PM   Вверх
Qawra
Дата 26.12.2008, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 6.3.2007

Репутация: нет
Всего: 4



Будите  смеяться но я сама в своих классах запуталась .
Мне надо пойти по пути упрощения ..и всё переделать !
Завтра начну с самого  начала  :
Стартовое окошко оставлю с одной кнопкой которая будет  начинать игру .На неё прикреплю картинку с цветными карандашами. Картинка у меня есть  . Я поняла что её надо поместить в  папку с проектом .Нужно ли создавать папку "иконка" что-бы BlueJ её увидел ?
Чашку с кофем на верхней панели я бы тоже с удовольствием поменяла на изображение веера из цветных карандашей . Куда его надо поместить и как прописать что бы оно там прорисовалось ? 
В отношении импорта ...
Их что-то у меня пакетов  становиться всё больше и больше .Всё ли я делаю правильно? 
Почему у меня не получается  импортировать  всё что мне нужно как import  javax.swing.*;  или  import java.awt.*; ?
Последний   мой класс отказывается рисовать  стартовое окошко в овальной рамке  потому что я механически много чего   наимпортировала и наимплементировала  ...
Его тоже надо будет упростить 
Код

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class OvalBorder implements Border,Serializable, MouseListener, ChangeListener, FocusListener 
{
  protected int ovalWidth = 6;

  protected int ovalHeight = 6;

  protected Color lightColor = Color.white;

  protected Color darkColor = Color.blue;
  
  private JButton startButton;

  public OvalBorder() {
    ovalWidth = 16;
    ovalHeight = 16;
  }

  public OvalBorder(int w, int h) {
    ovalWidth = w;
    ovalHeight = h;
  }

  public OvalBorder(int w, int h, Color topColor, Color bottomColor) {
    ovalWidth = w;
    ovalHeight = h;
    lightColor = topColor;
    darkColor = bottomColor;
  }

  public Insets getBorderInsets(Component c) {
    return new Insets(ovalHeight, ovalWidth, ovalHeight, ovalWidth);
  }

  public boolean isBorderOpaque() {
    return true;
  }

  public void paintBorder(Component c, Graphics g, int x, int y, int width,
      int height) {
    width--;
    height--;

    g.setColor(lightColor);
    g.drawLine(x, y + height - ovalHeight, x, y + ovalHeight);
    g.drawArc(x, y, 2 * ovalWidth, 2 * ovalHeight, 180, -90);
    g.drawLine(x + ovalWidth, y, x + width - ovalWidth, y);
    g.drawArc(x + width - 2 * ovalWidth, y, 2 * ovalWidth, 2 * ovalHeight,
        90, -90);

    g.setColor(darkColor);
    g.drawLine(x + width, y + ovalHeight, x + width, y + height
        - ovalHeight);
    g.drawArc(x + width - 2 * ovalWidth, y + height - 2 * ovalHeight,
        2 * ovalWidth, 2 * ovalHeight, 0, -90);
    g
        .drawLine(x + ovalWidth, y + height, x + width - ovalWidth, y
            + height);
    g.drawArc(x, y + height - 2 * ovalHeight, 2 * ovalWidth,
        2 * ovalHeight, -90, -90);
  }
   
  public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(startButton)) 
    {new Grids("BattleGraund", 800, 800, 30, 30).setVisible(true);

 public void mouseEntered(MouseEvent e) {
  }

  public void mouseExited(MouseEvent e) {
  }

  public void mousePressed(MouseEvent e) {
  }

  public void mouseReleased(MouseEvent e) {
  }

  public void stateChanged(ChangeEvent e) {
    
  }

  public void focusGained(FocusEvent e) {
    
  }

  public void focusLost(FocusEvent e) {
    
  }
}
 


        
    public static void main(String[] s) {
    JFrame f = new JFrame("Pen Rivals");
    f.setSize(100, 100);

    JPanel p = new JPanel(new GridLayout(0, 1, 5, 5));
    JLabel l = new JLabel("Pen Rivals");
    startButton = new JButton("Start");
    l.setBorder(new OvalBorder());

    p.add(l);
    p.setBorder(new OvalBorder());

    f.getContentPane().add(p);
    f.show();
  }
  
}

 





PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.