Grafika w Javie.

0

Witam,
jestem początkującym programistą. Tworzę aplikację w Javie (nie używam apletów) i chcę użyć środowiska graficznego.
Wiem, że podobnych tematów jest mnóstwo, ale jednak muszę się zapytać indywidualnie o mój problem...

Chcę wstawić gifa, a w zasadzie animacje jakiegoś zwierzaka, który będzie biegał po planszy. Następnie kolejnego itd. Każdy będzie osobnym wątkiem (co do tego nie jestem pewien, wyjdzie w praniu). Będą biegać po planszy (trawie) "jeść ją" i może się rozmnażać...

Problem polega na tym, że nie wiem jak poradzić sobie z tą grafiką.... Zacząłem od LWJGL, ale uznałem, że do mojej aplikacji nie jest mi potrzebny tak rozbudowany pakiet. Dlatego wystarczy mi chyba zwykła biblioteka javowa - Graphics. Czytałem kilka przykładów o wstawianiu obrazu, ale albo było coś nie tak, albo nie moglem sobie poradzić.
Proszę więc o pomoc. Jakby ktoś mógł napisać najprostszy kod wstawiający gifa (widziałem ze później trzeba dodać metodę, aby obraz był animacją). Oraz proszę o odpowiedz na pytanie: czy da się każdego zwierzaka zrobić jako oddzielny wątek, a w zasadzie czy jest to konieczne...

0

Do wstawiania obrazków pakiet imageio.
Do rysowania pakiet awt
Gotowe komponenty GUI np. buttony pakiet swing
Patrz Zasady pisania są linki do dokumentacji.

0

Liczyłem na bardziej szczegółową odpowiedź...

Do tego mam kolejne pytanie.
Tworzę aplikację typu klient serwer. W programie klienta odbieram z serwera wysyłane dane. Nie wiem teraz jak zrobić, jeśli serwer ma wysyłać 4 liczby. Jak je wysłać? Jak je odczytać? Wcześniej przesyłałem stringi i odczytywałem je przez readLine(). W tym przypadku to się nie sprawdzi...

0

W dziale poświęconym Javie jest prosty przykład aplikacji klient - serwer. Przejrzyj kod i dostosuj do swoich wymagań.

0

Skoro umiesz wysyłać stringi to na upartego możesz konwertować liczbę do stringa, wysłać i ponownie konwertować na liczbę. Ale lepiej będzie że użyjesz DataInputStream i DataOutputStream, lub czegoś podobnego.
Więcej informacji oczywiście w dokumentacji.
Pozdrawiam

0

No spodziewałem się troszkę bardziej szczegółowych odpowiedzi... Nie chodziło mi o stworzenie aplikacji klient serwer bo taka umiem zrobić. Chciałem jedynie się dowiedzieć jak przesłać kilka liczb typu int. Nie mogę przesłać tablicy int[].

Teraz chciałem Was jeszcze pomęczyć kolejnym problemem [green]

Oto kod prostej aplikacji. Jeśli moglibyście spojrzeć i powiedzieć czemu nie poruszają, ba nawet nie rysują sie kolejne zajaczki...? Bardzo proszę o odpowiedz.
W kodzie tym jest sporo śmieci (np do serwera, który nie jest wykorzystywany obecnie)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.awt.geom.*;

public class Live4
{
	private JFrame ramka_powitanie;
	private JFrame ramka_polaczenie;
	private PanelGraficzny panel_graficzny;
	private JTextField tekst;
	private JButton przycisk_wyslij;
	private Socket gniazdo;
	private PrintWriter pisarz;
	private BufferedReader czytelnik;
	//private int polozenie_x;
	//private int polozenie_y;
	private int x=0;
	private int y=0;
	private int dlugosc;
	private int kierunek;
	private int polozenieX;
	private int polozenieY;
	public int x1;
	public int y1;
	public int dl1;
	public int kier1;
	
	public static void main(String[] args)
	{
		new Live4().doDziela();
	}
	public void doDziela()
	{
		ramka_powitanie = new JFrame("Gra LIVE");
		ramka_powitanie.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel_etykiety = new JPanel();
		panel_etykiety.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		panel_etykiety.setLayout(new BoxLayout(panel_etykiety, BoxLayout.Y_AXIS));
		JPanel panel_przyciski = new JPanel();
		panel_przyciski.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		panel_przyciski.setLayout(new BoxLayout(panel_przyciski, BoxLayout.Y_AXIS));

		Box pole_etykiet = new Box(BoxLayout.Y_AXIS);
		Box pole_przyciskow = new Box(BoxLayout.X_AXIS);

		Font czcionka = new Font("sanserif", Font.BOLD, 12);

		JLabel etykieta1 = new JLabel("Witamy w grze LIVE");
		etykieta1.setFont(czcionka);
		pole_etykiet.add(etykieta1);
		JLabel etykieta2 = new JLabel("Czy chcesz połączyć się z serwerem?");
		etykieta2.setFont(czcionka);
		pole_etykiet.add(etykieta2);		

		JButton przycisk_ok = new JButton("OK");
		przycisk_ok.addActionListener(new okListener());
		przycisk_ok.setToolTipText("OK :P");
		pole_przyciskow.add(przycisk_ok);
		JButton przycisk_cancel = new JButton("Cancel");
		przycisk_cancel.addActionListener(new cancelListener());
		pole_przyciskow.add(przycisk_cancel);

		panel_etykiety.add(pole_etykiet);
		panel_przyciski.add(pole_przyciskow);
		ramka_powitanie.add(BorderLayout.CENTER, panel_etykiety);
		ramka_powitanie.add(BorderLayout.SOUTH, panel_przyciski);
		ramka_powitanie.setBounds(150, 150, 350, 150);
		ramka_powitanie.setVisible(true);
	}

