Point & Click Thread Probleme

MrXYF

Mitglied
Hallo,
ich bin neu in diesem Forum und hoffe, dass ihr mir bei meinem Problem weiter helfen könnt ;)
Mit einem Kumpel zusammen will ich ein kleines Point & Click Andventure erstellen. Grafiken und so sind in arbeit, aber als erstes braucht man natürlich ein Grundgerüst des Spieles...
Daran sitz ich grad, und hab schon den ersten Fehler, den ich leider allein nicht lösen kann...
Damit man es sich besser vorstellen kann, ist die Projekt Datei im Anhang, den Quellcode poste ich auch ;)
Zurück zum Fehler: Wenn ich im Spiel bin kann ich mit rechts Klick das Gegenstandsmenu aufrufe.Wenn ich im Gegnstandsmenu normal klicke, dann stürzt das Spiel manchmal ab.
Im Debug Modus komm ich auch nicht weiter, da steht aber immer:
Thread [AWT-EventQueue-0] (Suspended (exception NullPointerException)) EventDispatchThread.run() line: not available

Ich hofe jetzt natürlich, dass ihr mir weiter helfen könnt, und wenn es irgendwas, wegen unsauberem programmieren zu beanstanden gibt (wahrscheinlich genug...), könnt ihr das auch gerne schreiben :D

Danke schonmal im voraus,
Schöne Grüße ;)

Code: (Ich denke mal der wichtigste, wenn was fehlt, einfach schreiben ;) )
Java:
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @author MrXYF
 * Main steuert alles
 *
 */
public class Main implements Runnable{
   
   final int WIDTH = 640;
   final int HEIGHT = 400;
   final int STARTX = 300;
   final int STARTY = 375;
   
   JFrame frame;
   Canvas gameCanvas;
   Menu menu;
   GegenstandMenu gegenstandMenu;
   BufferStrategy bufferStrategy;
   private BufferedImage bg0IMG, bg1IMG, bg2IMG, bg3IMG, bg4IMG, playerIMG;
   private int mouseX, mouseY, dX, dY, level, mode;
   private boolean pressed1, pressed2, gegenstandMenubool;
   
   private GegenstandListe gegenstaende;
   private ItemKiste itemKiste;
 
   
   public Main(){
      frame = new JFrame("Adventure Test");
      
      
      level = 2;
      mode = 0;
      mouseX = STARTX;
      mouseY = STARTY;
      dX = STARTX;
      dY = STARTY;
      pressed1 = false;
      pressed2 = false;
      gegenstandMenubool = false;
      
      
      gegenstaende = new GegenstandListe();
      gegenstaende.level(level);
      
      itemKiste = new ItemKiste();
      for(int i = 0; i < 20; i++){
    	  itemKiste.addToList(new Item());
      }
      
      JPanel panel = (JPanel) frame.getContentPane();
      panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
      panel.setLayout(null);
      
      gameCanvas = new Canvas();
      gameCanvas.setBounds(0, 0, WIDTH, HEIGHT);
      gameCanvas.setIgnoreRepaint(true);
      
      menu = new Menu();
      
      panel.add(gameCanvas);
      
      MouseAdapter adapter = new MouseControl();
      gameCanvas.addMouseListener(adapter);
      gameCanvas.addMouseMotionListener(adapter);
      
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setResizable(false);
      frame.setVisible(true);
      
      gameCanvas.createBufferStrategy(2);
      bufferStrategy = gameCanvas.getBufferStrategy();
      
      gameCanvas.requestFocus();
   }
   
        
   private class MouseControl extends MouseAdapter{
      @Override
      public void mousePressed(MouseEvent e) {
    	  if(e.getButton() == MouseEvent.BUTTON1){
	    	  if(gegenstandMenubool ){
	    		  short s = gegenstandMenu.clickCheck(e.getX(), e.getY());
	    		  if(s == 0){
	    			  gegenstaende.getLastClicked().see();
	    		  } else if(s == 1){
	    			  gegenstaende.getLastClicked().speak();
	    		  } else if(s == 2){
	    			  gegenstaende.getLastClicked().touch();
	    		  }
	    		  gegenstandMenubool = false;
	    		  gegenstandMenu = null;
	    	  }else if(gegenstaende.clickCheckAll(e.getX(), e.getY())){
	    		  gegenstandMenubool = true;
	    	  }
	    	  
	    	  if(mode == 2){
	    		  itemKiste.clickCheckAll(e.getX(), e.getY());
	    	  }
	    	  pressed1 = true;
    	  } else if(e.getButton() == MouseEvent.BUTTON3){
    		  pressed2 = true;
    	  }
    	  
      }
      
