Framework animacji z Killer Game Programming in Java

0

Piszę prostą grę z pomocą książki Killer Game Programming in Java.
I gotowe na razie mam takie coś:

import java.awt.*;
import javax.swing.*;
public class animacja {
public static void main(String args[])
	{
	okno OKNO=new okno();
	}
}
class okno extends JFrame
	{
	private static final int PWIDTH = 500; //statyczne stałe wymiary
	private static final int PHEIGHT = 400;
		public okno()
		{
			GamePanel panel=new GamePanel();
			getContentPane().add(panel);
			setTitle("Snake");
			setSize( PWIDTH, PHEIGHT);
			setDefaultCloseOperation(3);
			setVisible(true);	
		}
	}

class GamePanel extends JPanel implements Runnable
{

	private static final int PWIDTH = 500; //statyczne stałe wymiary
	private static final int PHEIGHT = 400;
	
	private Thread animator;	//wątek
	private boolean running = false;
	private boolean gameOver = false;
	
	private Graphics dbg;
	private Image dbImage = null;
	
	public GamePanel()			//konstruktor
	{
	setBackground(Color.white); //białe tło
	setPreferredSize( new Dimension(PWIDTH, PHEIGHT));
	}
	public void notyfikacja()
	{
		super.addNotify();
		startGame(); //start wątku
	}
	
	private void startGame()
	 // inicjalizacja i start wątku
	 {
	   if (animator == null || !running) {
	      animator = new Thread(this);
	      animator.start();
	   }
	 }
	public void stopGame()
	{
		running = false;
	}
	public void run()
	{
		running = true;
		while(running)
		{
			gameUpdate();
			gameRender();
			repaint();
			try{
				Thread.sleep(20);
			}
			catch(InterruptedException ex){}
			System.exit(0);
		}
	}
	private void gameUpdate()
	{
		if(!gameOver)
		{
			//tu aktualizacja stanu gry
		}
	}
	private void gameRender() //rysowanie stanu gry do bufora
	{
		if(dbImage == null){//tworzenie bufora
			dbImage= createImage(PWIDTH,PHEIGHT);
			if(dbImage == null){
				System.out.println("bufor jest pusty!");
				return;
			}
			else
				dbg=dbImage.getGraphics();
		}
		dbg.setColor(Color.white);
		dbg.fillRect(0,0,PWIDTH,PHEIGHT);
		//rysowanie gry
				
	}
	private void gameOverMessage(Graphics g){
		g.drawString("Game Over", PWIDTH/2, PHEIGHT/2);
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponents(g);
		if(dbImage != null){
			g.drawImage(dbImage,0,0,null);
		}
	}
}

I mam problem w metodzie gamerender.

		if(dbImage == null){//tworzenie bufora
			dbImage= createImage(PWIDTH,PHEIGHT);
			if(dbImage == null){
				System.out.println("bufor jest pusty!");
				return;
			}

Nie tworzy tego obiektu. Wyświetla błąd "bufor jest pusty!".
Podejrzewam że przyczyną jest to że książka jest dość i stara i być może coś się w Java zmieniło w kwestii deklarowania i inicjalizacji Image.

0
Infidel napisał(a)

I mam problem w metodzie gamerender.

if(dbImage == null){//tworzenie bufora
dbImage= createImage(PWIDTH,PHEIGHT);
if(dbImage == null){
System.out.println("bufor jest pusty!");
return;
}

> Nie tworzy tego obiektu. Wyświetla błąd "bufor jest pusty!".
> Podejrzewam że przyczyną jest to że książka jest dość i stara i być może coś się w Java zmieniło w kwestii deklarowania i inicjalizacji Image.

Zerknięcie do dokumentacji <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#createImage%28int,%20int%29">http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#createImage%28int,%20int%29</a> nie boli:

> The return value may be null if the component is not displayable.
0

Dzięki :)
Ale to tworzy nowe pytanie.
Jak sprawić aby taki Image był możliwy do wyświetlenia( jeśli dobrze zrozumiałem co w dokumentacji pisze).

0

Uruchom dopiero po ustawieniu setVisible Frame na true, ale bez tego też da się żyć, lepiej usuń z metody run() System.exit(0);bo program długo sobie nie pochodzi.

0

Aj
System exit powinien być w catch.
Dzięki za pomoc.

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