	public class okListener implements ActionListener
	{
		public void actionPerformed(ActionEvent zdarzenie)
		{
			glownyProgram();
		}
	}
	public class cancelListener implements ActionListener
	{
		public void actionPerformed(ActionEvent zdarzenie)
		{
			System.exit(0);
		}
	}
	public void glownyProgram()
	{		
		ramka_powitanie.setVisible(false);

		ramka_polaczenie = new JFrame("Gra LIVE");
		ramka_polaczenie.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel_glowny = new JPanel();
		panel_glowny.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		Font czcionka = new Font("sanserif", Font.BOLD, 13);
		tekst = new JTextField(30);
		tekst.setFont(czcionka);
		przycisk_wyslij = new JButton("Wyslij");
		przycisk_wyslij.addActionListener(new wyslijListener());

		panel_glowny.add(tekst);
		panel_glowny.add(przycisk_wyslij);
		panel_graficzny = new PanelGraficzny();				
		new Thread(panel_graficzny).start();

		polacz();

		Thread watekPrzes = new Thread(new zmianaPolozenia());
		watekPrzes.start();

		//Thread watekOdbiorcy = new Thread(new odbiorcaKomunikatow());
		//watekOdbiorcy.start();		
		
		ramka_polaczenie.getContentPane().add(BorderLayout.CENTER, panel_graficzny);
		ramka_polaczenie.getContentPane().add(BorderLayout.SOUTH, panel_glowny);
		ramka_polaczenie.setBounds(10, 10, 1000, 700);
		ramka_polaczenie.setVisible(true);
	}	
	public class wyslijListener implements ActionListener
	{
		public void actionPerformed(ActionEvent zdarzenie)
		{
			//Thread watekNadawcy = new Thread(new nadawcaKomunikatow());
			//watekNadawcy.start();			
		}
	}
	class PanelGraficzny extends JPanel implements Runnable
	{
		Zajac[] zajaczki = new Zajac[10];

		public PanelGraficzny()
		{
			initZajaczki();
		}

		public void paintComponent(Graphics g)
		{
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D)g;
			g2.setPaint(Color.green);
			Rectangle2D bg = new Rectangle2D.Double(0, 0, this.getWidth(), this.getHeight());
			g2.fill(bg);
			g2.draw(bg);
			for (int i = 0; i < zajaczki.length; i++)
			{
				//zajaczki[i].zmiana();
				g2.setPaint(zajaczki[i].getColor());
				Ellipse2D zaj = new Ellipse2D.Double(zajaczki[i].getX(), zajaczki[i].getY(), 20, 20);
				g2.fill(zaj);
				g2.draw(zaj);
			}
		}
		public void run()
		{
			try
			{
				while (true)
				{
					Thread.sleep(50);
					repaint();
				}
			}
			catch (Exception e) 
			{
				System.out.println("blad w painComponent_run");
			}
		}

		public void initZajaczki()
		{
			zajaczki[0] = new Zajac(Color.magenta, get_polozenieX(), get_polozenieY());
			zajaczki[1] = new Zajac(Color.blue, 80, 400);
			zajaczki[2] = new Zajac(Color.black, 20, 550);
			zajaczki[3] = new Zajac(Color.yellow, 20, 150);
			zajaczki[4] = new Zajac(Color.pink, 20, 20);
			zajaczki[5] = new Zajac(Color.blue, 20, 250);
			zajaczki[6] = new Zajac(Color.gray, 20, 300);
			zajaczki[7] = new Zajac(Color.white, 20, 500);
			zajaczki[8] = new Zajac(Color.red, 20, 200);
			zajaczki[9] = new Zajac(Color.orange, 970, 490);
		}
		class Zajac
		{
			private Color color;
			
