Spiel: Items in Inventarslots

Hallo,
folgendes Problem, wenn ich aufgenommene Items ins Inventar sortieren will,
ich hab eine Methode, die in der Klasse Inventar liegt, die das Bild des Items in den vorgegebenen Slot zeichnet

	@Override
	public void drawSlotPicture(Graphics g, int slot, BufferedImage img) {
        int slotnr = slot -1;
		g.drawImage(img, this.x +slotnr*100/*breite eines Slots*/, this.yziel, s);
		slotsfull[slot] = true;
	}

Soweit sogut, aber mit der Methode slotüberpr in der Klasse Inventar will ich überprüfen, welcher slot frei ist, damit es nich zu unerwünschten Lücken im Inventar kommt, dazu gehe ich mit while einen boolean-Array durch, der sagt ob der Slot voll ist oder nicht,25 mal, weil es soviele slots sind, und wenn einer frei ist wird die schleife unterbrochen, und der Index des freien Slots wird zurückgeliefert:

	@Override
	public int slotüberpr(boolean slotvoll[]){
		int s = 1;
		boolean fertig = false;
		while(s < 25 && fertig == false){
			if(slotvoll[s] == false){
				fertig = true;
			    break;
			}
        	s++;
        }
		int indexfreeslot = s;
		return indexfreeslot;
	}

Hier noch der Abschnitt der PaintComponent methode:

        if(sicherungiminv && invoffen){
        	inv.drawSlotPicture(g, slotindex, items[2]);
        	slotindex = inv.slotüberpr(inv.slotsfull);
        }

Das Problem ist jetzt, dass wenn man das Item aufgenommen hat und das Inventar öffnet, das Bild des Items einmal von links nach rechts über den Bildschirm flitzt, un bei jedem witeren öffnen des Inventars nicht mehr zusehen ist.
Ich hoffe jemand kann mir helfen.

Die Verwaltung der Slots sollte imho nicht in der paintComponent, sondern eine Etappe früher passieren.

Gruß,
André

Wie meinen?

Wenn du ein Item ins Inventar aufnimmst, legst du den Slot sofort fest, nicht erst beim Malen des Inventars. In paintComponent malst du dann einfach alle belegten Slots.

Gruß,
André

Aber wenn jetzt das 1. Item benutzt wird, also wegfällt, muss ja neu berechnet werden.

Klar, wenn du ein Item raus nimmst, gibs du den Slot sofort wieder frei und machst ein repaint.

Gruß,
André

Vielen Dank jetzt funktioniert es.

Stopp, ich habs grad wieder probiert, und jetzt überlagern sich die beiden Items

