Guten Abend,
ich habe ein Problem ich versuche eine Art Engine zuschreiben die Grafik verarbeitet das geht bis jetzt ganz gut.
Ich kann sagen das ich panels erstellen kan usw. in einfachem Deutsch.
Mein Problem sind nun die KEyListener.
Wie soll oder besser gesagt kann ich die Implementieren.
Ich muss ja individuell entscheiden wass gemacht werden soll wenn irgendwas passiert. Und das ist schwierig.
Bei der Grafik verwende ich einfach verkettete Listen um diese anzuzeigen. Aber den KeyListener müsst ich eigentlich in die Hauptklasse schreiben, dann hab ich aber keinen zugriff Auf die JPanels und kann diese nicht als KeyListener hinzufügen.
Ich weiß nicht wie man des normalerweise löst, ob man es schafft den KeyListener in die Engine zu packen oder ob man es schafft das man den Keylistener nicht irgendwo hinzufügen muss. Ich weiß nicht was die Lösung ist.
Und hoffe das Ihr was in diesem Thema wisst.
Hier ist noch der Code:
[Java]
import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;
public class Win4 implements KeyListener
{
Leinwand canvas;
int Feld[][] = new int[7][6];//Rot = 1 //Gelb =2 //Unbelegt = 0
String Spieler;
boolean fertig;
int zeigerReihe;
Win4()
{
canvas = new Leinwand("4 Gewinnt", 505, 375);
canvas.neueFlaeche(300, 350, "Mitte");
canvas.neueFlaeche(150, 350, "Rechts");
canvas.neueFlaeche(450, 50, "Oben");
zeigerReihe = 4;
Spieler = "Gelb";
canvas.ladeBild("Hintergrund", "images/background.png");
canvas.ladeBild("Gelb", "images/YCoin.png");
canvas.ladeBild("Rot", "images/RCoin.png");
canvas.ladeBild("Balken", "images/balken.png");
canvas.ladeBild("Seite", "images/seite.png");
canvas.ladeBild("RotZ", "images/RZ.png");
canvas.ladeBild("GelbZ", "images/GZ.png");
canvas.bildDazu("Mitte", "Hintergrund", 0, 0);
canvas.bildDazu("Oben", "Balken", 0, 0);
canvas.bildDazu("Rechts", "Seite", 0, 0);
for(int i=0; i<6; i++)
{
for (int q = 0; q<7; q++)
{
canvas.bildDazu("Mitte", "Gelb", q*50, i*50);
}
}
canvas.bildWeg("Mitte", "Gelb");
zeigerSetzen();
}
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
System.out.println("KeyPressed");
if(code == KeyEvent.VK_RIGHT&&zeigerReihe>7)
{
zeigerReihe++;
zeigerSetzen();
}
}
public void keyReleased(KeyEvent e)
{
System.out.println("KeyR");
}
public void keyTyped(KeyEvent e)
{
System.out.println("KeyT");
}
public void muenzeHinzufuegen(int row, String player)
{
int zeile = 0;
int reihe = row-1;
while(zeile<5&&Feld[reihe][zeile] != 0)
{
zeile++;
}
if(player == "Gelb")
{
Feld[reihe][zeile] = 2;
canvas.bildDazu("Mitte", "Gelb", reihe*50, 250-(zeile*50));
}
else if(player == "Rot")
{
Feld[reihe][zeile] = 1;
canvas.bildDazu("Mitte", "Rot", reihe*50, 250-(zeile*50));
}
else
{
System.out.println("Falscher name");
}
}
void zeigerSetzen()
{
canvas.bildWeg("Oben", "RotZ");
canvas.bildWeg("Oben", "GelbZ");
if(Spieler.equals("Gelb"))
{
canvas.bildDazu("Oben", "GelbZ", (zeigerReihe*50)-50, 0);
}
else if(Spieler.equals("Rot"))
{
canvas.bildDazu("Oben", "RotZ", (zeigerReihe*50)-50, 0);
}
else
{
System.out.println("Falsche eingabe String player zeiger Setzen");
}
}
}
[/Java]
[Java]
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.border.TitledBorder;
import java.io.*;
import javax.imageio.*;
import java.net.*;
interface Pictures
{
EinfachVerketteteListe list = new EinfachVerketteteListe();
}
public class Leinwand extends JFrame
{
ShowCanvas Center, Left, Right, Top, Bot;
{}
Leinwand(String Titel, int breite, int hoehe)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(Titel);
setSize(breite, hoehe);
setResizable(false);
setVisible(true);
}
public JPanel getPanel()
{
return Center;
}
public void neueFlaeche(int height, int width, String position)
{
if(position.equals("Mitte"))
{
Center = new ShowCanvas(height, width);
add(Center, BorderLayout.CENTER);
}
else if(position.equals("Rechts"))
{
Right = new ShowCanvas(height, width);
add(Right, BorderLayout.LINE_END);
}
else if(position.equals("Links"))
{
Left = new ShowCanvas(height, width);
add(Left, BorderLayout.LINE_START);
}
else if(position.equals("Oben"))
{
Top = new ShowCanvas(height, width);
add(Top, BorderLayout.PAGE_START);
}
else if(position.equals("Unten"))
{
Bot = new ShowCanvas(height, width);
add(Bot, BorderLayout.PAGE_END);
}
validate();
repaint();
}
public void ladeBild(String name, String pfad)
{
Pictures.list.addLast(new ImageManager(name, pfad));
}
public void bildDazu(String position, String bild, int x, int y)
{
if(position.equals("Mitte"))
{
Center.addImage(bild, x, y);
}
else if(position.equals("Rechts"))
{
Right.addImage(bild, x, y);
}
else if(position.equals("Links"))
{
Left.addImage(bild, x, y);
}
else if(position.equals("Oben"))
{
Top.addImage(bild, x, y);
}
else if(position.equals("Unten"))
{
Bot.addImage(bild, x, y);
}
}
public void bildWeg(String position, String name)
{
if(position.equals("Mitte"))
{
Center.delete(name);
}
else if(position.equals("Rechts"))
{
Right.delete(name);
}
else if(position.equals("Links"))
{
Left.delete(name);
}
else if(position.equals("Oben"))
{
Top.delete(name);
}
else if(position.equals("Unten"))
{
Bot.delete(name);
}
}
}
class ImageManager
{
String name;
Image icon;
int width, height;
int x, y;
ImageManager(String name, String path)
{
icon = new ImageIcon(this.getClass().getResource(path)).getImage();
this.name = name;
}
ImageManager(String bild, int nx, int ny)
{
icon = Pictures.list.findPic(bild);
x = nx;
y = ny;
this.name = Pictures.list.findObj(bild).getName();
}
public Image getImage()
{
return icon;
}
public String getName()
{
return name;
}
public int getY()
{
return y;
}
public int getX()
{
return x;
}
}
class ShowCanvas extends JPanel
{
EinfachVerketteteListe BilderReihenfolge;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
width = nwidth;
height = nheight;
setSize(width, height);
BilderReihenfolge = new EinfachVerketteteListe();
setPreferredSize(new Dimension(width, height));
setBackground(Color.black);
//addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
ListElement le = BilderReihenfolge.getFirstElem();
while (le != null)
{
g2D.drawImage(le.getObj().getImage(), le.getObj().getX(),le.getObj().getY(), this);
le = le.getNextElem();
//g2D.drawImage(background.getBufferedImage(),0,0, this);
}
}
class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}
public void mouseMoved(MouseEvent e) {
}
}
public void addImage(String name, int x, int y)
{
BilderReihenfolge.addLast(new ImageManager(name, x, y));
repaint();
}
public void delete(String name)
{
BilderReihenfolge.deleteString(name);
repaint();
}
}
class GameTimer
{
private final int NANOSECONDS = 1000000000;
private boolean timerStarted;
private long beginTime, time, timeDifference;
public GameTimer()
{
timerStarted = false;
beginTime = 0;
time = 0;
timeDifference = 0;
}
public void start()
{
timerStarted = true;
beginTime = System.nanoTime();
}
public void stop()
{
timerStarted = false;
beginTime = 0;
}
public int get()
{
time = System.nanoTime();
timeDifference = time - beginTime;
beginTime = time;
return (int)timeDifference;
}
}
class EinfachVerketteteListe {
ListElement startElem;
public EinfachVerketteteListe()
{
}
public void addLast(ImageManager o){
if(startElem == null)
startElem = new ListElement(o);
else
{
ListElement newElem = new ListElement(o);
ListElement lastElem = getLastElem();
lastElem.setNextElem(newElem);
}
}
public void insertAfter(ImageManager prevItem, ImageManager newItem) {
ListElement newElem, nextElem, pointerElem;
pointerElem = startElem.getNextElem();
while(pointerElem != null && !pointerElem.getObj().equals(prevItem)){
pointerElem = pointerElem.getNextElem();
}
newElem = new ListElement(newItem);
nextElem = pointerElem.getNextElem();
pointerElem.setNextElem(newElem);
newElem.setNextElem(nextElem);
}
public void delete(ImageManager o){
ListElement le = startElem;
while (le.getNextElem() != null && !le.getObj().equals(o)){
if(le.getNextElem().getObj().equals(o)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}
public ImageManager findObj(String name)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(name))
{
return le.getObj();
}
le = le.nextElem;
}
return null;
}
public void deleteString(String name)
{
while(findPic(name)!=null)
{
ListElement le = startElem;
while (le.getNextElem() != null){
if(le.getNextElem().getObj().getName().equals(name)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}
}
public boolean find(ImageManager o){
ListElement le = startElem;
while (le != null){
if(le.getObj().equals(o))
return true;
le = le.nextElem;
}
return false;
}
public Image findPic(String bild)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(bild))
{
return le.getObj().getImage();
}
le = le.nextElem;
}
return null;
}
public ListElement getFirstElem() {
return startElem;
}
public ListElement getLastElem() {
ListElement le = startElem;
while(le.getNextElem() != null){
le = le.getNextElem();
}
return le;
}
public void writeList() {
ListElement le = startElem;
while(le != null){
System.out.println(le.getObj());
le = le.getNextElem();
}
}
}
class ListElement {
ImageManager obj;
ListElement nextElem;
public ListElement(ImageManager obj) {
this.obj = obj;
nextElem = null;
}
public void setNextElem(ListElement nextElem) {
this.nextElem = nextElem;
}
public ListElement getNextElem() {
return nextElem;
}
public ImageManager getObj() {
return obj;
}
}
[/Java]
Ich hoffe Ihr findet eine Lösung und bedanke mich schonmal im voraus
ich habe ein Problem ich versuche eine Art Engine zuschreiben die Grafik verarbeitet das geht bis jetzt ganz gut.
Ich kann sagen das ich panels erstellen kan usw. in einfachem Deutsch.
Mein Problem sind nun die KEyListener.
Wie soll oder besser gesagt kann ich die Implementieren.
Ich muss ja individuell entscheiden wass gemacht werden soll wenn irgendwas passiert. Und das ist schwierig.
Bei der Grafik verwende ich einfach verkettete Listen um diese anzuzeigen. Aber den KeyListener müsst ich eigentlich in die Hauptklasse schreiben, dann hab ich aber keinen zugriff Auf die JPanels und kann diese nicht als KeyListener hinzufügen.
Ich weiß nicht wie man des normalerweise löst, ob man es schafft den KeyListener in die Engine zu packen oder ob man es schafft das man den Keylistener nicht irgendwo hinzufügen muss. Ich weiß nicht was die Lösung ist.
Und hoffe das Ihr was in diesem Thema wisst.
Hier ist noch der Code:
[Java]
import java.awt.*;
import java.awt.event.*;
import javax.swing.JPanel;
public class Win4 implements KeyListener
{
Leinwand canvas;
int Feld[][] = new int[7][6];//Rot = 1 //Gelb =2 //Unbelegt = 0
String Spieler;
boolean fertig;
int zeigerReihe;
Win4()
{
canvas = new Leinwand("4 Gewinnt", 505, 375);
canvas.neueFlaeche(300, 350, "Mitte");
canvas.neueFlaeche(150, 350, "Rechts");
canvas.neueFlaeche(450, 50, "Oben");
zeigerReihe = 4;
Spieler = "Gelb";
canvas.ladeBild("Hintergrund", "images/background.png");
canvas.ladeBild("Gelb", "images/YCoin.png");
canvas.ladeBild("Rot", "images/RCoin.png");
canvas.ladeBild("Balken", "images/balken.png");
canvas.ladeBild("Seite", "images/seite.png");
canvas.ladeBild("RotZ", "images/RZ.png");
canvas.ladeBild("GelbZ", "images/GZ.png");
canvas.bildDazu("Mitte", "Hintergrund", 0, 0);
canvas.bildDazu("Oben", "Balken", 0, 0);
canvas.bildDazu("Rechts", "Seite", 0, 0);
for(int i=0; i<6; i++)
{
for (int q = 0; q<7; q++)
{
canvas.bildDazu("Mitte", "Gelb", q*50, i*50);
}
}
canvas.bildWeg("Mitte", "Gelb");
zeigerSetzen();
}
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
System.out.println("KeyPressed");
if(code == KeyEvent.VK_RIGHT&&zeigerReihe>7)
{
zeigerReihe++;
zeigerSetzen();
}
}
public void keyReleased(KeyEvent e)
{
System.out.println("KeyR");
}
public void keyTyped(KeyEvent e)
{
System.out.println("KeyT");
}
public void muenzeHinzufuegen(int row, String player)
{
int zeile = 0;
int reihe = row-1;
while(zeile<5&&Feld[reihe][zeile] != 0)
{
zeile++;
}
if(player == "Gelb")
{
Feld[reihe][zeile] = 2;
canvas.bildDazu("Mitte", "Gelb", reihe*50, 250-(zeile*50));
}
else if(player == "Rot")
{
Feld[reihe][zeile] = 1;
canvas.bildDazu("Mitte", "Rot", reihe*50, 250-(zeile*50));
}
else
{
System.out.println("Falscher name");
}
}
void zeigerSetzen()
{
canvas.bildWeg("Oben", "RotZ");
canvas.bildWeg("Oben", "GelbZ");
if(Spieler.equals("Gelb"))
{
canvas.bildDazu("Oben", "GelbZ", (zeigerReihe*50)-50, 0);
}
else if(Spieler.equals("Rot"))
{
canvas.bildDazu("Oben", "RotZ", (zeigerReihe*50)-50, 0);
}
else
{
System.out.println("Falsche eingabe String player zeiger Setzen");
}
}
}
[/Java]
[Java]
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.border.TitledBorder;
import java.io.*;
import javax.imageio.*;
import java.net.*;
interface Pictures
{
EinfachVerketteteListe list = new EinfachVerketteteListe();
}
public class Leinwand extends JFrame
{
ShowCanvas Center, Left, Right, Top, Bot;
{}
Leinwand(String Titel, int breite, int hoehe)
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(Titel);
setSize(breite, hoehe);
setResizable(false);
setVisible(true);
}
public JPanel getPanel()
{
return Center;
}
public void neueFlaeche(int height, int width, String position)
{
if(position.equals("Mitte"))
{
Center = new ShowCanvas(height, width);
add(Center, BorderLayout.CENTER);
}
else if(position.equals("Rechts"))
{
Right = new ShowCanvas(height, width);
add(Right, BorderLayout.LINE_END);
}
else if(position.equals("Links"))
{
Left = new ShowCanvas(height, width);
add(Left, BorderLayout.LINE_START);
}
else if(position.equals("Oben"))
{
Top = new ShowCanvas(height, width);
add(Top, BorderLayout.PAGE_START);
}
else if(position.equals("Unten"))
{
Bot = new ShowCanvas(height, width);
add(Bot, BorderLayout.PAGE_END);
}
validate();
repaint();
}
public void ladeBild(String name, String pfad)
{
Pictures.list.addLast(new ImageManager(name, pfad));
}
public void bildDazu(String position, String bild, int x, int y)
{
if(position.equals("Mitte"))
{
Center.addImage(bild, x, y);
}
else if(position.equals("Rechts"))
{
Right.addImage(bild, x, y);
}
else if(position.equals("Links"))
{
Left.addImage(bild, x, y);
}
else if(position.equals("Oben"))
{
Top.addImage(bild, x, y);
}
else if(position.equals("Unten"))
{
Bot.addImage(bild, x, y);
}
}
public void bildWeg(String position, String name)
{
if(position.equals("Mitte"))
{
Center.delete(name);
}
else if(position.equals("Rechts"))
{
Right.delete(name);
}
else if(position.equals("Links"))
{
Left.delete(name);
}
else if(position.equals("Oben"))
{
Top.delete(name);
}
else if(position.equals("Unten"))
{
Bot.delete(name);
}
}
}
class ImageManager
{
String name;
Image icon;
int width, height;
int x, y;
ImageManager(String name, String path)
{
icon = new ImageIcon(this.getClass().getResource(path)).getImage();
this.name = name;
}
ImageManager(String bild, int nx, int ny)
{
icon = Pictures.list.findPic(bild);
x = nx;
y = ny;
this.name = Pictures.list.findObj(bild).getName();
}
public Image getImage()
{
return icon;
}
public String getName()
{
return name;
}
public int getY()
{
return y;
}
public int getX()
{
return x;
}
}
class ShowCanvas extends JPanel
{
EinfachVerketteteListe BilderReihenfolge;
int width, height;
ShowCanvas(int nwidth, int nheight) {
super(new BorderLayout());
width = nwidth;
height = nheight;
setSize(width, height);
BilderReihenfolge = new EinfachVerketteteListe();
setPreferredSize(new Dimension(width, height));
setBackground(Color.black);
//addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
ListElement le = BilderReihenfolge.getFirstElem();
while (le != null)
{
g2D.drawImage(le.getObj().getImage(), le.getObj().getX(),le.getObj().getY(), this);
le = le.getNextElem();
//g2D.drawImage(background.getBufferedImage(),0,0, this);
}
}
class MouseMotionHandler extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
/*x = e.getX();
y = e.getY();
repaint();*/
}
public void mouseMoved(MouseEvent e) {
}
}
public void addImage(String name, int x, int y)
{
BilderReihenfolge.addLast(new ImageManager(name, x, y));
repaint();
}
public void delete(String name)
{
BilderReihenfolge.deleteString(name);
repaint();
}
}
class GameTimer
{
private final int NANOSECONDS = 1000000000;
private boolean timerStarted;
private long beginTime, time, timeDifference;
public GameTimer()
{
timerStarted = false;
beginTime = 0;
time = 0;
timeDifference = 0;
}
public void start()
{
timerStarted = true;
beginTime = System.nanoTime();
}
public void stop()
{
timerStarted = false;
beginTime = 0;
}
public int get()
{
time = System.nanoTime();
timeDifference = time - beginTime;
beginTime = time;
return (int)timeDifference;
}
}
class EinfachVerketteteListe {
ListElement startElem;
public EinfachVerketteteListe()
{
}
public void addLast(ImageManager o){
if(startElem == null)
startElem = new ListElement(o);
else
{
ListElement newElem = new ListElement(o);
ListElement lastElem = getLastElem();
lastElem.setNextElem(newElem);
}
}
public void insertAfter(ImageManager prevItem, ImageManager newItem) {
ListElement newElem, nextElem, pointerElem;
pointerElem = startElem.getNextElem();
while(pointerElem != null && !pointerElem.getObj().equals(prevItem)){
pointerElem = pointerElem.getNextElem();
}
newElem = new ListElement(newItem);
nextElem = pointerElem.getNextElem();
pointerElem.setNextElem(newElem);
newElem.setNextElem(nextElem);
}
public void delete(ImageManager o){
ListElement le = startElem;
while (le.getNextElem() != null && !le.getObj().equals(o)){
if(le.getNextElem().getObj().equals(o)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}
public ImageManager findObj(String name)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(name))
{
return le.getObj();
}
le = le.nextElem;
}
return null;
}
public void deleteString(String name)
{
while(findPic(name)!=null)
{
ListElement le = startElem;
while (le.getNextElem() != null){
if(le.getNextElem().getObj().getName().equals(name)){
if(le.getNextElem().getNextElem()!=null)
le.setNextElem(le.getNextElem().getNextElem());
else{
le.setNextElem(null);
break;
}
}
le = le.getNextElem();
}
}
}
public boolean find(ImageManager o){
ListElement le = startElem;
while (le != null){
if(le.getObj().equals(o))
return true;
le = le.nextElem;
}
return false;
}
public Image findPic(String bild)
{
ListElement le = startElem;
while (le != null)
{
if(le.getObj().getName().equals(bild))
{
return le.getObj().getImage();
}
le = le.nextElem;
}
return null;
}
public ListElement getFirstElem() {
return startElem;
}
public ListElement getLastElem() {
ListElement le = startElem;
while(le.getNextElem() != null){
le = le.getNextElem();
}
return le;
}
public void writeList() {
ListElement le = startElem;
while(le != null){
System.out.println(le.getObj());
le = le.getNextElem();
}
}
}
class ListElement {
ImageManager obj;
ListElement nextElem;
public ListElement(ImageManager obj) {
this.obj = obj;
nextElem = null;
}
public void setNextElem(ListElement nextElem) {
this.nextElem = nextElem;
}
public ListElement getNextElem() {
return nextElem;
}
public ImageManager getObj() {
return obj;
}
}
[/Java]
Ich hoffe Ihr findet eine Lösung und bedanke mich schonmal im voraus