Problem beim Objekt bewegen

JAVAnnik

Bekanntes Mitglied
Hi alle zusammen,

ich habe ein Problem damit ein Objekt zu bewegen. Hier mal zunächs ein Codeausschnitt dazu:

Java:
for (i=y;i>=newposY ;i-- )
            {
                 figur.setLocation(x,i);

                 try {
                 Thread.sleep(10) ;
                 } catch(InterruptedException e) {

                 }
            }

Das Problem ist, dass meine 'figur' zwar verschoben wird aber das sehe ich erst nachdem die for-schleife. Das heißt nach einer gewissen zeit springt mein Objekt von der Startposition einfach an die Endposition ohne Zwischenschritte.
Ich hab zunächst gedacht, dass vielleicht meine Zeit (Thead.sleep(10)) zu kurz ist aber wen ich eine Sekunde nehme geht das auch nicht.

Ich hoffe ihr könnt mir helfen
 

Volvagia

Top Contributor
10ms sind mehr als lang genug. Ich verwende meistens nur Nanosekunden, weil ms/µs einfach zu lang sind.
Ich gehe jede Wette ein, du startest die Bewegung in einen Listener. Standartmäßig implementierte Listener werden im Dispatcher ausgeführt. Dieser kümmert sich um diverse Dinge, wie z. B. neu zeichnen. Das heißt, wärend er das erledigt, was du im aufträgst ist es unmöglich neu zu zeichnen, da ein Thread nur eine Sache gleichzeitig machen kann.
Starte entweder einen Thread, der die Schleife durchrennt und verschiebt (verschieben wiederrum im EDT), oder benutze so einen SwingWorker, mit dem ich mich aber nicht auskenne.
 

JAVAnnik

Bekanntes Mitglied
stimmt !! ich starte es in einem KeyListener

könntest du mir vielleicht kurz beschreiben wie das dann mit dem Thread zwischendrin aussieht?
 

Volvagia

Top Contributor
Java:
new Thread() {
	public void run() {
		//
		for (i=y;i>=newposY ;i-- )
		{
			SwingUtilities.invokeLater(new Runnable() {
				public void run()
				{
					figur.setLocation(x, i);
				}
			});

			try {
				Thread.sleep(10) ;
			} catch(InterruptedException e) {}
		}
	}
}.start();
 

JAVAnnik

Bekanntes Mitglied
danke für den Code!! bei mir tritt aber ein Fehler auf was haben die denn wieder zu bedeuten?


Denkspiel.java:232:43: local variable newposY is accessed from within inner class; needs to be declared final
for (i=posY*25;i>=newposY*25 ;i-- )
^

kann mir das nicht erklären denn newposY ist eigentlich eine Klassenvariable genau wie posY und bei der wird nicht gemeckert
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Du kannst in einer inneren anonym. Klasse nur auf final Variablen zugreifen. Das Einfachste wäre wohl, du nimmst statt den Variablen ein Point-Objekt, welches du final deklarierst, oder du nimmst statt den primitiven Datentypen ein Array mit der Länge 1.
 

Volvagia

Top Contributor
Weiß ich nicht, ich kenne ja nur den Source den du gepostet hast, und da kommt 'posY' nicht vor. Was ich aber noch vergessen habe, das gilt nur für Methodenvariablen. Auf Klassenvariablen kannst du immer zugreifen.
(Du solltest deshalb die Variablen aber besser nicht als Klassenvariable definieren, nur damit du dir die finalisierung oder Wrappler wie Point oder Arrays spaarst, wenn es sich nicht tatsächlich um Eigenschaften des Objektes handelt.)
 

JAVAnnik