Da ich deine konkrete Implementierung nicht kenne, muss ich raten. Ich tippe mal darauf, dass der Unterschied zwischen ViewIndex und ModelIndex eine Rolle spielt. In dem Fall brauchst du wahrscheinlich eine Methode, die dir den ViewIndex zurück konvertiert, damit er wieder auf dein array passt. Etwa so (nicht getestet):

        int i = -1;
        for (int modelIndex = 0; modelIndex < slots.length; modelIndex++) {
            if (slots[modelIndex]) {
                i++;
            }
            if (i == viewIndex) {
                return modelIndex;
            }
        }
        return i;
    }```

Gruß,
André

Bekomme eine ArrayIndexOutOfBoundsExeption: -1 in der Klasse Inventar in der Methode drawSlotPicture,
damit: slotsfull[slot] = true;
Hat sich erledigt, aber jetzt wird das Item um eins versetzt links außerhalb des Inventars gezeichnet.
Bzw. ist es noch komplizierter, weil nur im 1. screen das Item außerhalb gezeichnet wird, im 2. ordnen sich alle Items schön ein. Das ist mir ehrlich gesagt ein bisschen suspekt.

Doch nicht bin wieder bei der ArrayIndexOutOfBuondsException.
Hilfe!
:confused:

Diese Exception wird geworfen, um anzuzeigen, dass auf ein Array mit einem ungültigen Index zugegriffen wurde. Der Index ist entweder negativ oder größer als oder gleich der Größe des Arrays.

Gruß,
André

PS: am schnellsten kann dir geholfen werden, wenn du ein KSKB postest (kurzes, selbständiges, kompilierbares Beispiel).

Aber es funktioniert ja ohne Bilder nicht.

Bilder gibt es überall ja genug :wink:

Gruß,
André

Wennst meinst.
Socius.java:

package Java.Soc;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class Socius extends JPanel implements Runnable, MouseListener, MouseMotionListener, MouseWheelListener{
	
	public static void main(String[] args){
		new Socius(600, 600);
	}
    
	JFrame f;
	Thread t;
	BufferedImage[] backg;
	long delta    = 0;
	long last     = 0;
	long fps      = 0;
	public int klickx;
	public int klicky;
	public String FPS =  "FPS: "+Long.toString(fps);
	public int spPosaktX = 600;
	public int spPosaktY = 0;
	private boolean klick;
	public int currentindex = 1;
	private int currentbackgroundindex = 2;
	public int screen = 1;
	public BufferedImage[] anim;
	private JProgressBar bar;
	private int fortschritt = 4;
	private boolean los;
	private int bewegx;
	private int bewegy;
	private Inventar inv= new Inventar(550, 100, this);
	private boolean mausradrunter;
	private boolean mausradrauf;
	private int[] slotszahl = new int[6];
	private BufferedImage[] items = new BufferedImage[3];
	private boolean invoffen = false;
	public boolean testiminv = false;
	private LaufEngine le = new LaufEngine();
	public boolean neuerscreen;
	public boolean sicherungiminv = false;
	public boolean sichkastenoffen;
	private BufferedImage[] fordg = new BufferedImage[10];
	public int slotindex1;
	public int slotindex2;
	public boolean rechtsklick;
	private int slotindex21;
	private int slotindex11;
	
	
	private static final long serialVersionUID = 1L;
	
	Socius(int w, int h){
	    this.setPreferredSize(new Dimension(w, h));
	    this.setBackground(Color.BLACK);
	    f = new JFrame("Socius");
	    f.setLocation(100, 100);
	    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    f.add(this);
	    f.setBackground(Color.BLACK);
	    f.pack();
	    f.setVisible(true);
		t = new Thread(this);
		f.addMouseListener(this);
		f.addMouseWheelListener(this);
		bar = new JProgressBar(0, 23);
		bar.setStringPainted(true);
		f.add(bar, BorderLayout.PAGE_START );
		t.start();
		laden();
	}
	
	

	private void laden() {
		for(int i = 1;i<= 5;i++){
		slotszahl** = i;
		}
		bar.setValue(1);
		backg = new BufferedImage[9];
		bar.setValue(2);
		anim = new BufferedImage[17];
		bar.setValue(3);
			try {
				for(int c = 1; c <= 16; c++){
				anim``` = ImageIO.read(Socius.class.getResource("textures/animation/a"+c+".png"));
				fortschritt++;
				bar.setValue(fortschritt);
				}
				for(int c = 1; c <= 2; c++){
				items ``` = ImageIO.read(Socius.class.getResource("textures/inventaritems/i"+c+".png"));
				fortschritt++;
				bar.setValue(fortschritt);
				}
				for(int c = 1; c <= 8; c++){
					backg``` = ImageIO.read(Socius.class.getResource("textures/hintergrund/h"+c+".png"));
					fortschritt++;
					bar.setValue(fortschritt);
				}
				for(int c = 1; c <= 9; c++){
					fordg ``` = ImageIO.read(Socius.class.getResource("textures/fordergrund/f"+c+".png"));
					fortschritt++;
					bar.setValue(fortschritt);
				}
				System.out.println("Bilderladen abgeschlossen");
			} catch (IOException e) {
				
				e.printStackTrace();
			}
			f.remove(bar);
			bar.repaint();
			f.setBackground(Color.BLACK);
			currentindex = 1;
			bar.setVisible(false);
		f.repaint();
		repaint();
		los = true;

	}



	@Override
	public void run() {
    while(f.isVisible()){
        if(los){
    	doLogic();
    	//checkscreen();
        checkKlicks();
        checkMausrad();
        }
    }

		
	}
	



	private void checkMausrad() {
		if(mausradrunter){
			inv.öffnen();
			invoffen = true;
			repaint();
		}
		else if(mausradrauf){
			invoffen = false;
			repaint();
			inv.schliessen();

		}
		mausradrunter = false;
	}



	private void checkKlicks(){
		
		if(klick){
			switch(screen){
			case 0:
				   break;
			case 1:le.laufen1(this);
			       if(testiminv){
		        	   slotindex11 = inv.slotüberpr(inv.slotsfull);
		    	      slotindex1 = convertIndexToModel(inv.slotsfull, slotindex11);
			       }
			       if(neuerscreen){
				   spPosaktX = 100;
			       spPosaktY = 100;
			       currentindex = 1;
			       currentbackgroundindex = 3;
			       this.repaint();
			       neuerscreen = false;
			       }
			       break;
			case 2:le.laufen2(this);
		           if(sicherungiminv){
		        	   slotindex21 = inv.slotüberpr(inv.slotsfull);
		    	      slotindex2 = convertIndexToModel(inv.slotsfull, slotindex21);
		           }
				   if(neuerscreen){
				   spPosaktX = 100;
			       spPosaktY = 0;
			       currentindex = 1;
			       currentbackgroundindex = 4;
			       this.repaint();
			       neuerscreen = false;
			       }
			       break;
			case 3: le.laufen3(this);
			       if(neuerscreen){
			       spPosaktX = 100;
		           spPosaktY = 0;
		           currentindex = 1;
		           currentbackgroundindex = 5;
		           this.repaint();
		           neuerscreen = false;
		           } 
			}
		     klick = false;
		    }

	}




	@Override
	protected void paintComponent(Graphics g){
		 g.drawImage(backg[currentbackgroundindex], 0, 0, this);
        g.drawImage(anim[currentindex], spPosaktX, spPosaktY, this);

        switch(screen){
        case 0:
        	   break;
        case 1:if(testiminv == false){
        	   g.drawImage(items[1], 800, 600, this);
               }
               break;
        case 2:if(sichkastenoffen == false){
        	   g.drawImage(fordg[2], 100, 600, this);
               }
               else if(sichkastenoffen){
               g.drawImage(fordg[3], 100, 600, this);
               if(sicherungiminv == false){
               g.drawImage(fordg[4], 135, 705, this);
               }
               }
               break;
        }
        inv.drawInventory(g);
        if(invoffen){
        inv.drawSlot(g);
        }
        if(testiminv && invoffen){
            inv.drawSlotPicture(g, slotindex1, items[1]);
        }
        if(sicherungiminv && invoffen){
        	inv.drawSlotPicture(g, slotindex2, items[2]);
        }
        
	}



	private void doLogic() {
		
	}
	
		@Override
		public void mouseClicked(MouseEvent e) {
			 klickx = e.getX();
			 klicky = e.getY();
             klick = true;
             int mausbutton = e.getButton();
             if(mausbutton == 3){
            	 rechtsklick =true;
             }
		}

		@Override
		public void mouseEntered(MouseEvent arg0) {

		}

		@Override
		public void mouseExited(MouseEvent arg0) {

		}

		@Override
		public void mousePressed(MouseEvent arg0) {

		}

		@Override
		public void mouseReleased(MouseEvent arg0) {

		}



		@Override
		public void mouseDragged(MouseEvent arg0) {
			
		}



		@Override
		public void mouseMoved(MouseEvent arg0) {
			bewegx = arg0.getX();
			bewegy = arg0.getX();
			System.out.println(bewegx + bewegy);
		}


		@Override
		public void mouseWheelMoved(MouseWheelEvent we) {
			int iwi = we.getWheelRotation();
            if(iwi == 1){
            	mausradrunter = true;
            	mausradrauf = false;
            }
            else{
            	mausradrunter = false;
            	mausradrauf = true;
            }
		}
	    public int convertIndexToModel(boolean[] slots, int viewIndex) {
	    	int i = -1;
            
            for (int modelIndex = 0; modelIndex < slots.length; modelIndex++) {
                if (slots[modelIndex]) {
                    i++;
                }
                if (i == viewIndex) {
                    return modelIndex;
                }
            }
            return i;
        }

	}

Inventar.java:

package Java.Soc;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;

public class Inventar extends JComponent implements Drawable, InventorySlot{
	int x;
	int y;
	BufferedImage[] invbild = new BufferedImage[2];
	private Socius s;
	private int index = 0;
	private int yziel;
	private BufferedImage slotbild;
	public boolean[] slotsfull = new boolean[26];
	
    public Inventar(int x, int y, Socius s){
    	this.x = x;
    	this.yziel = y;
    	this.s = s;
    	laden();
    }
	private void laden() {
		try {
			slotbild = ImageIO.read(getClass().getResource("textures/fordergrund/f10.png"));
			invbild[1] = ImageIO.read(getClass().getResource("textures/fordergrund/f11.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private static final long serialVersionUID = 1L;
    
	
	public void öffnen(){
		
		index = 1;
		y = 10;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 20;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 30;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 40;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		y = 50;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 60;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 70;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 80;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 90;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = yziel;
		s.repaint();
	}
	
	public void schliessen(){
		y = 90;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 80;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 70;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 60;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		y = 50;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 40;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 30;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 20;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 10;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		y = 0;
		s.repaint();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		index = 0;
		s.repaint();
	}
	@Override
	public void drawInventory(Graphics g) {
		g.drawImage(invbild[index], x, y, s);
	}
	@Override
	public void drawSlot(Graphics g){
		int yslot = yziel ;
		for(int u = 1; u<= 5; u++){
			
		for(int i = 0; i <= 4; i++){
	    int xslotn = x + slotbild.getWidth()*i;
		int xslotf = xslotn;
		g.drawImage(slotbild, xslotf, yslot, s);
		s.repaint();
		}
		yslot = yziel +u*slotbild.getWidth();
		}
	}
	@Override
	public void drawSlotPicture(Graphics g, int slot, BufferedImage img) {
        int slotnr = slot -1;
		g.drawImage(img, this.x +slotnr*100, this.yziel, s);
		if(s.screen == 1){
			slotsfull[slot] = true;	
		}
		else{
			slotsfull[slot +1] = true;
		}

	}
	@Override
	public boolean slotFull(int slot) {
		return slotsfull[slot];
	}
	@Override
	public int slotüberpr(boolean slotvoll[]){
		int s = 1;
		boolean fertig = false;
		while(s < 25 && fertig == false){
			if(slotvoll[s] == false){
				fertig = true;
			    break;
			}
        	s++;
        }
		int indexfreeslot = s;
		return indexfreeslot;
	}
}

LaufEngine.java:

package Java.Soc;

public class LaufEngine {
    
	public LaufEngine(){
	}
	public void laufen1(Socius s) {
		// NACH UNTEN LAUFEN
	     if(s.klicky > s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200) && s.rechtsklick == false){
	    	 System.out.println("laufe nach unten");
		  while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
			  
	            s.spPosaktY = s.spPosaktY + 30;
	            try{
		           Thread.sleep(200);
	            } catch(InterruptedException ie){
		           System.err.println(ie);
	            }
	             s.currentindex++;
	            if(s.currentindex > 4){
		         s.currentindex = 1;
	            }
	            s.repaint();
	          }
		  s.currentindex = 1;
		  s.repaint();
			if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
				s.testiminv = true;
				s.repaint();
		}
			if(s.rechtsklick && s.klickx > 450 && s.klickx < 650 && s.klicky > 300 && s.klicky < 500){
				System.out.println("Dies ist ein typisches Fenster.");
			}
	     }
	     
	     // NACH OBEN LAUFEN
	     else if(s.klicky < s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200) && s.rechtsklick == false){ 
	    	 System.out.println("laufe nach oben");
	    	 s.currentindex = 5;
	          while(s.spPosaktY > s.klicky -(s.spPosaktY/2)){
                 s.spPosaktY = s.spPosaktY - 30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                   s.currentindex++;
                 if(s.currentindex > 8){
	               s.currentindex = 5;
                 }
                 s.repaint();
              }
	          s.currentindex = 5;
	          s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
	          }
	     // NACH RECHTS LAUFEN
	     else if(s.klickx > s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -200) && s.rechtsklick == false){
	    	 System.out.println("laufe nach rechts");
	    	 s.currentindex = 13;
	          while(s.spPosaktX < s.klickx){
	        	  s.spPosaktX = s.spPosaktX +30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 16){
                	 s.currentindex = 13;
                 }
                 s.repaint();
              }
	          s.currentindex = 13;
	          s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
				if(s.klickx > s.getWidth() -200 && s.klicky > s.getHeight() -400){
					s.screen = 2;
					s.neuerscreen = true;
					
				}
	          }
	     
	     // NACH LINKS LAUFEN
	     else if(s.klickx < s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -100) && s.rechtsklick == false){
	    	 System.out.println("laufe nach links");
	    	 s.currentindex = 9;
	          while(s.spPosaktX > s.klickx){
	        	  s.spPosaktX = s.spPosaktX -30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
              }
	          s.currentindex = 9;
	          s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
	          }
	     
	     //NACH RECHTS OBEN LAUFEN(SCHRÄG)
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky < (s.spPosaktY -100) && s.rechtsklick == false){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 
	    	 s.currentindex = 5;
	    	 while(s.spPosaktY > s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 8){
	    			 s.currentindex = 5;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
	     }
	     
	     // LAUFEN NACH RECHTS UNTEN(SCHRÄG)
	     
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky > (s.spPosaktY + 200) && s.rechtsklick == false){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 4){
	    			 s.currentindex = 1;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
				if(s.klickx > s.getWidth() -200 && s.klicky > s.getHeight() -400){
					s.screen = 2;
					s.neuerscreen = true;
					
				}
	     }
	     
	     //LAUFE NACH LINKS UNTEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky > (s.spPosaktY +s.anim[s.currentindex].getHeight()) && s.rechtsklick == false){
	    	 s.currentindex = 9;
	    	 while(s.spPosaktX > s.klickx){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY > s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 4){
                	 s.currentindex = 1;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
	     }
	     
	     //NACH LINKS OBEN LAUFEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky < (s.spPosaktY -200) && s.rechtsklick == false){
	    	 s.currentindex = 9;
	    	 while(s.klickx < s.spPosaktX){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		 if(s.currentindex > 12){
	    			 s.currentindex = 9;
	    		 }
	    		 s.repaint();		    		 
	    	 }
	    	 s.currentindex =4;
	    	 while(s.klicky < s.spPosaktY +(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		if(s.currentindex > 8){
	    			s.currentindex = 5;
	    		}
	    		s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();
				if(s.klickx > 800 && s.klickx < 900 && s.klicky > 600 && s.klicky < 700){    
					s.testiminv = true;
					s.repaint();
			}
	     }
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	public void laufen2(Socius s) {
		// NACH UNTEN LAUFEN
	     if(s.klicky > s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200)){
	    	 System.out.println("laufe nach unten");
		  while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
			  
	            s.spPosaktY = s.spPosaktY + 30;
	            try{
		           Thread.sleep(200);
	            } catch(InterruptedException ie){
		           System.err.println(ie);
	            }
	             s.currentindex++;
	            if(s.currentindex > 4){
		         s.currentindex = 1;
	            }
	            s.repaint();
	          }
		  s.currentindex = 1;
		  s.repaint();
			if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
				s.sichkastenoffen = true;
				s.repaint();
		}
		    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
		    	s.sicherungiminv = true;
		    	s.repaint();
		    }
	     }
	     
	     // NACH OBEN LAUFEN
	     else if(s.klicky < s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200)){ 
	    	 System.out.println("laufe nach oben");
	    	 s.currentindex = 5;
	          while(s.spPosaktY > s.klicky +(s.spPosaktY/2)){
                 s.spPosaktY = s.spPosaktY - 30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                   s.currentindex++;
                 if(s.currentindex > 8){
	               s.currentindex = 5;
                 }
                 s.repaint();
              }
	          s.currentindex = 5;
	          s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			
			    	s.repaint();
			    }
	          }
	     // NACH RECHTS LAUFEN
	     else if(s.klickx > s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -200)){
	    	 System.out.println("laufe nach rechts");
	    	 s.currentindex = 13;
	          while(s.spPosaktX < s.klickx -(s.spPosaktY/2)){
	        	  s.spPosaktX = s.spPosaktX +30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 16){
                	 s.currentindex = 13;
                 }
                 s.repaint();
              }
	          s.currentindex = 13;
	          s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			    	s.repaint();
			    }
			    if(s.klickx > 600 && s.klickx < 1000 && s.klicky > 200 && s.klicky < 700){
			    	s.screen = 3;
			    	s.neuerscreen = true;
			    }
	          }
	     
	     // NACH LINKS LAUFEN
	     else if(s.klickx < s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -100)){
	    	 System.out.println("laufe nach links");
	    	 s.currentindex = 9;
	          while(s.spPosaktX > s.klickx ){
	        	  s.spPosaktX = s.spPosaktX -30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
              }
	          s.currentindex = 9;
	          s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			    	s.repaint();
			    }
	          }
	     
	     //NACH RECHTS OBEN LAUFEN(SCHRÄG)
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky < (s.spPosaktY -100)){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 5;
	    	 while(s.spPosaktY > s.klicky +(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 8){
	    			 s.currentindex = 5;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			    	s.repaint();
			    }
			    if(s.klickx > 600 && s.klickx < 1000 && s.klicky > 200 && s.klicky < 700){
			    	s.screen = 3;
			    	s.neuerscreen = true;
			    }
	     }
	     
	     // LAUFEN NACH RECHTS UNTEN(SCHRÄG)
	     
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky > (s.spPosaktY + 200)){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 4){
	    			 s.currentindex = 1;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			    	s.repaint();
			    }
			    if(s.klickx > 600 && s.klickx < 1000 && s.klicky > 200 && s.klicky < 700){
			    	s.screen = 3;
			    	s.neuerscreen = true;
			    }
	     }
	     
	     //LAUFE NACH LINKS UNTEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky > (s.spPosaktY +200)){
	    	 s.currentindex = 9;
	    	 while(s.spPosaktX > s.klickx){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY > s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 4){
                	 s.currentindex = 1;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
			    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
			    	s.sicherungiminv = true;
			    	s.repaint();
			    }
	     }
	     
	     //NACH LINKS OBEN LAUFEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky < (s.spPosaktY -200)){
	    	 s.currentindex = 9;
	    	 while(s.klickx < s.spPosaktX){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		 if(s.currentindex > 12){
	    			 s.currentindex = 9;
	    		 }
	    		 s.repaint();		    		 
	    	 }
	    	 s.currentindex =4;
	    	 while(s.klicky < s.spPosaktY +(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		if(s.currentindex > 8){
	    			s.currentindex = 5;
	    		}
	    		s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();
				if(s.klickx > 100 && s.klickx < 250 && s.klicky > 600 && s.klicky < 800){    
					s.sichkastenoffen = true;
					s.repaint();
			}
		    if(s.klickx > 135 && s.klickx < 185 && s.klicky > 705 && s.klicky < 755){
		    	s.sicherungiminv = true;
		    	s.repaint();
		    }
	     }
	}
	
	

Der rest von LaufEngine.java:

	public void laufen3(Socius s) {
		// NACH UNTEN LAUFEN
	     if(s.klicky > s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200)){
	    	 System.out.println("laufe nach unten");
		  while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
			  
	            s.spPosaktY = s.spPosaktY + 30;
	            try{
		           Thread.sleep(200);
	            } catch(InterruptedException ie){
		           System.err.println(ie);
	            }
	             s.currentindex++;
	            if(s.currentindex > 4){
		         s.currentindex = 1;
	            }
	            s.repaint();
	          }
		  s.currentindex = 1;
		  s.repaint();

	     }
	     
	     // NACH OBEN LAUFEN
	     else if(s.klicky < s.spPosaktY && s.klickx < (s.spPosaktX +200) && s.klickx > (s.spPosaktX -200)){ 
	    	 System.out.println("laufe nach oben");
	    	 s.currentindex = 5;
	          while(s.spPosaktY > s.klicky +(s.spPosaktY/2)){
                 s.spPosaktY = s.spPosaktY - 30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                   s.currentindex++;
                 if(s.currentindex > 8){
	               s.currentindex = 5;
                 }
                 s.repaint();
              }
	          s.currentindex = 5;
	          s.repaint();

	          }
	     // NACH RECHTS LAUFEN
	     else if(s.klickx > s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -200)){
	    	 System.out.println("laufe nach rechts");
	    	 s.currentindex = 13;
	          while(s.spPosaktX < s.klickx -(s.spPosaktY/2)){
	        	  s.spPosaktX = s.spPosaktX +30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 16){
                	 s.currentindex = 13;
                 }
                 s.repaint();
              }
	          s.currentindex = 13;
	          s.repaint();
	             if(s.klickx > s.getWidth() -200){
	            	 s.screen = 4;
	            	 s.neuerscreen = true;
	             }
	          }
	     
	     // NACH LINKS LAUFEN
	     else if(s.klickx < s.spPosaktX && s.klicky < (s.spPosaktY +200) && s.klicky > (s.spPosaktY -100)){
	    	 System.out.println("laufe nach links");
	    	 s.currentindex = 9;
	          while(s.spPosaktX > s.klickx ){
	        	  s.spPosaktX = s.spPosaktX -30;
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
              }
	          s.currentindex = 9;
	          s.repaint();
	          }
	     
	     //NACH RECHTS OBEN LAUFEN(SCHRÄG)
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky < (s.spPosaktY -100)){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 5;
	    	 while(s.spPosaktY > s.klicky +(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	             
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 8){
	    			 s.currentindex = 5;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
             if(s.klickx > s.getWidth() -200){
            	 s.screen = 4;
            	 s.neuerscreen = true;
             }
	     }
	     
	     // LAUFEN NACH RECHTS UNTEN(SCHRÄG)
	     
	     else if(s.klickx > (s.spPosaktX +200) && s.klicky > (s.spPosaktY + 200)){
	    	 s.currentindex = 13;
	    	 while(s.spPosaktX < s.klickx){
	    		 s.spPosaktX = s.spPosaktX +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 16){
	    			 s.currentindex = 13;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY < s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
	    		 
                 s.currentindex++;
	    		 if(s.currentindex > 4){
	    			 s.currentindex = 1;
	    		 }
	    		 s.repaint();
	    	 }
	    	 s.currentindex = 13;
	    	 s.repaint();
             if(s.klickx > s.getWidth() -200){
            	 s.screen = 4;
            	 s.neuerscreen = true;
             }
	     }
	     
	     //LAUFE NACH LINKS UNTEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky > (s.spPosaktY +200)){
	    	 s.currentindex = 9;
	    	 while(s.spPosaktX > s.klickx){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 12){
                	 s.currentindex = 9;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 1;
	    	 while(s.spPosaktY > s.klicky -(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY +30;
	    		 
                 try{
	                Thread.sleep(200);
                 } catch(InterruptedException ie){
	                System.err.println(ie);
                 }
                 
                 s.currentindex++;
                 if(s.currentindex > 4){
                	 s.currentindex = 1;
                 }
                 s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();

	     }
	     
	     //NACH LINKS OBEN LAUFEN
	     
	     else if(s.klickx < (s.spPosaktX -200) && s.klicky < (s.spPosaktY -200)){
	    	 s.currentindex = 9;
	    	 while(s.klickx < s.spPosaktX){
	    		 s.spPosaktX = s.spPosaktX -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		 if(s.currentindex > 12){
	    			 s.currentindex = 9;
	    		 }
	    		 s.repaint();		    		 
	    	 }
	    	 s.currentindex =4;
	    	 while(s.klicky < s.spPosaktY +(s.spPosaktY/2)){
	    		 s.spPosaktY = s.spPosaktY -30;
	    		 
	    		 try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
	    		 
	    		 s.currentindex++;
	    		if(s.currentindex > 8){
	    			s.currentindex = 5;
	    		}
	    		s.repaint();
	    	 }
	    	 s.currentindex = 9;
	    	 s.repaint();

	     }
	}
	
	
	
}

Drawable.java:

package Java.Soc;

import java.awt.Graphics;

public interface Drawable {
public void drawInventory(Graphics g);
}

InventorySlot.java:

package Java.Soc;

import java.awt.Graphics;

public interface Drawable {
public void drawInventory(Graphics g);
}

Es tut mir Leid, aber das ist kein KSKB. Ein KSKB zu erstellen bedeutet nicht, das ganze Projekt zu kopieren, sondern es ist ein kurzes (!) Beispiel, bei dem der Fehler auftritt und alles überflüssige weggelassen wird.

Gruß,
André

Ich kann nur nochmal wiederholen und betonen, was ich schon in http://forum.byte-welt.net/showthread.php?p=19464#post19464 geschrieben hatte. Das, was du da machst, ist nicht “Programmieren”. Das, was du machst, ist “versuchen, Code hinzuschreiben, der Sachen macht”. Das soll nicht demotivierend gemeint sein, aber … bei solchen Klassen wie der “LaufEngine” spritzt einem echt Blut aus den Augen :verzweifel:

Was auch immer du vorhast: Du solltest in kleineren Schritten vorgehen. Man kann nicht Programmieren lernen, indem man ein (“komplexes”) Spiel schreibt. Es heißt zwar: “Programmieren lernt man nur durch Programmieren”, aber damit etwas anderes gemeint, als “viel Code hinschreiben” (in der Hoffnung, dass man es irgendwann automatisch gut kann).

Wie auch immer. Die Stelle, wo die Exception kommt, ist ja in

    @Override
    public void drawSlotPicture(Graphics g, int slot, BufferedImage img) {
        int slotnr = slot -1;
        g.drawImage(img, this.x +slotnr*100, this.yziel, s);
        if(s.screen == 1){
            slotsfull[slot] = true;
        }
        else{
            slotsfull[slot +1] = true;
        }

Dort wird an zwei Stellen auf einen Array zugegriffen. An einer der beiden Stellen wird ein ungüliger Index verwendet. Ich nehme an, dort wo ‘slot+1’ verwendet wird. Bestätigen könnte man das mit sowas wie

System.out.println("Verwende index "+(slot+1)+", maximal gültig ist "+(slotsfull.length-1));
slotsfull[slot +1] = true;

Wo der ungültige Index herkommt? Ja, schau nach, wo die Methode aufgerufen wird, und “hangle dich an den Aufrufen entlang”, bis du die Antwort weißt. Das sind Dinge, die dir mittel- und langfristig niemand abnehmen kann.

Was man gegen den Fehler machen kann? Ja, einfach
slotsfull[slot +1] = true;
ersetzen durch
if (slot < slotsfull.length-2) slotsfull[slot +1] = true;
aber worauf das ganze hinauslaufen soll, ist mir immernoch nicht klar…

Was genau gefällt dir denn an LaufEngine.java nicht ?