      @Override
      public void mouseReleased(MouseEvent e) {
    	  System.out.println("MAUS R: " + e);
    	  pressed1 = false;
    	  pressed2= false;
      }
      
      @Override
      public void mouseMoved(MouseEvent e) {
    	  mouseX = e.getX();
   	 	  mouseY = e.getY();
   	 	  if(gegenstandMenubool){
   	 		  gegenstandMenu.mouseCheck(mouseX, mouseY);
   	 	  }
   	 	  if(mode == 2){
   	 		  itemKiste.setMouse(mouseX, mouseY);
   	 	  }
      }
      
   }
   
   long desiredFPS = 60;
   long desiredDeltaLoop = (1000*1000*1000)/desiredFPS;
    
   boolean running = true;
   
   private double x = STARTX;
   private double y = STARTY;
   
   public void run(){
      
      long beginLoopTime;
      long endLoopTime;
      long currentUpdateTime = System.nanoTime();
      long lastUpdateTime;
      long deltaLoop;
      
      try {
		    playerIMG = ImageIO.read(Main.class.getResourceAsStream("figur.png"));
		    bg0IMG = ImageIO.read(Main.class.getResourceAsStream("bg0.png"));
		    bg1IMG = ImageIO.read(Main.class.getResourceAsStream("bg1.png"));
		    bg2IMG = ImageIO.read(Main.class.getResourceAsStream("bg2.png"));
		    bg3IMG = ImageIO.read(Main.class.getResourceAsStream("bg3.png"));
		    bg4IMG = ImageIO.read(Main.class.getResourceAsStream("bg4.png"));
		} catch (IOException e) {	}
     

      while(running){
         beginLoopTime = System.nanoTime();
         
         render();
         
         
         lastUpdateTime = currentUpdateTime;
         currentUpdateTime = System.nanoTime();
         update((int) ((currentUpdateTime - lastUpdateTime)/(1000*1000)));
         
         endLoopTime = System.nanoTime();
         deltaLoop = endLoopTime - beginLoopTime;
           
           if(deltaLoop > desiredDeltaLoop){
               //Do nothing. We are already late.
           }else{
               try{
                   Thread.sleep((desiredDeltaLoop - deltaLoop)/(1000*1000));
               }catch(InterruptedException e){
                   //Do nothing
               }
           }
      }
   }
   
   private void render() {
      Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
      
      g.clearRect(0, 0, WIDTH, HEIGHT);
      render(g);
      g.dispose();
      bufferStrategy.show();
   }
   
   
   /**
    * Modus 0 = Menu	Es wird geschaut, ob der Spiel start Button geklickt wird
    * Modus 1 = Spiel	Es wird die Mausposition betrachtet und Klicks aktualisiert
    * Modus 2 = Gegenstadn Menu 	
    */
   