Bekanntes Mitglied
Also ich bekomm es irgendwie nicht auf die Reihe. Jetzt läuft das Programm zwar ohne Fehlermeldung und meine ' Figur' springt von der einen Seite des Feldes zur anderen, aber es springt eben sofort nach dem Klick und schiebt sich nicht langsam wie erhofft auf die richtige Position. Bislang habe ich die nur nach oben eingebaut aber sie funktioniert eben nicht, hier mal der komplette Code bitte helft mir ;(

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.Scanner;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 30.04.2011
  * @author
  */

public class Denkspiel extends JFrame {
  // Anfang Attribute
  private JLabel feld[][] = new JLabel[18][15];
  JLabel figur = new JLabel();
  private int nummer[][] = new int [18][15];
  private int posX;
  private int posY;
  private int newposX;
  private int newposY;
  private int bew;
  private JTextArea jTextArea1 = new JTextArea("");
  // Ende Attribute

  public Denkspiel(String title) throws IOException{
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 456;
    int frameHeight = 407;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    figur = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[0].png")));
    figur.setBounds(0,0,25,25);
    cp.add(figur);
    figur.setVisible(false);

    felderstellen("lvl1.txt");
    getPos();
    

    addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent evt) {
        if (evt.getKeyCode()==KeyEvent.VK_UP)
        {
           feld[posX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[1].png")));
           nummer[posX][posY]=1;

           boolean weiter;
           newposY=posY;
           do
           {
             weiter = true;
             if (nummer[posX][newposY-1]==1 || nummer[posX][newposY-1]==2)
             {
               weiter=false;
               newposY=newposY-1;
             };
           } while (weiter==false);
           animationup();
           feld[posX][newposY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[0].png")));
           nummer[posX][newposY]=0;
           getPos();
        }
      }
    });


    addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent evt) {
        if (evt.getKeyCode()==KeyEvent.VK_DOWN)
        {
           feld[posX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[1].png")));
           nummer[posX][posY]=1;

           boolean weiter;
           newposY=posY;
           do
           {
             weiter = true;
             if (nummer[posX][newposY+1]==1 || nummer[posX][newposY+1]==2)
             {
               weiter=false;
               newposY=newposY+1;
             };
           } while (weiter==false);
           feld[posX][newposY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[0].png")));
           nummer[posX][newposY]=0;
           getPos();
        }
      }
    });


    addKeyListener (new KeyAdapter() {
      public void keyPressed(KeyEvent evt) {
        if (evt.getKeyCode()==KeyEvent.VK_LEFT)
        {
           feld[posX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[1].png")));
           nummer[posX][posY]=1;

           boolean weiter;
           newposX=posX;
           do
           {
             weiter = true;
             if (nummer[newposX-1][posY]==1 || nummer[newposX-1][posY]==2)
             {
               weiter=false;
               newposX=newposX-1;
             };
           } while (weiter==false);
           feld[newposX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[0].png")));
           nummer[newposX][posY]=0;
           getPos();
        }
      }
    });


    addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent evt) {
        if (evt.getKeyCode()==KeyEvent.VK_RIGHT)
        {
          feld[posX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[1].png")));
           nummer[posX][posY]=1;

           boolean weiter;
           newposX=posX;
           do
           {
             weiter = true;
             if (nummer[newposX+1][posY]==1 || nummer[newposX+1][posY]==2)
             {
               weiter=false;
               newposX=newposX+1;
             };
           } while (weiter==false);
           feld[newposX][posY].setIcon(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[0].png")));
           nummer[newposX][posY]=0;
           getPos();
        }
      }
    });

    setResizable(false);
    setVisible(true);

  }

  // Anfang Methoden

  public void felderstellen(String file) throws IOException
  {
      int i,j;
      Container cp = getContentPane();
      cp.setLayout(null);

      String zeile[] = new String[15];
      Scanner scanner = new Scanner(new File(file));
      i=0;
      do
      {
          zeile[i] = scanner.nextLine();
          i++;
      } while (scanner.hasNextLine() == true);

      for(i=0;i<15;i++)
      {
           String[] parts = zeile[i].split(",");
            for(j=0;j<parts.length;j++)
            {
                 nummer[j][i] = Integer.parseInt(parts[j]);
                 feld[j][i] = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().getImage ( "J:\\Denkspiel\\Bilder\\bild[" + nummer[j][i] + "].png")));
                 feld[j][i].setBounds(j*25, i*25, 25, 25);
                 cp.add(feld[j][i]);
            }
      }
  }

  public void getPos()
  {
    for(int i=0;i<15;i++)
      {
        for (int j=0;j<18 ;j++ )
        {
          if (nummer[j][i]==0)
          {
            posX=j;
            posY=i;
          }
        }
      }
  }


  public void animationup()
  {

     figur.setVisible(true);

               new Thread() {
                    public void run() {
                    
                        for (bew=posY*25;bew >= newposY*25 ;bew-- )
                        {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run()
                                {
                                    figur.setLocation(posX*25, bew);
                                }
                            });

                            try {
                                Thread.sleep(1000) ;
                            } catch(InterruptedException e) {}
                        }
                    }
                }.start();
  figur.setVisible(false);
  }


  // Ende Methoden

  public static void main(String[] args) throws IOException{
    new Denkspiel("Denkspiel");
  }
}
 

JAVAnnik

Bekanntes Mitglied
muss ich auf zwei mal machen weil es zu viele bilder sind und ich es vorhin einfach nicht mehr geschafft hab ne jar-datei zu erstellen
 