			public Zajac(Color kolor, int wsp_x, int wsp_y)
			{
				this.color = kolor;
				x1 = wsp_x;
				y1 = wsp_y;		
			}				
			public int getX()
			{
				return x1;
			}
			public int getY()
			{
				return y1;
			}
			public Color getColor()
			{
				return color;
			}						
		}
	}
	private int get_polozenieX()
	{
		return polozenieX = (int)(30 + Math.random() * 920);
	}
	private int get_polozenieY()
	{
		return polozenieY = (int)(30 + Math.random() * 550);
	}
	private int get_dlugosc()
	{
		return dlugosc = (int)(Math.random() * 100);
	}
	private int get_kierunek()
	{
		return kierunek = (int)(Math.random() * 8);
	}
	public int getDl()
	{
		return dl1 = (int)(Math.random() * 100);
	}
	public int getKier()
	{
		return kier1 = (int)(Math.random() * 8);
	}
	public void wyborKierunku()
	{
		if (kier1 == 0)
		{
			x1++;
			y1++;
		}
		if (kier1 == 1)
		{
			x1--;
			y1--;
		}
		if (kier1 == 2)
		{
			x1--;
			y1++;
		}
		if (kier1 == 3)
		{
			x1++;
			y1--;
		}
		if (kier1 == 4)
		{
			x1++;
		}
		if (kier1 == 5)
		{
			x1--;
		}
		if (kier1 == 6)
		{
			y1++;
		}
		if (kier1 == 7)
		{
			y1--;
		}
	}
	private void polacz()
	{
		try
		{
			gniazdo = new Socket("127.0.0.1", 5000);
			
			InputStreamReader czytelnikStrumien = new InputStreamReader(gniazdo.getInputStream());
			czytelnik = new BufferedReader(czytelnikStrumien);
			pisarz = new PrintWriter(gniazdo.getOutputStream());
			
			System.out.println("polaczenie dziala");
		}
		catch (IOException ex)
		{
			//ex.printStackTrace();
			System.out.println("polaczenie nieudane!");
		}
	}
	public class odbiorcaKomunikatow implements Runnable
	{
		public void run()
		{
			String wiadomosc;
			try
			{
				while ((wiadomosc = czytelnik.readLine()) != null)
				{
					System.out.println("Odczytano: " + wiadomosc);
				}
			}
			catch (Exception ex) 
			{ 
				//ex.printStackTrace();
				System.out.println("blad w odbiorcy komunikatow!");
			}
		}
	}
	public class nadawcaKomunikatow implements Runnable
	{
		public void run()
		{			
			try
			{
				pisarz.println(tekst.getText());
				System.out.println("Wyslany tekst: " + tekst.getText());
				pisarz.flush();
			}
			catch (Exception ex)
			{
				System.out.println("blad w nadawcy...");
				//ex.printStackTrace();
			}
			tekst.setText("");
			tekst.requestFocus();	
		}
	}
	public class zmianaPolozenia implements Runnable
	{
		public void run()
		{
			try
			{
				while (true)
				{
					getKier();
					getDl();
					System.out.println("kier1  - " + kier1);
					System.out.println("dl1  - " + dl1);
					for (int j = 0; j < dl1; j++)
					{
						wyborKierunku();						
						if (x1 < 10)
						{
							for (int i = 0; i < dl1 * 2; i++)
							{
								x1++;
								przerysowanie();
							}
							break;
						}
						if (x1 > 970)
						{
							for (int i = 0; i < dl1 * 2; i++)
							{
								x1--;
								przerysowanie();
							}
							break;
						}
						if (y1 < 10)
						{
							for (int i = 0; i < dl1 * 2; i++)
							{
								y1++;
								przerysowanie();
							}
							break;
						}
						if (y1 > 590)
						{
							for (int i = 0; i < dl1 * 2; i++)
							{
								y1--;
								przerysowanie();
							}
							break;
						}
						else
						{
							przerysowanie();
						}
					}
				}
			}
			catch (Exception ex)
			{
				System.out.println("blad w zmianie polozenia");
				//ex.printStackTrace();
			}			
		}
	}	
	public void przerysowanie()
	{		
			try
			{
				panel_graficzny.repaint();
				Thread.sleep(40);
			}
			catch (Exception ex)
			{
				System.out.println("blad w rysowaniu");
				//ex.printStackTrace();
			}		
	}		
}
0

Obiekty które chcesz przesłać muszą implementować interfejs Serializable. Poza tym poszukaj informacji o RMI i SOAP.

0

Hmm no nie wiem czy serializacja mi pomoże w tym co chce zrobić...

Ale czy mógłbyś najpierw skompilować mój programik i powiedzieć czemu widoczne jest tylko jedno kółko i jak zrobić żeby wszystkie się poruszały niezależnie...

0

Serializacja służy do wysyłanie obiektów i generalnie pozwala na np. zapisywanie obiektów na dysk.

Co do tego, że masz jedno kółko to nie pomogę :(
Każde ma się poruszać niezależnie? hm... może by tak zrobić dla każdego osobny wątek?

0

Ale serializacja pozwala przechowywać obiekty, a ja chciałbym tylko dwie składowe... hmm

A odnośnie mojego kodu, to tak chciałbym aby każdy zwierzak był osobnym wątkiem ale troszkę nie wiem jak to zrobić (żeby to się kupy trzymało).
Jakby ktoś mógł pomóc, to bym był bardzo wdzięczny!

1 użytkowników online, w tym zalogowanych: 0, gości: 1