   protected void update(int deltaTime){
	   
	   switch(mode){
		   case 0:{
			   if(mouseX >= 220 && mouseX <= 420 && mouseY >= 100 && mouseY <= 200){
				   if(pressed1){
					   
				   
				   mode = 1;
				   mouseX = STARTX;
				   mouseY = STARTY;
				   }
			   }
		   }break;
		   
		   case 1:{
			   if(pressed1){
				   dX = mouseX;
				   dY = mouseY;
			   }
			   if(pressed2){
				   mode = 2;
				   pressed2 = false;
			   }
			   laufen();
			   
		   } break;
		   
		   case 2:{
			   if(pressed2){
				   mode = 1;
				   pressed2 = false;
			   }
		   } break;
		   
		   default: break;
	   }
	   
	   
   }
   
   
   /**
    * Modus 0 = Menu
    * Modus 1 = Spiel
    * 			Zuerst wird der Hintergrund gemalt, dann die Gegenstände, und dann der Spieler
    * 			Wenn auf ein Gegenstand geklickt wurde, wird das Gegenstadn Menu gezeichnet
    * Modus 2 = Gegenstadn Menu 
    */
   protected void render(Graphics2D g){
	   
	   switch(mode){
		   case 0:{
			   menu.draw(g);
		   } break;
		   	
		   case 1:{
			   switch(level){
			   case 1:{
				   g.drawImage(bg1IMG, 0, 0, null);
			   } break;
			   
			   case 2:{
				   
				   g.drawImage(bg2IMG, 0, 0, null);
			   } break;
			   
			   case 3:{
				   g.drawImage(bg3IMG, 0, 0, null);
			   } break;
			   
			   case 4:{
				   g.drawImage(bg4IMG, 0, 0, null);
			   } break;
			   
			   default: g.drawImage(bg0IMG, 0, 0, null); break;
			   } 

			   gegenstaende.draw(g);
			   g.drawImage(playerIMG, (int)x - 30, (int)y - 120, null);			   
			   
			   if(gegenstandMenubool){
				   int xM = mouseX;
				   int yM = mouseY;
				   if(xM <= 0){
					   xM = 1;
				   }
				   if(yM <= 0){
					   yM = 1;
				   }
				   if(xM >= gameCanvas.getWidth()-150){
					   xM = gameCanvas.getWidth()-150;
				   }
				   if(yM >= gameCanvas.getHeight()-100){
					   yM = gameCanvas.getHeight()-100;
				   }
				   if(gegenstandMenu == null)
					   gegenstandMenu = new GegenstandMenu(xM, yM);
				   
				   gegenstandMenu.draw(g);
				   
			   }
			   
			   
		   }break;
		   
		   case 2:{
			   g.drawImage(bg1IMG, 0, 0, null);
			   itemKiste.draw(g);
		   }break;
		   
		   default: break;
	   }
   }
   
   public void laufen(){
	   if(x > dX){
		   x--;
	   } else if(x < dX) {
		   x++;
	   }
	   
	   if(y > dY && y >= 350){
		   y--;
	   } else if(y < dY){
		   y++;
	   }

	   if(x >= frame.getWidth()-25){
		   level ++;
		   x = 30;
		   mouseX = 30;
		   dX = 30;
		   gegenstaende.level(level);
	   } else if(x <= 25){
		   level --;
		   x = frame.getWidth() -30;
		   mouseX = frame.getWidth() -30;
		   dX = frame.getWidth() -30;
		   gegenstaende.level(level);
	   }
   }
   
   public boolean mousePressed(){
	   return pressed1;
   }
   
   public static void main(String [] args){
      Main ex = new Main();
      new Thread(ex).start();
   }

}
Java:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * 
 * Die Liste, die alle Items enthält und checkt
 *
 */
public class ItemKiste {

	private List<Item> itemListe;
	private BufferedImage mainImg, buttonImg, selectImg;
	private Item lastClicked;
	private int mouseX, mouseY, indexLastClicked, buttonY, buttonX;
	
	
	public ItemKiste(){
		itemListe = new ArrayList<Item>();
		mouseX = 0;
		mouseY = 0;

		
		indexLastClicked = -1;
		
		try {
		    mainImg = ImageIO.read(Menu.class.getResourceAsStream("itemKiste.png"));
		    buttonImg = ImageIO.read(Menu.class.getResourceAsStream("benutzen.png"));
		    selectImg = ImageIO.read(Menu.class.getResourceAsStream("selectItem.png"));
		} catch (IOException e) {	}
		
		buttonX = mainImg.getWidth() - 223;
		buttonY = mainImg.getHeight() - 55;
		
	}
	
	
	
	public void addToList(Item i){
		itemListe.add(i);
	}
	