Anhänge

  • lvl1.txt
    561 Bytes · Aufrufe: 3
  • bild[0].PNG
    bild[0].PNG
    278 Bytes · Aufrufe: 63
  • bild[1].PNG
    bild[1].PNG
    124 Bytes · Aufrufe: 59
  • bild[2].PNG
    bild[2].PNG
    287 Bytes · Aufrufe: 63
  • bild[3].PNG
    bild[3].PNG
    304 Bytes · Aufrufe: 65

JAVAnnik

Bekanntes Mitglied
und die nächsten ...
 

Anhänge

  • bild[4].PNG
    bild[4].PNG
    361 Bytes · Aufrufe: 69
  • bild[5].PNG
    bild[5].PNG
    396 Bytes · Aufrufe: 62
  • bild[6].PNG
    bild[6].PNG
    366 Bytes · Aufrufe: 68
  • bild[7].PNG
    bild[7].PNG
    413 Bytes · Aufrufe: 65
  • bild[17].png
    bild[17].png
    379 Bytes · Aufrufe: 60

JAVAnnik

Bekanntes Mitglied
so und doch noch ein letztes mal :toll:
 

Anhänge

  • bild[18].png
    bild[18].png
    316 Bytes · Aufrufe: 59
  • bild[19].png
    bild[19].png
    408 Bytes · Aufrufe: 61
  • bild[20].png
    bild[20].png
    308 Bytes · Aufrufe: 71

Volvagia

Top Contributor
Schau dir das mal an:

Java:
package test;

import static java.awt.Toolkit.getDefaultToolkit;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 30.04.2011
  * @author
  */
public class Denkspiel extends JFrame
{
	private static final long serialVersionUID = 1L;

	private static final int STEP_SIZE = 5;
	private static final int TILDE_POW_SIZE = 25;
	private static final Dimension FRAME_SIZE = new Dimension(456, 407);
	private static final Dimension TILDE_SIZE = new Dimension(TILDE_POW_SIZE, TILDE_POW_SIZE);
	private static final Map<Integer, TildeInfo> TILDE_INFOS = new HashMap<Integer, TildeInfo>() {
		private static final long serialVersionUID = 1L;	
		{
			put(1, new TildeInfo("bild[1].png", true, "Boden", null));
			put(2, new TildeInfo("bild[2].png", false, "Kiste", null));
			put(3, new TildeInfo("bild[3].png", false, "Wand", null));
			put(4, new TildeInfo("bild[4].png", false, "Wand mit roten Rohr unten", null));
			put(5, new TildeInfo("bild[5].png", false, "Wand mit roten Rohr link", null));
			put(6, new TildeInfo("bild[6].png", false, "Wand mit roten Rohr oben", null));
			put(7, new TildeInfo("bild[7].png", false, "Wand mit roten Rohr rechts", null));
			put(17, new TildeInfo("bild[17].png", false, "Wand mit roten Rohr rechts unten", null));
			put(18, new TildeInfo("bild[18].png", false, "Wand mit roten Rohr rechts oben", null));
			put(19, new TildeInfo("bild[19].png", false, "Wand mit roten Rohr links oben", null));
			put(20, new TildeInfo("bild[20].png", false, "Wand mit roten Rohr links unten", null));
		}
	};
	
	private static Tilde feld[][] = new Tilde[18][15];
	private Figur figur;

