Простая Java-игра - небольшие проблемы
В прошлом году я сделал несколько простых Java-приложений [я студент инженерного факультета, и я влюбился в Java в последний семестр] - я много узнал о классах, объектах, слушателях и многом другом. Проблема в том, что мне пришлось использовать необычные библиотеки (я думаю, что они были оптимизированы, чтобы сократить некоторые длинные части кода и просто позволить нам сосредоточиться на объектно-ориентированных основах) - вот ссылка: http://useobjects.net/ (никогда не видел их нигде). Сейчас я пытаюсь создать простую игру на Java (карточная игра, скажем, что-то вроде пасьянса) БЕЗ использования этих библиотек - только с Swing и другими общеизвестными "основными" библиотеками Java - и у меня возникают различные (обычно небольшие) проблемы с в основном "повседневными" простыми заданиями.
Первая проблема - как добавить изображение из файла в Java? Скажем, у меня есть карта класса, которую можно показать или перевернуть, и мне нужно использовать 2 изображения (одно для задней и одно для передней); и я не смог найти учебник, объясняющий весь процесс с BufferedImage, View, Image,... и так далее. (для сравнения, в библиотеках, упомянутых выше, это было просто что-то вроде этого:
ImageView cardBack = new ImageView(positionX, positionY, height, width, filepath, angle etc.);
и изображение было добавлено, и задача была выполнена.
Вторая проблема связана с основным окном приложения. В нашей старой библиотеке это было что-то вроде этого в основном классе:
MainWindow mainWindow = new MainWindow(title,height,width);
GroupView mainGroup = mainWindow.getRootGroup();
Но когда я попытался что-то выяснить о создании окна, я нашел только JFrame-решение и хотел бы попросить вас привести простой пример реализации и, возможно, как вообще решить классы (если я должен создать класс "Main" где JFrame будет просто элементом, или сделать что-то вроде класса MainWindow и создать JFrame внутри этого класса, и создать экземпляр этого класса в Main, или... просто, я боюсь, что мои знания Java-кодирования и XP не полностью совместим с соглашениями, поэтому я прошу некоторые рекомендации таким образом).
Большое вам спасибо.
2 ответа
"Сейчас я пытаюсь создать простую игру на Java (карточная игра, скажем, что-то вроде пасьянса) БЕЗ использования этих библиотек - только с использованием swing и других общеизвестных" базовых "библиотек Java".
Прежде всего, предоставленный вами код не является ядром Java. Это JavaFX. Если вы хотите изучать Swing, уроки Oracle - хороший способ начать. В этой ссылке вы найдете опции для Swing или JavaFX trails
Что касается изображений, у вас есть варианты. Вы можете загрузить ImageIcon
на JLabel
или вы можете нарисовать его на JPanel
или же JComponent
, Оба варианта можно увидеть в этой теме
"Если я должен создать класс"Main", где JFrame будет просто элементом, или создать что-то вроде класса MainWindow, создать JFrame внутри этого класса и создать экземпляр этого класса в Main"
См. Расширяет JFrame против создания его внутри программы. Если вы пройдете несколько учебных пособий по приведенной выше ссылке, вы быстро ознакомитесь с хорошими практиками, просто взглянув на примеры кода.
Вы можете начать со следующего кода:
public static void show() throws Exception
{
final BufferedImage image = ImageIO.read( new File( "<path>" ) );
JFrame window = new JFrame();
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
window.setSize( 300, 300 );
window.setLayout( new BorderLayout() );
window.add( new JLabel( "My Image name" ), BorderLayout.NORTH );
window.add( new JImage( image ), BorderLayout.CENTER );
window.setVisible( true );
}
static class JImage extends JPanel implements MouseListener
{
private BufferedImage image;
public JImage( BufferedImage image )
{
this.image = image;
addMouseListener( this );
}
@Override
protected void paintComponent( Graphics g )
{
super.paintComponent( g );
g.drawImage( image, 0, 0, null ); // see javadoc for more info on the parameters
}
@Override
public void mouseClicked( MouseEvent ev )
{
System.out.println( String.format( "mouse clicked (x:%d, y:%s)", ev.getX(), ev.getY() ) );
}
@Override
public void mouseEntered( MouseEvent arg0 )
{}
@Override
public void mouseExited( MouseEvent arg0 )
{}
@Override
public void mousePressed( MouseEvent ev )
{
System.out.println( String.format( "mouse pressed (x:%d, y:%s)", ev.getX(), ev.getY() ) );
}
@Override
public void mouseReleased( MouseEvent ev )
{
System.out.println( String.format( "mouse released (x:%d, y:%s)", ev.getX(), ev.getY() ) );
}
}
это создает простое окно, содержащее изображение и метку сверху. вам, вероятно, стоит подумать о переходе на JavaFX, но я, честно говоря, мало что знаю о программировании пользовательского интерфейса Java на стороне клиента.