Jak najwygodniej tworzyć interfejs graficzny z własną grafiką

Jak najwygodniej tworzyć interfejs graficzny z własną grafiką
Qbisiek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 160
0

Ostatnio dłubię projekt - prostą grę typu Point-And-Click i w najbliższym czasie chciałbym się wziąć za stworzenie menu startowego oraz elementów interfejsu wyświetlanego podczas gry (ma to jakąś zwięzłą nazwę ?). Oczywiście w/w elementy będą korzystały z wczytywanych grafik. Zanim jednak zacznę coś psuć chciałbym się dowiedzieć jak najwygodniej i najwydajniej takie coś zrealizować?

Czy po prostu kontrolować zachowanie myszy i reagować na zdarzenia wywołane w chwili gdy kursor znajduję się w obrębie obrazka, czy może Java udostępnia jakieś sprytne rozwiązania pozwalające tylko zmodyfikować jakoś obiekty JButton ?

Kolejna sprawa to wydajność. Operacje dyskowe niewątpliwie są jednymi z najbardziej czasochłonnych i zastanawiam się czy istnieje jakiś sposób wczytywania obrazków podobny do stosowania tzw. sprite'ów przy tworzeniu stron www. Tzn wczytywany jest tylko jeden plik, który zawiera w sobie wiele obrazków i po prostu "wycina"/wyodrębnia się je wg. potrzeb. Przyszło mi do głowy, że skoro obiekty BufferedImage dają dostęp do poszczególnych pixeli to można by z tego skorzystać i wyświetlać tylko wybrany wycinek. Ale też nie wiem czy wykonywanie algorytmu, który by się tym zajął byłoby efektywne (pewnie tak skoro przy tworzeniu stron się to sprawdza) i czy może Java udostępnia jakieś gotowe rozwiązanie?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Są biblioteki do tworzenia gier.
Do 3D np JMonkeyEngine.
Do 2D np Slick2D.

Qbisiek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 160
0

Wibowit - Dzięki za informacje, ale na razie wolałbym nie korzystać za dużo z (aż tak) gotowych rozwiązań, wolę najpierw samemu się nauczyć od podstaw jak stworzyć grę i ew. później dla wygody korzystać z gotowych bibliotek/silników. Tak samo jak chyba najpierw się powinno nauczyć dodawać i odejmować a dopiero później dla wygody korzystać z kalkulatora. Wiem, że we wcześniejszym poście sam proszę o "gotowce" w temacie korzystania z obrazów, ale gotowiec gotowcowi nie równy. Co innego korzystać z gotowych silników do tworzenia gier a co innego np z metody System.out.print().

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Swing został zaprojektowany bardziej pod kątem niskiego zużycia zasobów, niż natychmiastowego uaktualniania bitmap, więc generalnie kontrolki Swingowe niezbyt się nadają na tworzenie gier.

Kolejna sprawa to wydajność. Operacje dyskowe niewątpliwie są jednymi z najbardziej czasochłonnych i zastanawiam się czy istnieje jakiś sposób wczytywania obrazków podobny do stosowania tzw. sprite'ów przy tworzeniu stron www. Tzn wczytywany jest tylko jeden plik, który zawiera w sobie wiele obrazków i po prostu "wycina"/wyodrębnia się je wg. potrzeb. Przyszło mi do głowy, że skoro obiekty BufferedImage dają dostęp do poszczególnych pixeli to można by z tego skorzystać i wyświetlać tylko wybrany wycinek. Ale też nie wiem czy wykonywanie algorytmu, który by się tym zajął byłoby efektywne (pewnie tak skoro przy tworzeniu stron się to sprawdza) i czy może Java udostępnia jakieś gotowe rozwiązanie?

Niet, nie ma w standardzie żadnego systemu zarządzania zasobami. Zarządzanie zasobami to generalnie dość skomplikowana sprawa i zwykle jest integralną częścią silnika graficznego.

Qbisiek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 160
0

Swing został zaprojektowany bardziej pod kątem niskiego zużycia zasobów, niż natychmiastowego uaktualniania bitmap, więc generalnie kontrolki Swingowe niezbyt się nadają na tworzenie gier.

Akurat w książce, którą teraz pomału studiuje "Efekty graficzne i animowane aplikacji desktop JAVA" (krótki tytuł :P) w podrozdziale Podwójne buforowanie jest napisane:

Ważną koncepcją w mechanizmie renderowania Swing jest podwójne buforowanie. Podwójne buforowanie jest zwykle wykorzstywane w grach i innych aplikacjach, w których zawartość ekranu może się szybko zmieniać. Technika ta pozwala osiągnąć płynną aktualizację zawartości ekranu

Więc ufam książce.
Chciałem zrobić szybki test wspomnianego przeze mnie pomysłu reagowania na zdarzenia myszki w obrębie obrazka i po stworzeniu kawałka banalnego kodu - nawet jeszcze bez nasłuchu zdarzeń jest problem. Obrazek się nie ładuje, ale ponad to w ogóle program nie wyświetla mi panelu w którym ów obrazek chciałem zamieścić. Tak jakbym w ogóle nie dodał panelu do ramki - wyświetla się sama szara (panel jest biały) ramka, ale eclipse nie pokazuje żadnych błędów, panel jest dodany i na oko wszystko wygląda ok. Nie mogę dojść co jest nie tak. Proszę o pomoc.

Kod Panelu:

Kopiuj
 
importy tego co potrzeba ....

public class ImagePanel extends JPanel
{
	private BufferedImage img;
	private File imgFile;
	
	public ImagePanel()
	{
		setBounds(0,0,400,400);
		setLayout(null);
		setBackground(Color.WHITE);
		setVisible(true);
	}
	
	public void loadImage (String path)
	{
		imgFile = new File(path);
		try {
			img = ImageIO.read(imgFile);
		} 
		catch (IOException e) 
		{
			System.out.println("\nBłąd odczytu obrazu");
		}
	}
	
	public void paintComponent(Graphics g)
	{
		Graphics2D g2D = (Graphics2D) g;
		
		g2D.drawImage(img, 10, 10, this);
	}
}

Kod Ramki:

Kopiuj
import javax.swing.JFrame;


public class ImageFrame extends JFrame 
{
	public ImageFrame()
	{
		super("ImageFrame");
		
		setBounds(100, 100, 600, 600);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		ImagePanel imgPanel = new ImagePanel();
		add(imgPanel);
		
		imgPanel.loadImage("../images/javaFolder.png");
	}
}
 

Kod testujący:

Kopiuj
import javax.swing.SwingUtilities;


public class ImageTest 
{
	public static void main(String[] args) 
	{
		SwingUtilities.invokeLater(new Runnable()
		{
			public void run()
			{
				new ImageFrame();
			}
		});
	}
}
 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.