	public Denkspiel(String title) throws IOException
	{
		super(title);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		setSize(FRAME_SIZE);
		setLocationRelativeTo(null);
		
		setLayout(null);
 
		figur = new Figur();
		add(figur);
 
		felderstellen("lvl1.txt");
		 
		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt) {
				if(evt.getKeyCode() == KeyEvent.VK_UP)
					figur.controllMoving(new Point(0, -1));
				else if(evt.getKeyCode() == KeyEvent.VK_RIGHT)
					figur.controllMoving(new Point(1, 0));
				else if(evt.getKeyCode() == KeyEvent.VK_DOWN)
					figur.controllMoving(new Point(0, 1));
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT)
					figur.controllMoving(new Point(-1, 0));
			}
			public void keyReleased(KeyEvent evt) {
				if(evt.getKeyCode() == KeyEvent.VK_UP)
					figur.controllMoving(new Point(0, 1));
				else if(evt.getKeyCode() == KeyEvent.VK_RIGHT)
					figur.controllMoving(new Point(-1, 0));
				else if(evt.getKeyCode() == KeyEvent.VK_DOWN)
					figur.controllMoving(new Point(0, -1));
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT)
					figur.controllMoving(new Point(1, 0));
			}
		});
		
		setResizable(false);
		setVisible(true);
	}
	public void felderstellen(String file) throws IOException
	{
		Scanner scanner = new Scanner(new File(file));
		int lineCounter = 0;

		do
		{
			String line = scanner.nextLine();
			
			String[] parts = line.split(",");
			for(int partCounter = 0; partCounter < parts.length; partCounter++)
			{
				int id = Integer.parseInt(parts[partCounter]);
				
				TildeInfo tildeInfo = TILDE_INFOS.get(id);
				if(tildeInfo == null)
					continue;
				
				Tilde nextField = tildeInfo.newTilde();
				nextField.setLocation(partCounter * TILDE_SIZE.width, lineCounter * TILDE_SIZE.height);
				nextField.setSize(TILDE_SIZE);
				add(nextField);
				
				feld[partCounter][lineCounter] = nextField;
			}
			lineCounter++;
		}
		while (scanner.hasNextLine());
	}
	public static void main(String[] args) throws IOException
	{
		new Denkspiel("Denkspiel");
	}

	private final class Figur extends JLabel implements Runnable
	{
		private static final long serialVersionUID = 1L;
		
		private static final byte STATE_WAIT = 0;
		private static final byte STATE_MOVE = 1;
		private static final byte STATE_DIE = 2;
		private static final byte STATE_DEAD = 3;
		
		private byte state;
		private Thread runThread;
		private Point moveDir;

		private Figur()
		{
			setIcon(new ImageIcon(getDefaultToolkit().getImage("bild[0].png")));
			setBounds(8 * TILDE_SIZE.width, 7 * TILDE_SIZE.height, TILDE_SIZE.width, TILDE_SIZE.height);

			moveDir = new Point(0, 0);
			state = STATE_MOVE;
			
			runThread = new Thread(this, "Figur");
			runThread.start();
		}
		public void run()
		{
			if(moveDir == null)
				return;
			
			do
			{
				switch(state)
				{
					case(STATE_WAIT):
						synchronized (this)
						{
							try
							{
								wait();
							}
							catch (InterruptedException e) {}
						}
					break;
					
					case(STATE_MOVE):
						move();
					break;
				}
			}
			while(state != STATE_DIE);
			state = STATE_DEAD;
		}
		private void move()
		{
			int steps = TILDE_POW_SIZE / STEP_SIZE;
			int moveX = moveDir.x * steps;
			int moveY = moveDir.y * steps;

			int x = getX();
			int y = getY();
			
			int tildeX = x / TILDE_SIZE.width;
			int tildeY = y / TILDE_SIZE.height;
			
			final int nextTildeX = tildeX + moveDir.x;
			final int nextTildeY = tildeY + moveDir.y;
			
			final Tilde nextTilde = feld[nextTildeX][nextTildeY];
			if(nextTilde != null && !nextTilde.isPassable())
			{
				nextTilde.push(new Point(nextTildeX * -1, nextTildeY * -1));
				try
				{
					TimeUnit.MILLISECONDS.sleep(10L);
				}
				catch (InterruptedException e) {}
				return;
			}
			
			final Point loc = new Point(getX(), getY());
			for(int i = 0; i < steps; i++)
			{
				loc.x = loc.x + moveX;
				loc.y = loc.y + moveY;

				SwingUtilities.invokeLater(new Runnable() {
					public void run()
					{
						setLocation(loc);
					}
				});
				
				try
				{
					TimeUnit.MILLISECONDS.sleep(10L);
				}
				catch (InterruptedException e) {}
			}
			
			try
			{
				SwingUtilities.invokeAndWait(new Runnable() {
					public void run()
					{
						setLocation(loc);

						if(nextTilde != null)
							nextTilde.moveOn(new Point(nextTildeX * -1, nextTildeY * -1));
					}
				});
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			catch (InvocationTargetException e)
			{
				e.printStackTrace();
			}
		}
		public void controllMoving(Point dir)
		{
			if(Math.abs(moveDir.x + dir.x) < 2)
				moveDir.x+= dir.x;
			if(Math.abs(moveDir.y + dir.y) < 2)
				moveDir.y+= dir.y;
			
			synchronized (this)
			{
				notify();	
			}
		}
	}
	private static class TildeInfo
	{
		private boolean passable;
		private Icon icon;
		private String note;
		private Class<? extends GameItem> itemClass;

		public TildeInfo(String imagePath, boolean passable, String note, Class<? extends GameItem> itemClass)
		{
			super();
			
			this.passable = passable;
			icon = new ImageIcon(getDefaultToolkit().getImage(imagePath));
			this.note = note;
			this.itemClass = itemClass;
		}
		public int hashCode()
		{
			return(icon.hashCode() + note.hashCode());
		}
		public boolean equals(Object obj)
		{
			if(!(obj instanceof TildeInfo))
				return(false);
			
			TildeInfo cast = (TildeInfo)obj;
			return(icon.equals(cast.icon) && note.equals(cast.note) && passable == cast.passable);			
		}
		public Tilde newTilde()
		{
			Tilde t = new Tilde(passable, itemClass);
			t.setIcon(icon);
			return(t);
		}
	}
	private static class Tilde extends JLabel
	{
		private static final long serialVersionUID = 1L;

		private boolean passable;
		private GameItem item;
		
		public Tilde(boolean passable, Class<? extends GameItem> itemClass)
		{
			super();
			this.passable = passable;
			if(itemClass != null)
			{
				try
				{
					item = itemClass.newInstance();
				}
				catch (InstantiationException e)
				{
					e.printStackTrace();
				}
				catch (IllegalAccessException e)
				{
					e.printStackTrace();
				}
			}
		}
		public void push(Point point)
		{
			if(item != null)
				item.push(point);
		}
		public void moveOn(Point point)
		{
			if(item != null)
				item.moveOn(point);
		}
		public boolean isPassable()
		{
			return passable;
		}
	}
	private static interface GameItem
	{
		public void push(Point dir);
		public void moveOn(Point dir);
	}
}
 