	public void removeList(int i){
		itemListe.remove(i);
	}
	
	public void setMouse(int mX, int mY){
		mouseX = mX;
		mouseY = mY;
	}
	
	/**
	 * Es wird geschaut, ob ein Item angeklickt wurde
	 * 
	 */
	
	public void clickCheckAll(int mX, int mY){
		for(int i = 0; i< itemListe.size(); i++){
			Item g = (Item) itemListe.get(i);
			if(g.clickCheck(mX, mY)){
				lastClicked = g;
				indexLastClicked = i;
				
			}
		}
		
		if(mouseX > buttonX && mouseY > buttonY && mouseX < buttonX + buttonImg.getWidth() && mouseY < buttonY + 50){
			System.out.println("BUTTON!!");
		}
	}
	
	/**
	 * Es werden die Items und Button gemalt
	 * 
	 */
	public void draw(Graphics g){
		int x = 50;
		int y = 50;
		
		int yB = 50;
		
		if(mouseX > buttonX && mouseY > buttonY && mouseX < buttonX + buttonImg.getWidth() && mouseY < buttonY + 50){
			yB = 0;
		} 
		
		g.drawImage(mainImg, 0, 0, null);
		g.drawImage(buttonImg.getSubimage(0, yB, 173, 50), buttonX, buttonY, null);
		
		for(int i = 0; i<itemListe.size(); i++){
			if(i == indexLastClicked){
				g.drawImage(selectImg, x, y, null);
			}
			itemListe.get(i).setPosition(x,y);
			itemListe.get(i).draw(g);
			if(x+150<= mainImg.getWidth()){ 
				x += 60;
			} else{
				x = 50;
				y += 60;
			}
		}
	}
}
Java:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;


public class Item {
private BufferedImage mainImg;
private int x, y;

	
	
	public Item(){
		x = 0;
		y = 0;
		try {
		    mainImg = ImageIO.read(Menu.class.getResourceAsStream("Stein.png"));
		} catch (IOException e) {	}
		
	}
	
	public boolean clickCheck(int mX, int mY){
		if(mX >= x && mX <= x + mainImg.getWidth() && mY >= y && mY <= y + mainImg.getHeight()){
			return true;
		} else {
			return false;
		}
	}
	
	public BufferedImage getImg(){
		return mainImg;
	}
	
	public void draw(Graphics g){
		g.drawImage(mainImg, x, y, null);
	}
	
	public void setPosition(int xP, int yP){
		x = xP;
		y = yP;
	}
}
 

Anhänge

  • Adventure_Test.zip
    217 KB · Aufrufe: 5
Zuletzt bearbeitet:

Androbin

Bekanntes Mitglied
Ich hoffe jetzt natürlich, dass ihr mir weiter helfen könnt, und wenn es irgendwas, wegen unsauberem programmieren zu beanstanden gibt (wahrscheinlich genug...), könnt ihr das auch gerne schreiben.
Also, dein Code ist eigentlich "ganz OK", aber deine Art ( und Weise ), wie du zeichnest, ist für mich "Augen-Krebs-verdächtig" :autsch:
Aber keine Sorge, mir ist das auch mal so gegangen : :oops:
Zitat von "JCODA" vom 11.04.2014, 21:52 :
Wow.

Seit dem Betreiberwechsel hat die Qualität echt abgenommen hier im JFO!

LEUTE!

hier wird g = getGraphics();

verwendet!

es wird die paint(Graphics g) von einem JFrame! überschrieben (und das ohne! super.paint(g) Aufruf!)

und ihr ratet ihm ehrlich zu Doublebuffering?! (das nebenbei in Swing AUTOMATISCH verhanden ist, wenn man Swing richtig benutzen würde...)

Tipp:

- überschreibe nicht die paint von einem Container, sondern nimm ein JPanel und überschreibe dort die paintComponent(..)
- benutze niemals getGraphics() auf einer Component!
- rufe jedesmal zuallererst die super-methode in einer paint()/paintComponent() auf.
- rufe nicht g.dispose(); in der von JFrame/JPanel paint/paintcomponent-Methoden auf.
Auch, wenn vielleicht nicht alles auf dich zutrifft, hoffe ich, das hilft auch dir weiter :toll:
 

MrXYF

Mitglied
Ok, danke schonmal, dann werd ich mir mal das Grafik Zeug besser anschauen :D
Kannst du mir vielleicht sagen, was ich da im genauen ändern sollte, z.B. immer erst die super-methode aufrufen ;)
 
Zuletzt bearbeitet:

Androbin

Bekanntes Mitglied
Am besten, du schreibst dich gleich mit meinem "Mentor" JCODA zusammen :idea:
Am besten über "TeamSpeak", Server-Adresse: 78.46.221.121:11802 Allerdings ist er selten erreichbar :bahnhof:

Aber wenn du wieder mal Hilfe brauchst, in Sachen grafischer Oberfläche, bin ich auch ein guter Ansprechpartner; ich mache sowieso nichts anderes, als Spiele :applaus:
Aber könntest du mir mal genauer sagen, was du nicht verstehst; ich finde es eigentlich ziemlich gut erklärt :rtfm:

PS. deine Klasse "Gegenstaende" sollte lieber "Gegenstand" heißen :toll:
PPS. Mit Polymorphie hast du es auch nicht so, oder :autsch:
 
Zuletzt bearbeitet:

MrXYF

Mitglied
Mhhh... Ich weiß selber grad nicht so, was ich nicht verstehe, ich steh glaub ich grad auf der Leitung :noe:
Vielleicht kannst du mir ein Beispiel nennen, was in meinem Code falsch/ungut ist :)
Wegen deinem Mentor, das wäre natürlich cool, aber ich schau erstmal, ob ich es selber hinbekomme, wenn ich jetzt aber total verzweifle, meld ich mich mal :toll:
Und Polymorphie... ja, es sagt mir was, aber wieso meinst du, ich habs damit nich so drauf?
Ich benutze es halt dafür, dass jede Unterklasse die gleichen Methoden hat :D
 

Androbin

Bekanntes Mitglied
... Vielleicht kannst du mir ein Beispiel nennen, was in meinem Code falsch/ungut ist ...
Da wäre
Java:
g.clearRect(0, 0, WIDTH, HEIGHT) // unnötig ( repaint() )
...
g.dispose(); // siehe Zitat von JCODA
und anstatt
Java:
private BufferedImage bg0IMG, bg1IMG, bg2IMG, bg3IMG, bg4IMG, playerIMG;
wäre besser
Java:
private HashMap<String, BufferedImage> images = new HashMap<String, BufferedImage>()
Die Klasse "Menu" und "GegenstandMenu" könntest du von JPanel ableiten :toll:
Die Klasse "Gegenstaende" in "Gegenstand" umbenennen und :bloed:
Die Klasse "Figur" o. ä., wie (Item)Kiste von einer neuen (abstrakten) Klasse "Sprite" ableiten, sowie :idea:
Die Klasse "ItemKiste" von "Kiste" ableiten, soweit möglich, falls nicht: :(
 
Zuletzt bearbeitet:

MrXYF

Mitglied
Ok gut, dann werd ich mich mal drüber stürzen :D
Ich hab das Render Zeug wo anders abgeschaut, aber wenn des so schlecht ist, dann werd ich das mal umschreiben :autsch:
Gegenstaende is wohl besser, wenn ich umbennene :toll:
Das mit Sprite hab ich mir auch schon überlegt, werd ich jetzt auch machen :applaus:
 

Androbin

Bekanntes Mitglied
So eine Sprite Klasse hab ich mir erst vor Kurzem selbst gemacht :toll:
Java:
package de.androbin.lib.games;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashMap;
import javax.imageio.ImageIO;
import com.sun.xml.internal.ws.api.ResourceLoader;

public class Sprite extends Rectangle2D.Double {
	
	// Deklarationen
	
	private static final long serialVersionUID = 1L;
	
	protected double x = 0, y = 0, width = 0, height = 0;
	protected HashMap  <Integer, BufferedImage> tiles     = new HashMap  <Integer, BufferedImage>();
	protected ArrayList<         BufferedImage> animation = new ArrayList<         BufferedImage>();
	protected int pic = 0, animpic = 0;
	
	protected AnimationLib animationlib = new AnimationLib();
	protected     SoundLib     soundlib = new SoundLib    ();
	
	protected boolean playAnimation = false;	
	protected boolean remove = false;
	
	// Konstruktoren
	
	public Sprite() { }
	
	public Sprite( String url, double x, double y, double width, double height ) {
		
		this.x = x; this.y = y; this.width = width; this.height = height;
		
		for ( int i = 0; i != -1; i++ ) { try { tiles.put( i, ImageIO.read( ResourceLoader.class.getResource( url + i + ".png" ) ) ); } catch ( Exception e ) { i = -1; } }
		
	}
	
	public Sprite( HashMap<Integer, BufferedImage> tiles, double x, double y, double width, double height ) { this.tiles = tiles; this.x = x; this.y = y; this.width= width; this.height = height; }
	
	public Sprite( ArrayList<BufferedImage> animation, double x, double y, double width, double height ) { this.animation = animation; this.x = x; this.y = y; this.width = width; this.height = height; }
	
	public Sprite( String url, Sprite parent ) { this( url, parent.x, parent.y, parent.width, parent.height ); }
	
	// Methoden
	
	@ Override
	public void paintComponent( Graphics g ) {
		
		Graphics2D g2 = (Graphics2D) g;
		
		if ( pic >=  tiles.size() ) pic = 0;
		g2.drawImage( tiles.get( pic++ ), (int) x, (int) y, (int) width, (int) height, null );
		
		if ( animpic == -1 || playAnimation ) {
			
			if ( animpic == -1 ) { animpic = 0; playAnimation = true; }
			
			if ( animpic >=  animation.size() ) { animpic = 0; playAnimation = false; animation.clear(); return; }
			g2.drawImage( animation.get( animpic++ ), (int) x, (int) y, (int) width, (int) height, null );
			
		}
		
	}
	
	public static Rectangle2D.Double getSubRec( Rectangle2D.Double source, Rectangle2D.Double part ) {
		
		Rectangle2D.Double sub = new Rectangle2D.Double();
		
		if ( source.x > part.x ) sub.x = 0;
		else sub.x = part.x - source.x;
		
		if( source.y > part.y ) sub.y = 0;
		else sub.y = part.y - source.y;
		
		sub.width = part.width;
		sub.height = part.height;
		
		return sub;
	}
	
	public static boolean isOpaque( int rgb ) { return !( ( ( rgb >> 24 ) & 0xff ) == 0 ); }
	
	@Override
	public boolean checkCollision( Sprite s ) {
		
		Rectangle2D.Double cut = (Double) this.createIntersection( s );
		
		if ( ( cut.width < 1 ) || ( cut.height < 1 ) ) return false;
		
		Rectangle2D.Double sub_me  = getSubRec( this, cut );
		Rectangle2D.Double sub_him = getSubRec( s   , cut );
		
		BufferedImage img_me  =   tiles.get(   pic ).getSubimage( (int) sub_me .x, (int) sub_me .y, (int) sub_me .width, (int) sub_me .height );
		BufferedImage img_him = s.tiles.get( s.pic ).getSubimage( (int) sub_him.x, (int) sub_him.y, (int) sub_him.width, (int) sub_him.height );
		
		for ( int x = 0; x < img_me.getWidth(); x++ ) {
			
			for ( int y = 0; y < img_him.getHeight(); y++ ) {
				
				int rgb1 = img_me .getRGB( x, y );
				int rgb2 = img_him.getRGB( x, y );
				
				if ( isOpaque( rgb1 ) && isOpaque( rgb2 ) ) { return true; }
				
			}
			
		}
		
		return false;
		
	}
	
	@ Override
	public void moveTo( Direction dir ) {
		
		switch ( dir ) {
			
			default : return;
			
			case Up        :      y--; return;
			case Down      :      y++; return;
			case Left      : x--;      return;
			case Right     : x++;      return;
			
			case UpLeft    : x--; y--; return;
			case UpRight   : x++; y--; return;
			case DownLeft  : x--; y++; return;
			case DownRight : x++; y++; return;
			
		}
		
	}
	
	@ Override
	public void moveTo( double x, double y ) { this.x = x; this.y = y; }
	
	protected void playAnimation( ArrayList<BufferedImage> animation ) { this.animation = animation; animpic = -1;; }
	
	protected void loadSound( String name, String path ) { soundlib.loadSound( name, path ); }
	protected void playSound( String name              ) { soundlib.playSound( name       ); }
	
	protected boolean  remove() { return remove       ; }
	protected void    destroy() {        remove = true; }
	
	protected void explode() { playAnimation( animationlib.getAnimation( "explosion" ) ); destroy(); }
	
}
PS. Ich würde mich freuen, diese ausarbeiten zu dürfen :idea:
PPS. Diese Klasse ist Teil einer [STRIKE]größeren[/STRIKE] kleineren Bibliothek, welche ich mir angelegt habe :oops:
 

MrXYF

Mitglied
Cool, ich werd mir n bisschen was abschauen, aber meine wird wahrscheinlich kleiner :D
Das Problem mit dem Absturz hab ich leider immernoch... Da weißt du nicht zufällig was? ;(
 

Androbin

Bekanntes Mitglied
... Cool, ich werd mir n bisschen was abschauen, aber meine wird wahrscheinlich kleiner ...
Klasse :);):D
... Das Problem mit dem Absturz hab ich leider immer noch... Da weißt du nicht zufällig was? ...
Also, als ich es getestet habe, ist es (noch) nicht abgestürzt :bahnhof:
Könntest du mir also sagen, in welcher Klasse und Zeile der Rechtsklick angenommen wird :question:
 

MrXYF

Mitglied
Also, als ich es getestet habe, ist es (noch) nicht abgestürzt :bahnhof:
Könntest du mir also sagen, in welcher Klasse und Zeile der Rechtsklick angenommen wird :question:

Mhh komisch, du musst in dem Gegenstand Menu (ItemMenu.java, hab mich mit den Namen vertan, werd das aber sowieso nochmal übersichtlicher ordnen und umbennenen :D) mehrmals links klicken.
Der Maus Code sieht so aus:

Java:
public void mousePressed(MouseEvent e) {
    	  if(e.getButton() == MouseEvent.BUTTON1){
	    	  if(gegenstandMenubool ){
	    		  short s = gegenstandMenu.clickCheck(e.getX(), e.getY());
	    		  if(s == 0){
	    			  gegenstaende.getLastClicked().see();
	    		  } else if(s == 1){
	    			  gegenstaende.getLastClicked().speak();
	    		  } else if(s == 2){
	    			  gegenstaende.getLastClicked().touch();
	    		  }
	    		  gegenstandMenubool = false;
	    		  gegenstandMenu = null;
	    	  }else if(gegenstaende.clickCheckAll(e.getX(), e.getY())){
	    		  gegenstandMenubool = true;
	    	  }
	    	  
	    	  if(mode == 2){
	    		  itemMenu.clickCheckAll(e.getX(), e.getY());
	    	  }
	    	  pressed1 = true;
    	  } else if(e.getButton() == MouseEvent.BUTTON3){
    		  pressed2 = true;
    	  }
    	  
      }
 

Androbin

Bekanntes Mitglied
Java:
...
if ( e.getButton() == MouseEvent.BUTTON1 ) { // Zeile 2
...
} else if ( e.getButton() == MouseEvent.BUTTON3 ) { // Zeile 22
...
Es ist doch immer das gleiche 8
[TIPP]
Verwende nur bei Primitiven Datentypen "==" zum Vergleich
Verwende bei Objekten die Methode "equals" der Klasse Object
[/TIPP]
Java:
if ( s == 0 ) { // Zeile 5 - 11
	
	gegenstaende.getLastClicked().see();
	
} else if ( s == 1 ) {
	
	gegenstaende.getLastClicked().speak();
	
} else if ( s == 2 ) {
	
	gegenstaende.getLastClicked().touch();
	
}
Wieso verwendet eigentlich niemand switches 8
Java:
switch ( s ) {
	
	case 0 :
		
		gegenstaende.getLastClicked().see();
		break;
		
	case 1 :
		
		gegenstaende.getLastClicked().speak();
		break;
		
	case 2 :
		
		gegenstaende.getLastClicked().touch();
		break;
		
}
[TIPP]
Verwende die Methode "if" ausschließlich bei einzelnen Abfragen
Verwende die Methode "switch" bei Abfragen zur einer einzigen Variable
[/TIPP]
[OT]
Daumen sind hilfreich,
ob zum Festhalten,
zur positiven Bewertung, oder
zur negativen Kritik
[/OT]
 
Zuletzt bearbeitet:

MrXYF

Mitglied
Leider noch nicht viel, ich hatte in den letzten Tagen fast keine Zeit ;(
Ich werd jetzt am Wochenende hoffentlich dazu kommen... ;)
 

MrXYF

Mitglied
Also ich hab mich jetzt mal drüber gemacht :)
Dabei hab ich jetzt mal alles n bisschen umgeschrieben, und n Game State Manager rein gepackt, ist einfach übersichtlicher :D

Die Draw "Art", wie ich sie benutze, hab ich jetzt schon öfter mal gesehen, wieso ist es denn so falsch, es funktioniert ja eigentlich? :autsch:

Bei e.getButton(), wie soll ich da mit equals machen? Eigentlich sind es ja nur zwei Integer die ich vergleiche :bahnhof:

Naja, ich werd mal noch n bisschen weiter machen, denn jetzt gibts keine Abstürze mehr :D
 

Anhänge

  • Adventure_Test.zip
    223,6 KB · Aufrufe: 1

Androbin

Bekanntes Mitglied
Dabei hab ich jetzt mal alles n bisschen umgeschrieben, und n Game State Manager rein gepackt, ist einfach übersichtlicher :D
Gut, stell's doch gleich mal rein :popcorn: Ich empfehle die Möglichkeit, MediaFire zu nutzen :rtfm:
Die Draw "Art", wie ich sie benutze, hab ich jetzt schon öfter mal gesehen, wieso ist es denn so falsch, es funktioniert ja eigentlich? :autsch:
Ja, in diesem Fall der Fälle schon, aber es geht ums Prinzip :pueh:
Bei e.getButton(), wie soll ich da mit equals machen? Eigentlich sind es ja nur zwei Integer die ich vergleiche :bahnhof:
Sorry, hab gedacht, das wäre die actionPerformed und da stünde e.getSource() :oops:
Naja, ich werd mal noch n bisschen weiter machen, denn jetzt gibts keine Abstürze mehr :D
Schön zu hören :toll: Was haste denn geändert :reflect:
 

MrXYF

Mitglied
Gut, stell's doch gleich mal rein :popcorn: Ich empfehle die Möglichkeit, MediaFire zu nutzen :rtfm:
Habs bei Post vorher mit im Anhang ;)

Ja, in diesem Fall der Fälle schon, aber es geht ums Prinzip :pueh:
Ok gut, war mir bloß nicht sicher :bae:

Schön zu hören :toll: Was haste denn geändert :reflect:
Naja, ich habs einfach besser strukturiert, ich weiß leider nicht, was der Fehler war, aber ich glaube, dass es einfach unsauber war, und dann irgendwas gecrasht is :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Programmierung eines 2.5D Point&Click Adventures ohne Spieleengine machbar? Spiele- und Multimedia-Programmierung 14
Developer_X 3D Point rotieren lassen Spiele- und Multimedia-Programmierung 17
Developer_X Java3D Point Sound Spiele- und Multimedia-Programmierung 71
K Click innerhalb eines 45° gekippten Rechtecks Spiele- und Multimedia-Programmierung 9
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben