Prosta gra platformowa

0

Witam,
Aby poćwiczyć postanowiłem napisać grę podobną do Icy Tower. Jako że jestem początkujący, już na samym początku trafiłem na duży problem. Utworzyłem osobną klasę dla Platformy oraz klasę Panel, w której platformy miały być tworzone. Wszystko ładnie wygląda, ładnie się kompiluje ale w okienku widzę jedynie czarne tło.
Kody:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;


public class Panel extends JPanel implements Runnable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 2L;
	
	public Platforma platf;
	public Rectangle platfo; // utworzony dla spawdzenia czy w ogóle coś się rysuje
	private ArrayList<Rectangle> platforma= new ArrayList<Rectangle>();
	private Random m;
	public int fps=1000;
	public Thread game;
	private boolean obj=false;
	public boolean running=true;
	
 public Panel(){
	 setBackground(Color.BLACK);
	 defineObj();
	  game= new Thread(this);
	 game.start();
 }
 
 public void defineObj(){
	 m=new Random();
	 platf= new Platforma(m.nextInt(Okno.SZEROKOSC-100),Okno.WYSOKOSC-100,0);
	// platfo=new Rectangle(m.nextInt(Okno.SZEROKOSC-100),Okno.WYSOKOSC-200,0,100);
	 platforma.add(platfo);
	 obj=true;
 }
	
 		
 public void paintComponent(Graphics g){
	 super.paintComponent(g);
	 g.setColor(Color.WHITE);
	 if(obj){
		 g.fillRect(platf.platf.x, platf.platf.y, platf.platf.height, platf.platf.width);
/* Próbowałem na różne sposoby np. platf.paintComponent(g); nic z tego :( */
			g.fillRect(platfo.x,platfo.y,platfo.height, platfo.width);
		}}

	public void run() {
	
	while(running)
		fpsSetter();
	}
	
	public void fpsSetter(){
		try{
			game.sleep(fps/1000);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
 }
import java.awt.*;

import javax.swing.JPanel;


public class Platforma extends JPanel  {
	public Rectangle platf;
	private int poz_x, poz_y, dlug;
	private boolean obj=false;
	public Platforma(int poz_x, int poz_y, int dlug ){
		this.poz_x=poz_x;
		this.poz_y=poz_y;
		this.dlug=dlug;
		platf=new Rectangle(poz_x,poz_y,dlug,100);
		obj=true;
	}
	

public void paintComponent(Graphics g){
	super.paintComponent(g);
	if(obj){
		g.setColor(Color.RED);
		g.fillRect(platf.x,platf.y,platf.height, platf.width);
	}
}
public void movePlatform(int mov){
	this.poz_y=+mov;
	platf.setLocation(poz_x, poz_y);
}
}

I jeszcze pozostałe dwie, które chyba nie sprawiają problemów:

public class Main {
	public static void main(String[] args) {
    
          new Okno();
         
    }
}
import java.awt.GridLayout;
import javax.swing.JFrame;

public class Okno extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static final int SZEROKOSC=800;
	public static final int WYSOKOSC=600;
	
	
	public Okno(){
		super("Gierka");
		setSize(SZEROKOSC,WYSOKOSC);
		setLocationRelativeTo(null);
		setResizable(false);
		setLayout(new GridLayout(1,1,0,0));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Panel p= new Panel();
		add(p);
		setVisible(true);
	}

}

Będę wdzięczny za jakąkolwiek pomoc.

1

Pierwsza sprawa to formatowanie. Ciężko czyta się taki kod. Wystarczy trzymać 1 klamrę w osobnych linijkach i Ctrl+A i Ctrl+I i kod wygląda znośnie.

Problem

	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.setColor(Color.WHITE);
		if(obj){
			g.fillRect(platf.platf.x, platf.platf.y, platf.platf.height, platf.platf.width);
			/* Próbowałem na różne sposoby np. platf.paintComponent(g); nic z tego :( */
			g.fillRect(platfo.x,platfo.y,platfo.height, platfo.width);
		}}

Zauważ że linijka g.fillRect(platfo.x,platfo.y,platfo.height, platfo.width); rzuca wyjątek ponieważ platfo jest nullem. Wtedy całe rysowanie na nic.

Druga sprawa że pierwsze fillRect rysuje faktycznie kwadrat ale który ma height i width równe 0. Ustaw na sztywno i np. 100,100 i zobacz że się rysuje.

@Edit
A najlepiej porzuć Swinga. Do gier to się nie nadaje. Zobacz np. libGdx . Świetnie rysuje, jest prosty i przechwytywanie zdarzeń klawiszy jest fajne (w Swingu fatalne).

0

Dziękuje bardzo. Z rad skorzystam, a co do formatowania to na swoje usprawiedliwienie mam późną godzinę pisania tego postu :)

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