JAVAnnik

Bekanntes Mitglied
Vielen Dank für de Code ich hab ihn ausprobiert und er läauft sehr gut, ich versuch grad die einzelnen Teile zu verstehen, könntest du vielleicht kurz was zu diesen sagen welhe klasse bzw. methode für was zuständig ist und wie du definiert hast vor welchen Hindernissen die Figur stehen bleiben soll?
 

Volvagia

Top Contributor
Denkspiel bereitet das Level und das JFrame vor, Figur ist die Spielfigur und kümmert sich gleichzeitig um die Bewegung dieser, TildeInfo enthält die Infos über die Tildes und erzeugt diese, damit Änderungen global darüber durchgeführt werden können, Tildes sind die eigendlichen Tildes und GameItem ist ein Interface, mit der du Logikklassen bauen kannst, die auf Aktionen der Figur reagieren können, wie z. B. das Verschieben der Kisten. Dieser Bereich ist noch ungetestet weil ich zu müde war, aber ich verlasse mich mal drauf dass ich einmal was geschrieben habe, das auf Anhieb läuft.

In Figur#move (solltest du vielleicht in eine eigene Methode auslagern, da es kaum was mit Bewegung zu tun hat) wird die nächste Tilde in Bewegungsrichtung gehohlt, und gefragt ob sie begehbar ist. Wenn nicht ruft er push der GameItem-Klasse der Tilde auf, falls diese existiert, und bleibt einfach stehen.
 

JAVAnnik

Bekanntes Mitglied
ich wollte nun, dass wenn man sich über eine kiste bewegt, diese verschwindet. Deshalb habe ich die Kiste auf true gesetzt und nach der push-abfrage im move() folgendes geschrieben:
Java:
nextTilde.setIcon(new ImageIcon(getDefaultToolkit().getImage("bild[1].png")));

aber nun kommt eine meldung und man kann die figur gar nicht mehr bewegen.

Starte E:\Denkspiel\Bilder\Denkspiel.java

Exception in thread "Figur" java.lang.NullPointerException
at Denkspiel$Figur.move(Denkspiel.java:215)
at Denkspiel$Figur.run(Denkspiel.java:181)
at java.lang.Thread.run(Thread.java:619)
 

Volvagia

Top Contributor
Hopsa, war doch noch fehlerbehaftet. Aber ich benutze mal die Programmierer-Standartausrede: Kein Programm ist Bugfrei. :eek:
push wird nur verwendet, falls das Objekt nicht betreten werden kann (also realitätsgebundener sich quasi auf gleicher Höhe wie der Spieler aufhält). Für die andere ist moveOn da, also wenn der Spieler auf eine niedrigere Tilde draufsteigt. Du kannst sie aber auch zusammenfließen lassen, sofern kein Objekt hinterher seinen Passable-Status ändert (wie z. B. eine Tür, die in der Erde versinkt), und so 2 verschiedene Events auftreten können.

So werden sie komplett mit Boden ausgetauscht, nicht nur das Icon. Hinterher frage ich mich, ob es überhaupt Sinn macht, den Boden als Tilde anzulegen und nicht nur den Hintergrund grau anzumalen, aber das bleibt dir überlassen.
Java:
import static java.awt.Toolkit.getDefaultToolkit;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 30.04.2011
  * @author
  */
public class Denkspiel extends JFrame
{
	private static final long serialVersionUID = 1L;

