Verbuggte Kolision bei labyrinthspiel

SchalliLP

Aktives Mitglied
Hallo,
Ich habe ein Labyrinth in Java programmiert.
Mein Problem ist nun, dass die Kollision Sachen macht, die ich nicht verstehe xD
Java:
package aMazeIng;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class aMazeIng extends JFrame {

	private JPanel contentPane;
	public int[][] level1 = new int[][] {
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
			{ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
			{ 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1 },
			{ 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1 },
			{ 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1 },
			{ 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1 },
			{ 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
			{ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1 },
			{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 },
			{ 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },
			{ 1, 3, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, };

	public int playerX = 1;
	public int playerY = 1;

	Toolkit tk = Toolkit.getDefaultToolkit();
	int xSize = ((int) tk.getScreenSize().getWidth());
	int ySize = ((int) tk.getScreenSize().getHeight());

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					aMazeIng frame = new aMazeIng();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public aMazeIng() {
		addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				

			}

			private void goDown() {

				if (level1[playerX][playerY + 1] == 0) {

					System.out.println("Frei!");
					playerY++;
					repaint();

				} else if (level1[playerX][playerY + 1] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX][playerY + 1] == 3) {

					System.out.println("Ziel!");
					playerY++;
					repaint();

				}

			}

			private void goUp() {
				if (level1[playerX][playerY - 1] == 0) {

					System.out.println("Frei!");
					playerY--;
					repaint();

				} else if (level1[playerX][playerY - 1] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX][playerY - 1] == 3) {

					System.out.println("Ziel!");
					playerY--;
					repaint();

				}
			}

			private void goRight() {

				if (level1[playerX + 1][playerY] == 0) {

					System.out.println("Frei!");
					playerX++;
					repaint();

				} else if (level1[playerX + 1][playerY] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX + 1][playerY] == 3) {

					System.out.println("Ziel!");
					playerX++;
					repaint();

				}

			}

			private void goLeft() {

				if (level1[playerX - 1][playerY] == 0) {

					System.out.println("Frei!");
					playerX--;
					repaint();

				} else if (level1[playerX - 1][playerY] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX - 1][playerY] == 3) {

					System.out.println("Ziel!");
					playerX--;
					repaint();

				}

			}

		});
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 340, 277);
		contentPane = new JPanel();
		contentPane.setBackground(Color.WHITE);
		contentPane.setForeground(Color.WHITE);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		setUndecorated(true);

		JButton btnLeft = new JButton("<--");
		btnLeft.setBounds(0, 20, 50, 240);
		btnLeft.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				

				if (level1[playerX - 1][playerY] == 0) {

					System.out.println("Frei!");
					playerX--;
					repaint();

				} else if (level1[playerX - 1][playerY] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX - 1][playerY] == 3) {

					System.out.println("Ziel!");
					playerX--;
					repaint();

				}

			}
		});
		contentPane.setLayout(null);
		contentPane.add(btnLeft);

		JButton btnRight = new JButton("-->");
		btnRight.setBounds(240 + 50, 20, 50, 240);
		btnRight.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (level1[playerX + 1][playerY] == 0) {

					System.out.println("Frei!");
					playerX++;
					repaint();

				} else if (level1[playerX + 1][playerY] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX + 1][playerY] == 3) {

					System.out.println("Ziel!");
					playerX++;
					repaint();

				}

			}
		});
		contentPane.add(btnRight);

		JButton btnUp = new JButton("up");
		btnUp.setBounds(0, 0, 340, 20);
		btnUp.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				if (level1[playerX][playerY - 1] == 0) {

					System.out.println("Frei!");
					playerY--;
					repaint();

				} else if (level1[playerX][playerY - 1] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX][playerY - 1] == 3) {

					System.out.println("Ziel!");
					playerY--;
					repaint();

				}

			}
		});
		contentPane.add(btnUp);

		JButton btnDown = new JButton("down");
		btnDown.setBounds(0, 257, 340, 20);
		btnDown.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (level1[playerX][playerY + 1] == 0) {

					System.out.println("Frei!");
					playerY++;
					repaint();

				} else if (level1[playerX][playerY + 1] == 1) {

					System.out.println("Mauer!");

				} else if (level1[playerX][playerY + 1] == 3) {

					System.out.println("Ziel!");
					playerY++;
					repaint();

				}

			}
		});
		contentPane.add(btnDown);

	}

	@Override
	public void paint(Graphics g) {
		super.paintComponents(g);

		// super.paint(g);
		g.setColor(Color.BLACK);
		g.fillRect(50, 20, 240, 240);

		for (int i = 0; i < level1.length; i++) {

			for (int r = 0; r < level1[0].length; r++) {

				if (level1[r][i] == 0) {
					g.setColor(Color.WHITE);
					g.fillRect(i * 20 + 50, r * 20 + 20, 20, 20);
				}
				if (level1[r][i] == 1) {
					
					g.setColor(new Color(0x315e12)); 
					g.fillRect(i*20+50, r*20+20, 20,20);
					
					g.setColor(new Color(0x65ab36)); 
					g.fillRect(i*20+53, r*20+23, 14,14);
					
				}
				if (level1[r][i] == 3) {
					g.setColor(Color.GREEN);
					g.fillRect(i * 20 + 50, r * 20 + 20, 20, 20);
				}

			}

		}

		Random rand = new Random();
		float r = rand.nextFloat();
		float d = rand.nextFloat();
		float b = rand.nextFloat();
		
		Color randomColor = new Color(r, d, b);
		
		
		g.setColor(randomColor);
		g.setColor(Color.BLUE);
		g.fillRect(playerX * 20 + 50, playerY * 20 + 20, 20, 20);
		

	}

}

Hier ist der Code den ich verwende...
Komischerweise rendert er das Spiel richtig hat jedoch die Falsche Kollision.
Hat jemand eine Idee wo ich was falsch gemacht haben kann?
Danke für eure Hilfe :D

PS: Außerdem Habe ich Probleme mit dem zeichnen welches immer flackert (also bei repeint();) . Ideen?
 
Zuletzt bearbeitet:

TheSorm

Bekanntes Mitglied
Also zu dem flackern solltest du mal double buffering googlen das sollte dir helfen und zu deiner kollision was macht die denn ? Das erste was ich sagen kann ist das du bei Kollisionen immer das vorberechnen solltest also du checkst nach eingabe der Richtung per Tastendruck erstmal ob der player sich bewegen kann und dann wenn ja lässt du ihn wenn nein nicht
 

SchalliLP

Aktives Mitglied
TheStorm danke erstmal für deine Antwort :D

Die Kollision guckt ob in der Richtung eine 0 1 oder 2 bzw 3 Steht (in dem Array level1) und wenn da eine 1 (für eine mauer) steht bewegt er sich nicht, bei anderen zahlen darf er sich bewegen
Das ist das gleiche Array wo auch die Sachen für den Grafik teil sind.
Trotz des gleichen Arrays verhalten sich beide teile unterschiedlich.
Ich habe daran gedacht, dass es vllt gespiegelt ein könnte, jedoch kann man an Orte gehen die man auch mit Spiegelung nicht erreichen könnte also habe ich keine Ahnung was ich falsch gemacht habe...
 

TheSorm

Bekanntes Mitglied
Ich würde mal sagen du solltestv dich erstmal mit game loops und mit classen beschäftigen alles in eine classe zu schreiben ist sehr unsauber und verursacht Probleme
 

SchalliLP

Aktives Mitglied
Das trägt der Lösung zwar nicht bei aber ich werde es mir merken und versuchen mir das anzueignen...
Hast du auch zu meinem Problem Lösungsvorschläge?
 

TheSorm

Bekanntes Mitglied
Sehr gut aber BITTE überdenke mal den aufbau deines Spiles, beschäftige dich dafür mit Game-Loops und Classen, sonst wirst du bald ein riesen problem haben und das fehler suchen wird dann unmöglich ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
StrikeTom Was ist falsch(Kolision) Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben