Troche głuio, ale czy mógłby ktoś naprawić mój program?

0

W klasie screen pojawia sie pusty error(?), a w klasie okienko trzy błędy

import java.awt.GridLayout;
import javax.swing.JFrame;
import grafika.Screen;
@SuppressWarnings("serial")
public class okienko extends JFrame{
public okienko() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("snake");
setResizable(false);
init();
}

public void init() {
	setLayout(new GridLayout(1, 1, 0, 0));
	Screen s = new Screen();
	add(s);
	pack();
	setLocationRelativeTo(null);
	setVisible(true);
	
}

public static void main(String[] args) {
 new okienko();
}

}

klasa screen:

package grafika;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import java.awt.Component;
import postaci.BodyPart;
@SuppressWarnings("serial")
public class Screen extends JFrame implements Runnable{
public static final int WIDTH = 800, HEIGHT = 800;

private Thread thread;
private boolean running = false;

private BodyPart b;

private ArrayList<BodyPart> snake;

private int xCoor= 10,  yCoor = 10;
private int size = 5;

private boolean right = true, left = false, down = false, up = false;

private int ticks = 0;
private Key key;

public Screen() {
	setFocusable(true);
	key = new Key();
	addKeyListener(key);
	setPreferredSize(new Dimension(WIDTH, HEIGHT));
	
	snake = new ArrayList<BodyPart>();
	start();
	
	
}
public void tick() {
	if(snake.size() == 0) {
		b = new BodyPart(xCoor, yCoor, 10);
		snake.add(b);
		}
	ticks++;
	if(ticks > 500000) {
		if(right)xCoor++;
		if(left)xCoor--;
		if(down)yCoor++;
		if(up)yCoor--;
		
		ticks = 0;
		b = new BodyPart(xCoor, yCoor, 10);
		snake.add(b);
		
		if(snake.size() > size) {
			snake.remove(0);
		}
		
	}
	
	
}


	public void paint(Graphics g) {
		g.clearRect(0, 0, WIDTH, HEIGHT);
		
		g.setColor(Color.BLACK);
		for(int i = 0; i < snake.size(); i++) {
			snake.get(i).draw(g);
		}
		}

	public void start() {
		running = true;
		thread = new Thread(this, "Game Loop");
		thread.start();
		
	}
	
	public void stop() {
		
		
	}
	
	public void run() {
		while(running) {
			tick();
			repaint();
		}
	}


private class Key implements KeyListener{

	@Override
	public void keyPressed(KeyEvent e) {
		int code = e.getKeyCode();
		if(code == KeyEvent.VK_DOWN && !up) {
			down = true;
			left = false;
			right = false;	
		}
		if(code == KeyEvent.VK_UP && !down) {
			up = true;
			left = false;
			right = false;	
		}
		if(code == KeyEvent.VK_LEFT && !right) {
			down = true;
			left = false;
			up = false;
			
		}
		if(code == KeyEvent.VK_RIGHT && !left) {
			down = true;
			up = false;
			right = false;
			
		}
		
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
           }
            @Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}












public  static void main (String [] args) {
	Screen screen = new Screen();
	
}

}

klasa BodyPart:

package postaci;

import java.awt.Color;
import java.awt.Graphics;

public class BodyPart {

private int xCoor, yCoor, width, height;

public BodyPart(int xCoor, int yCoor, int tileSize)  {
	
	this.xCoor = xCoor;
	this.yCoor = yCoor;
	
	width = tileSize;
	height = tileSize;
}

public void tick()  {
	
}

public void draw(Graphics g)  {
	g.setColor(Color.BLACK);
	g.fillRect(xCoor * width, yCoor * height, width, height );
	g.setColor(Color.GREEN);
	g.fillRect(xCoor * width + 2 , yCoor * height + 2, width, height );
	
}

}

0

Czy możesz coś więcej napisać o błędach?
U mnie błędów kompilacji nie ma.

Przy próbie uruchomienia okienka, dostałem wyjątek:

Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container
	at java.awt.Container.checkNotAWindow(Container.java:490)
	at java.awt.Container.addImpl(Container.java:1091)
	at java.awt.Container.add(Container.java:1005)
	at javax.swing.JFrame.addImpl(JFrame.java:567)
	at java.awt.Container.add(Container.java:417)
	at okienko.init(okienko.java:24)
	at okienko.<init>(okienko.java:17)
	at okienko.main(okienko.java:32)

znaczący, że nie można dodać Screen do okienko (JFrame do JFrame i tego najwidoczniej nie wolno robić).
Ogólnie powinna tylko jedna klasa dziedziczyć po JFrame i być użyta mniej więcej tak:
https://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java
O ile, to jak okno będzie wyglądać można zawrzeć w klasie dziedziczącej po JFrame to ważne jest aby wyświetlić okno uruchomić w formułce (oddzielnym wątku):

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });

A tak z teorii obiektowości, to raczej nie powinno być tak, że okienko odpowiada za pokazanie okna a Screen za rozmiar i logike gry - bo własnie troszke potworek wyszedł, że dodajesz okno do okna (a tego najwidoczniej nie wolno).

Czy coś ci się wyświetla czy kiedykolwiek się coś wyświetlało? (nie wiem, pytam, u mnie się nie wyświetla - ale to u mnie).

Czy problemy się zaczęły po tworzeniu na szybko klasy okienko?
... hehe ... sobie cofnąłem implementacje do stanu bez okienka, leci wężyk nawet skręca w dół lub góre zanim ucieknie poza ekran... całkiem fajny.

W sumie to możesz zignorować to invoke later, skoro jakoś działa... ale ogólnie to jest ważne... już nawet zapomniałem dokładnie o co szło ;p

0

To znowu ja xD

Może najlepiej wróć do wersji bez klasy okienko, a zrefaktoryzuj kod w drugą stronę.
Zmień:
private ArrayList<BodyPart> snake;
na:
private Snake snake;
A snake będzie miał ukryte (zhermetyzowanie ^^): private ArrayList<BodyPart> bodyParts;

No i może z tym (wszystko/część ?):

    private BodyPart b;

    private ArrayList<BodyPart> snake;

    private int xCoor= 10,  yCoor = 10;
    private int size = 5;

    private boolean right = true, left = false, down = false, up = false;

    private int ticks = 0;

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