	private static final int STEP_SIZE = 5;
	private static final int TILDE_POW_SIZE = 25;
	private static final Dimension FRAME_SIZE = new Dimension(456, 407);
	private static final Dimension TILDE_SIZE = new Dimension(TILDE_POW_SIZE, TILDE_POW_SIZE);
	
	private final Map<Integer, TildeInfo> TILDE_INFOS = new HashMap<Integer, TildeInfo>() {
		private static final long serialVersionUID = 1L;	
		{
			put(1, new TildeInfo("bild[1].png", true, "Boden", null));
			put(2, new TildeInfo("bild[2].png", true, "Kiste", new KistenLogic()));
			put(3, new TildeInfo("bild[3].png", false, "Wand", null));
			put(4, new TildeInfo("bild[4].png", false, "Wand mit roten Rohr unten", null));
			put(5, new TildeInfo("bild[5].png", false, "Wand mit roten Rohr link", null));
			put(6, new TildeInfo("bild[6].png", false, "Wand mit roten Rohr oben", null));
			put(7, new TildeInfo("bild[7].png", false, "Wand mit roten Rohr rechts", null));
			put(17, new TildeInfo("bild[17].png", false, "Wand mit roten Rohr rechts unten", null));
			put(18, new TildeInfo("bild[18].png", false, "Wand mit roten Rohr rechts oben", null));
			put(19, new TildeInfo("bild[19].png", false, "Wand mit roten Rohr links oben", null));
			put(20, new TildeInfo("bild[20].png", false, "Wand mit roten Rohr links unten", null));
		}
	};
	
	private static Tilde feld[][] = new Tilde[18][15];
	private Figur figur;

	public Denkspiel(String title) throws IOException
	{
		super(title);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		setSize(FRAME_SIZE);
		setLocationRelativeTo(null);
		
		setLayout(null);
 
		figur = new Figur();
		add(figur);
 
		felderstellen("lvl1.txt");
		 
		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt) {
				if(evt.getKeyCode() == KeyEvent.VK_UP)
					figur.controllMoving(new Point(0, -1));
				else if(evt.getKeyCode() == KeyEvent.VK_RIGHT)
					figur.controllMoving(new Point(1, 0));
				else if(evt.getKeyCode() == KeyEvent.VK_DOWN)
					figur.controllMoving(new Point(0, 1));
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT)
					figur.controllMoving(new Point(-1, 0));
			}
			public void keyReleased(KeyEvent evt) {
				if(evt.getKeyCode() == KeyEvent.VK_UP)
					figur.controllMoving(new Point(0, 1));
				else if(evt.getKeyCode() == KeyEvent.VK_RIGHT)
					figur.controllMoving(new Point(-1, 0));
				else if(evt.getKeyCode() == KeyEvent.VK_DOWN)
					figur.controllMoving(new Point(0, -1));
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT)
					figur.controllMoving(new Point(1, 0));
			}
		});
		
		setResizable(false);
		setVisible(true);
	}
	public void felderstellen(String file) throws IOException
	{
		Scanner scanner = new Scanner(new File(file));
		int lineCounter = 0;

		do
		{
			String line = scanner.nextLine();
			
			String[] parts = line.split(",");
			for(int partCounter = 0; partCounter < parts.length; partCounter++)
			{
				int id = Integer.parseInt(parts[partCounter]);
				
				TildeInfo tildeInfo = TILDE_INFOS.get(id);
				if(tildeInfo == null)
					continue;
				
				Tilde nextField = tildeInfo.newTilde();
				nextField.setLocation(partCounter * TILDE_SIZE.width, lineCounter * TILDE_SIZE.height);
				nextField.setSize(TILDE_SIZE);
				add(nextField);
				
				feld[partCounter][lineCounter] = nextField;
			}
			lineCounter++;
		}
		while (scanner.hasNextLine());
	}
	public static void main(String[] args) throws IOException
	{
		new Denkspiel("Denkspiel");
	}

	private final class Figur extends JLabel implements Runnable
	{
		private static final long serialVersionUID = 1L;
		
		private static final byte STATE_WAIT = 0;
		private static final byte STATE_MOVE = 1;
		private static final byte STATE_DIE = 2;
		private static final byte STATE_DEAD = 3;
		
		private byte state;
		private Thread runThread;
		private Point moveDir;

		private Figur()
		{
			setIcon(new ImageIcon(getDefaultToolkit().getImage("bild[0].png")));
			setBounds(8 * TILDE_SIZE.width, 7 * TILDE_SIZE.height, TILDE_SIZE.width, TILDE_SIZE.height);

			moveDir = new Point(0, 0);
			state = STATE_MOVE;
			
			runThread = new Thread(this, "Figur");
			runThread.start();
		}
		public void run()
		{
			if(moveDir == null)
				return;
			
			do
			{
				switch(state)
				{
					case(STATE_WAIT):
						synchronized (this)
						{
							try
							{
								wait();
							}
							catch (InterruptedException e) {}
						}
					break;
					
					case(STATE_MOVE):
						move();
					break;
				}
			}
			while(state != STATE_DIE);
			state = STATE_DEAD;
		}
		private void move()
		{
			final int moveDirX = moveDir.x;
			final int moveDirY = moveDir.y;
			
			int steps = TILDE_POW_SIZE / STEP_SIZE;
			int moveX = moveDirX * steps;
			int moveY = moveDirY * steps;
			
			final Tilde nextTilde = getNextTilde(moveDirX, moveDirY);
			if(!checkNextTilde(moveDirX, moveDirY, nextTilde))
				return;
			
			final Point loc = new Point(getX(), getY());
			for(int i = 0; i < steps; i++)
			{
				loc.x = loc.x + moveX;
				loc.y = loc.y + moveY;

				SwingUtilities.invokeLater(new Runnable() {
					public void run()
					{
						setLocation(loc);
					}
				});
				
				try
				{
					TimeUnit.MILLISECONDS.sleep(10L);
				}
				catch (InterruptedException e) {}
			}
			
			try
			{
				SwingUtilities.invokeAndWait(new Runnable() {
					public void run()
					{
						setLocation(loc);

						if(nextTilde != null)
							nextTilde.moveOn(new Point(moveDirX * -1, moveDirY * -1));
					}
				});
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			catch (InvocationTargetException e)
			{
				e.printStackTrace();
			}
		}
		private Tilde getNextTilde(int moveDirX, int moveDirY)
		{
			int x = getX();
			int y = getY();
			
			int tildeX = x / TILDE_SIZE.width;
			int tildeY = y / TILDE_SIZE.height;
			
			final int nextTildeX = tildeX + moveDirX;
			final int nextTildeY = tildeY + moveDirY;
			
			return(feld[nextTildeX][nextTildeY]);
		}
		private boolean checkNextTilde(int moveDirX, int moveDirY, Tilde nextTilde)
		{
			if(nextTilde != null && !nextTilde.isPassable())
            {
                nextTilde.push(new Point(moveDirX * -1, moveDirY * -1));
                try
                {
                    TimeUnit.MILLISECONDS.sleep(10L);
                }
                catch (InterruptedException e) {}
                return(false);
            }
			return(true);
		}
		
		public void controllMoving(Point dir)
		{
			if(Math.abs(moveDir.x + dir.x) < 2)
				moveDir.x+= dir.x;
			if(Math.abs(moveDir.y + dir.y) < 2)
				moveDir.y+= dir.y;
			
			synchronized (this)
			{
				notify();	
			}
		}
	}
	private static class TildeInfo
	{
		private boolean passable;
		private Icon icon;
		private String note;
		private GameItem itemLogic;

		public TildeInfo(String imagePath, boolean passable, String note, GameItem itemLogic)
		{
			super();
			
			this.passable = passable;
			icon = new ImageIcon(getDefaultToolkit().getImage(imagePath));
			this.note = note;
			this.itemLogic = itemLogic;
		}
		public int hashCode()
		{
			return(icon.hashCode() + note.hashCode());
		}
		public boolean equals(Object obj)
		{
			if(!(obj instanceof TildeInfo))
				return(false);
			
			TildeInfo cast = (TildeInfo)obj;
			return(icon.equals(cast.icon) && note.equals(cast.note) && passable == cast.passable);			
		}
		public Tilde newTilde()
		{
			Tilde t = new Tilde(passable, itemLogic);
			t.setIcon(icon);
			return(t);
		}
	}
	private static class Tilde extends JLabel
	{
		private static final long serialVersionUID = 1L;

		private boolean passable;
		private GameItem itemLogic;
		
		public Tilde(boolean passable, GameItem itemLogic)
		{
			super();
			this.passable = passable;
			this.itemLogic = itemLogic;
		}
		public void push(Point point)
		{
			if(itemLogic != null)
				itemLogic.push(point, this);
		}
		public void moveOn(Point point)
		{
			if(itemLogic != null)
				itemLogic.moveOn(point, this);
		}
		public boolean isPassable()
		{
			return passable;
		}
	}
	private static interface GameItem
	{
		public void push(Point dir, Tilde t);
		public void moveOn(Point dir, Tilde t);
	}
	private class KistenLogic implements GameItem
	{
		public void push(Point dir, Tilde t) {}
		public void moveOn(Point dir, Tilde t)
		{
			Tilde ground = TILDE_INFOS.get(1).newTilde();
			ground.setBounds(t.getBounds());
			remove(t);
			add(ground);
		
			int fieldX = t.getX() / TILDE_SIZE.width;
			int fieldY = t.getY() / TILDE_SIZE.height;
			
			feld[fieldX][fieldY] = ground;
		}
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Externalizable Problem beim Objekt einlesen Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
A Problem beim Deklarieren von einem BOOLEAN Java Basics - Anfänger-Themen 4
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
R Problem beim Wochenplan (Datum,Wochentag) Java Basics - Anfänger-Themen 30
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
L Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException) Java Basics - Anfänger-Themen 2
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
R Problem beim erstellen eines neuen Klassenobjekts Java Basics - Anfänger-Themen 2
F Input/Output Problem beim einlesen eines Strings Java Basics - Anfänger-Themen 3
J Problem beim auslesen von Int Wert aus YML-Datei Java Basics - Anfänger-Themen 6
P Problem beim Abschluss im Kompositum Java Basics - Anfänger-Themen 3
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
J Problem beim ausführen in cmd.exe Java Basics - Anfänger-Themen 4
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
A Problem beim Compilieren Java Basics - Anfänger-Themen 11
J Problem beim Fenster Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
M Problem beim Compilieren Java Basics - Anfänger-Themen 14
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
H Problem beim lesen des InputStreams von einem Subprozess Java Basics - Anfänger-Themen 4
Luk10 Problem beim .jar Datei erstellen Java Basics - Anfänger-Themen 19
L Problem beim Ausführen Java Basics - Anfänger-Themen 40
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
E Problem beim Programmieren eines Kartenspiels Java Basics - Anfänger-Themen 3
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
M Problem beim compilieren Java Basics - Anfänger-Themen 6
JAVAnnik problem beim lvl laden Java Basics - Anfänger-Themen 15
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
S Problem beim Speichern und Laden von Daten Java Basics - Anfänger-Themen 13
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
S Problem beim Erstellen eines Scanner-Objekts Java Basics - Anfänger-Themen 7
W Problem beim CSV-Import Java Basics - Anfänger-Themen 5
M Datentypen Problem beim zusammenstellen eines Abfrage-Strings Java Basics - Anfänger-Themen 3
K Collections Problem beim import von Packages Java Basics - Anfänger-Themen 10
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
H Problem beim Anfang von Java (Java Editor) Java Basics - Anfänger-Themen 2
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
D Problem beim Zeichnen von "Das Haus vom Nikolaus" Java Basics - Anfänger-Themen 10
D Problem beim Auslesen aus File Java Basics - Anfänger-Themen 3
A Problem beim Splitten eines Strings Java Basics - Anfänger-Themen 10
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
V Problem beim Programm laden Java Basics - Anfänger-Themen 5
H Problem beim kompilieren Java Basics - Anfänger-Themen 3
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
Miladriel Problem beim Neuzeichnen nach deiconify Java Basics - Anfänger-Themen 9
R Problem beim Ausführen von Java-PGM aus der shel Java Basics - Anfänger-Themen 3
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
H problem beim zeichen im JFrame Java Basics - Anfänger-Themen 6
F Problem beim Objekteaufruf... Java Basics - Anfänger-Themen 4
E BlockChallenge: Problem beim löschen der Blöcke Java Basics - Anfänger-Themen 3
H Problem beim Verkürzen von Programm Java Basics - Anfänger-Themen 3
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Problem beim Zugriff auf Daten GUI + Startklasse Java Basics - Anfänger-Themen 4
P Problem beim Thread Java Basics - Anfänger-Themen 20
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
V Problem beim erstellen eines ausführbaren Programs Java Basics - Anfänger-Themen 5
0 Problem beim Starten des Applets Java Basics - Anfänger-Themen 2
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
G Problem beim Programmieren von Blackjack Java Basics - Anfänger-Themen 15
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
T Problem beim Konsolenstart Java Basics - Anfänger-Themen 5
C Problem beim Berechnen der Quadratwurzel Java Basics - Anfänger-Themen 3
C Problem beim nutzen von Teilprogrammen in main Java Basics - Anfänger-Themen 2
M Problem beim Zeichnen Java Basics - Anfänger-Themen 5
D Problem beim Kompilieren Java Basics - Anfänger-Themen 4
D Problem beim auslesen von TextArea Java Basics - Anfänger-Themen 3
G Problem beim Schreiben in Textdatei Java Basics - Anfänger-Themen 9
F ggT finden - problem beim qc Java Basics - Anfänger-Themen 4
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
G Habe ein Problem mit syn-Editor ( beim compilieren) Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben