[Sammelthread] Fragen zu Quaxlis Tutorial Teil 1

CelticWolf

Mitglied
Hallo Kaffeeliebhaber!
Da ich gesehen habe, dass schon einige User Quaxlis Tutorial durchgearbeitet haben und einige auf Probleme gestossen sind, dachte ich, ich eröffne ein Thema indem alle Fragen zum ersten Tutorial gebündelt werden.

Jeder kann hier Fragen stellen und jeder kann antworten :toll:
 
So nun zu meiner Frage:

Ich hab den ersten Teil von Quaxlis Tutorial durchgearbeitet und es funktionierte einwandfrei. Dann habe ich ein paar grafische Elemente eingebaut und auch dies ohne Fehlermeldungen.
Doch plötzlich hat es mir den kompletten Inhalt des Bin Ordners gelöscht. Deshalb habe ich die Grafiken die nicht doppelt gesichert waren neu erstellt und ein neues Javaprojekt erstellt mit allen Klassen. Den Inhalt der Klassen habe ich aus den JAVA Dateien des src Ordners übernommen und abgespeichert (wobei auch die Class Datei entstanden ist).
Doch beim Starten kommt nun folgende Meldung:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The constructor Rockleft(BufferedImage[], int, int, int, GamePanel) is undefined
The method add(Sprite) in the type Vector<Sprite> is not applicable for the arguments (Rockleft)
The constructor Rockleft(BufferedImage[], int, int, int, GamePanel) is undefined
The method add(Sprite) in the type Vector<Sprite> is not applicable for the arguments (Rockleft)
The constructor Rockleft(BufferedImage[], int, int, int, GamePanel) is undefined
The method add(Sprite) in the type Vector<Sprite> is not applicable for the arguments (Rockleft)
The constructor Rockleft(BufferedImage[], int, int, int, GamePanel) is undefined
The method add(Sprite) in the type Vector<Sprite> is not applicable for the arguments (Rockleft)

at GamePanel.Background1(GamePanel.java:133)
at GamePanel.doInitializations(GamePanel.java:86)
at GamePanel.<init>(GamePanel.java:66)
at GamePanel.main(GamePanel.java:49)


Könnt ihr mir sagen worin das Problem liegt??



hier der Quellcode der main Klasse:
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;



public class GamePanel extends JPanel implements Runnable, KeyListener, ActionListener{	
	private static final long serialVersionUID = 1L;
	boolean game_running = true;
	boolean started = false;
	boolean once = false;
	
	long delta = 0;
	long last = 0;
	long fps = 0;
	long gameover = 0;
	
	
	long timepass;
	int level = 1;
	int rdel = 1500;
	int x = 1;
	
	Heli copter;
	Vector<Sprite> actors;
	
	boolean up		= false;
	boolean down	= false;
	boolean left	= false;
	boolean right	= false;
	int speed = 400;
	
	Timer timer;
	Timer rtime;
	BufferedImage[] rocket;
	BufferedImage background;
	BufferedImage[] explosion;
	
	
	
	SoundLib slib;
	
	public static void main(String[] args){
		new GamePanel(1000,600);
	}
	
	
	
public GamePanel(int w, int h)
	{
		this.setPreferredSize(new Dimension(970, 570));
		this.setBackground(Color.DARK_GRAY);
		JFrame frame = new JFrame("GameDemo");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addKeyListener(this);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		frame.setResizable(false);
		doInitializations();
	}
	
	private void doInitializations(){
		
		BufferedImage[] heli = this.loadPics("pics/jet.png", 4);
		rocket = loadPics("pics/rocket2.png",8);
		background = loadPics("pics/background.jpeg",1)[0];
		explosion = loadPics("Pics/explosion.gif",5);
		
		slib = new SoundLib();
		slib.loadSound("heli","sound/heli.wav");
		slib.loadSound("bumm","sound/boom.wav");
		slib.loadSound("rocket", "sound/rocket_start.wav");
		
		
		last = System.nanoTime();
		gameover = 0;
		
		actors = new Vector<Sprite>();
		Background1();
		
		copter = new Heli(heli,400,300,100,this);
		actors.add(copter);
		
		if(isStarted()){
			slib.loopSound("heli");
		}
		
		
		createClouds();
		
		
		
		timer = new Timer(3000,this);
		timer.start();
		
		rtime = new Timer(10000,this);
		rtime.start();
		
		if(!once){
			once = true;
			Thread t = new Thread(this);
			t.start();
		}
	}
	
	
	private void createClouds(){
		
		BufferedImage[] ci = this.loadPics("pics/cloudr.png", 1);
	
		for(int y=10;y<getHeight();y+=50){
			int x = (int)(Math.random()*getWidth());
			Cloud cloud = new Cloud(ci,x,y,1000,this);
			actors.add(cloud);
		}
	
	}

private void Background1(){
		
		BufferedImage[] bg1 = this.loadPics("pics/Cityraw.jpg", 1);
		
		int x = 0;
		int y = 0;
		
		Rockleft rokl = new Rockleft(bg1,x,y,1000,this);
		
		actors.add(rokl);
		
		
		Rockleft rokl2 = new Rockleft(bg1,x+1594,y,1000,this);
		
		actors.add(rokl2);
		
		Rockleft rokl3 = new Rockleft(bg1,x+3188,y,1000,this);
		
		actors.add(rokl3);
		
		Rockleft rokl4 = new Rockleft(bg1,x+4782,y,1000,this);
		
		actors.add(rokl4);
		
	}
/*private void RockDown(){
		
		BufferedImage[] rd = this.loadPics("pics/Rockdown.png", 1);
		
		int x = 200;
		int y = 0;
		
		Rockleft2 rokd = new Rockleft2(rd,x,y,1000,this);
		
		actors.add(rokd);
		
}*/
	
	public void createExplosion(int x, int y){
		
		Explosion ex = new Explosion(explosion,x,y,100,this);
		actors.add(ex);
		slib.playSound("bumm");
		
		
	}
	

	
	public void run(){
		
		while(game_running){
			
			computeDelta();
			if(isStarted()){
			checkKeys();
			doLogic();
			moveObjects();
			
			
			}
			
			repaint ();
			
			try {
				Thread.sleep(10);
			}catch (InterruptedException e) {}
		
		}
	}

	private void checkKeys(){
		
		if(up){
			copter.setVerticalSpeed(-speed);
		}
		
		if(down){
			copter.setVerticalSpeed(speed);
		}
		
		if(right){
			copter.setHorizontalSpeed(speed);
		}
		
		if(left){
			copter.setHorizontalSpeed(-speed);
		}
		
		if(!up&&!down){
			copter.setVerticalSpeed(0);
		}
		
		if(!left&&!right){
			copter.setHorizontalSpeed(0);
		}
	}
	
	private void doLogic(){
		
Vector<Sprite> trash = new Vector<Sprite>();
		
	/*	for(Movable mov:actors){
			mov.doLogic(delta);
			Sprite check = (Sprite)mov;
			if(check.remove){
				trash.add(check);
			}
		}

		*/
for(int i=0;i<actors.size() ; i++) { 
	actors.get(i).doLogic(delta);
	Sprite check = (Sprite)actors.get(i);
	if(check.remove){
		trash.add(check);
	}
	}


		
		for(int i = 0;i < actors.size();i++){
      for(int n = i+1; n<actors.size(); n++){
    
         Sprite s1 = actors.elementAt(i);
         Sprite s2 = actors.elementAt(n);
         
         s1.collidedWith(s2);
				
			}
			
		}
		
		if(trash.size()>0){
			for(Sprite s: trash){
				actors.remove(s);
			}
		}
		if(gameover>0){
			
			
			if(System.currentTimeMillis()-gameover>3000){
				stopGame();
			}
		}
		
	}
	
	private void stopGame(){
		timer.stop();
		rtime.stop();
		slib.stopLoopingSound();
		setStarted(false);
		
	}

	private void moveObjects(){
		/*for(Movable mov:actors){
			mov.move(delta);
			}
		*/
		
		for(int i=0;i<actors.size() ; i++) {  
			actors.get(i).move(delta);     
			}
		
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.drawImage(background, 0, 0, this);
		
		
		if(!isStarted()){
			return;
		}
		
		if(actors !=null){
			/*for(Drawable draw:actors){
				draw.drawObjects(g);
			} */
			
			for(int i=0;i<actors.size();i++){
				actors.get(i).drawObjects(g);
			}
			
			
		}
		
		
		g.setColor(Color.DARK_GRAY);
		g.setFont( new Font( "Trebuchet MS", Font.BOLD, 14 ) );
		g.drawString("FPS: " + Long.toString(fps), 20, 10);
		g.drawString("Level  " + level, 850, 10);
	}
	
	private void computeDelta(){
		
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		
		fps = ((long) 1e9)/delta;
	}
	
	
	private BufferedImage[] loadPics(String path, int pics){
		
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL pic_url = getClass().getClassLoader().getResource(path);
		
		try{
			source = ImageIO.read(pic_url);
			} catch (IOException e) {}
			
			for(int x=0;x<pics;x++){
				anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, 
						source.getWidth()/pics, source.getHeight());
			}
			
			return anim;
	}
	
	public boolean isStarted() {
		return started;
	}
	
	public void setStarted(boolean started) {
		this.started = started;
	}


	
private void createRocket(){
		
		int x = 0;
		int y = (int)(Math.random()*getHeight());
		int hori = (int)(Math.random()*2);
		
		if(hori==0){
			x = -30;
		}else{
			x = getWidth()+30;
		}
		
		
		Rocket rock = new Rocket(rocket,x,y,100,this);
		if(x<0){
			rock.setHorizontalSpeed(500);
		}else{
			rock.setHorizontalSpeed(-700);
		}
		actors.add(rock);
		//slib.playSound("rocket");
		
	}




	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up		=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down	=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left	=	true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}

	}
	
	
	
	public void keyTyped(KeyEvent e) {
		
	
		
	}


	public void keyReleased(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up		=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right	=	false;
		}
		if(e.getKeyCode()==KeyEvent.VK_ENTER){
			if(!isStarted()){
				doInitializations();
				setStarted(true);
				level = 1;
			}
		}
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			if(isStarted()){
				stopGame();
			}else{
				setStarted(false);
				System.exit(0);
			}
		}
		
		
		}
	public void actionPerformed(ActionEvent e){
	
		if(isStarted() && e.getSource().equals(timer)){
			createRocket();
		}
		if(isStarted() && e.getSource().equals(rtime)){
			level++;
			timer.setDelay(3000/level);
		}
	
		
	}
	
	}

und die Rockleft Klasse:

Java:
import java.awt.RenderingHints.Key;
import java.awt.image.BufferedImage;



public class Rockleft extends Sprite{
	
	final double SPEED = 40;
	
	
	public Rockleft(BufferedImage[] i, double x, double y, long delay, GamePanel p) {
		super(i, x, y, delay, p);
		
			setHorizontalSpeed(-SPEED);
		
	}
	
	@Override
	public void doLogic(long delta) {
		super.doLogic(delta);
		
		if(getHorizontalSpeed()>0 && getX()>parent.getWidth() ){
			setX(getWidth());
		}
		
		if(getHorizontalSpeed()<0 && (getWidth()<0)){
			setX(parent.getWidth()+getWidth());
		}
	}

	@Override
	public boolean collidedWith(Sprite s) {
		// TODO Auto-generated method stub
		return false;
	}

	public void setRenderingHint(Key keyColorRendering, Object valueAntialiasOn) {
		// TODO Auto-generated method stub
		
	}

}

vielen Dank schon im vorraus
 
Das ist eine Fehlermeldung die darauf hindeutet, dass der Code nicht compilierbar ist. Mach ggf. mal sowas wie "Project -> Clean" oder so, und schau dort, wo die Fehlermeldungen auftauchen.
 
Naja, da Classdateien meißt erzeugt werden wenn an .java Dateien kompiliert würd ich mal ja sagen :E
 
Hi,

könnte es sein, dass Dir ein passender Constructor in der Klasse Rocketleft fehlt.

Der Compiler sagt doch, dass er einen Constructor mit
[Java]
Rockleft(BufferedImage[], int, int, int, GamePanel)
[/Java]
sucht. Du hast aber nur einen mit
[Java]
public Rockleft(BufferedImage[] i, double x, double y, long delay, GamePanel p)
[/Java]

Vielleicht ist es dass ja
Pat
 
Hi,

könnte es sein, dass Dir ein passender Constructor in der Klasse Rocketleft fehlt.

Der Compiler sagt doch, dass er einen Constructor mit
[Java]
Rockleft(BufferedImage[], int, int, int, GamePanel)
[/Java]
sucht. Du hast aber nur einen mit
[Java]
public Rockleft(BufferedImage[] i, double x, double y, long delay, GamePanel p)
[/Java]

Vielleicht ist es dass ja
Pat


Mein eigentliches Problem ist, dass ich nicht weiss wie ich die .class Dateien zurückbekomme. Wenn ich beim projekt auf Run drücke, dann kommt die Meldung: Could not find the main class: GamePanel. Program will exit.

gibt es den keine möglichkeit die Dateien zurückzubekommen ?
 
Hallo.
Ich habe das tutorial durchgearbeitet und so verändert, dass ich mit einem Jet den Raketen ausweichen muss.
Nun möchte ich das Game so modifizieren, dass der Jet auch schiessen kann.
Meine Idee ist, gleich wie bei der Zielverfolgung der RocketKlasse, ein Rechteck vor dem Jet zu erzeugen, welches das Schussfeld darstellt. Drückt man nun Space und befindet sich eine Rakete in diesem Schussfeld, wird sie zerstört.

nun habe ich eine Klasse Shot erstellt, welche das Rechteck definiert und auch dasselbe in der main Methode, doch ich krieg es nichtmal hin das Rechteck anzuzeigen, sofern ich es nicht in der Klasse Heli selbst definiere.

kan mir einer sagen was in die main Klasse, was in die Sprite Klasse und was in die Shot klasse gehört damit man das Rechteck anzeigen kann um es mit den Raketen kollidieren zu lassen ??


dies ist die Shotklasse welche das Rechteck und die Kollisionen definieren soll.
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

public class Shot extends Sprite{

	Rectangle2D.Double shot;

	public Shot(Rectangle2D shot2, double x, double y, long delay, GamePanel p) {
		super(shot2, x, y, delay, p);
	}

	@Override
	public void doLogic(long delta) {
		super.doLogic(delta);
		
		shot = new Rectangle2D.Double(parent.copter.getX()+parent.copter.getWidth(),parent.copter.getY()+15,  
				parent.getWidth()-parent.copter.getX(),parent.copter.getHeight()-20); 
		
	
	}
	
	@Override   //shows shooting rect
	public void drawObjects(Graphics g){
		super.drawObjects(g);
		g.setColor(Color.green);
		g.drawRect((int)shot.x,(int)shot.y,(int)shot.width,(int)shot.height);
	
	
	}
	
	@Override
	public boolean collidedWith(Sprite s) {
		if(this.intersects(s)){
			System.out.println("Bääm");
			
			return true;
		}
		return false;
	}

}

dies ist die Methode Shootfield in der mainKlasse (den Rest der main Klasse findet man in der ersten Antwort dieses Themas)
[JAVA=140]private void Shootfield(){

shot = new Rectangle2D.Double(copter.getX()+copter.getWidth(),copter.getY()+15,
getWidth()-copter.getX(),copter.getHeight()-20);


int x = (int) copter.getX();
int y = (int) copter.getY();


Shot schuss = new Shot(shot,x,y,100,this);
actors.add(schuss);
}[/code]

und hier die Sprite klasse
Java:
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

public abstract class Sprite extends Rectangle2D.Double implements Drawable, Movable{

	long delay;
	long animation = 0;
	GamePanel parent;
	BufferedImage[] pics;
	int currentpic = 0;
	
	protected double dx;
  protected double dy;
	
	int loop_from;
	int loop_to;
	
	boolean remove = false;
  
	public Sprite(BufferedImage[] i, double x, double y, long delay, GamePanel p ){
		pics = i;
		this.x = x;
		this.y = y;
		this.delay = delay;
		this.width = pics[0].getWidth();
		this.height = pics[0].getHeight();
	  parent = p;
	  loop_from = 0;
	  loop_to = pics.length - 1;
	}
	

	

	public void drawObjects(Graphics g) {
		g.drawImage(pics[currentpic], (int) x, (int) y, null);
	}

	public void doLogic(long delta) {

		animation += (delta/1000000);
		if (animation > delay) {
			animation = 0;
			computeAnimation();
		}

	}

	public void move(long delta) {
		 
    if(dx!=0){
      x += dx*(delta/1e9);
    }
    
    if(dy!=0){
      y += dy*(delta/1e9);
    }

	}

	private void computeAnimation(){
    
		currentpic++;

    if(currentpic>loop_to){
        currentpic = loop_from;
    }
		
	}
	
	public abstract boolean collidedWith(Sprite s);
	
	public void setLoop(int from, int to){
		loop_from = from;
		loop_to   = to;
		currentpic = from;
	}
	
  public void setVerticalSpeed(double d) {
    dy = d;
  }

  public void setHorizontalSpeed(double d) {
    dx = d;
  }
  
  public double getVerticalSpeed(){
  	return dy;
  }
  
  public double getHorizontalSpeed(){
  	return dx;
  }
  
	public void setX(double i){
		x = i;
	}
	
	public void setY(double i){
		y = i;
	}
	
  public boolean checkOpaqueColorCollisions(Sprite s){
    
    Rectangle2D.Double cut = (Double) this.createIntersection(s);
    
    if((cut.width<1)||(cut.height<1)){
      return false;
    }
    
    // Rechtecke in Bezug auf die jeweiligen Images
    Rectangle2D.Double sub_me = getSubRec(this,cut);
    Rectangle2D.Double sub_him = getSubRec(s,cut);
    
    BufferedImage img_me = pics[currentpic].getSubimage((int)sub_me.x,(int)sub_me.y,
    													(int)sub_me.width,(int)sub_me.height);
    BufferedImage img_him = s.pics[s.currentpic].getSubimage((int)sub_him.x,(int)sub_him.y,
    													(int)sub_him.width,(int)sub_him.height);
    
    for(int i=0;i<img_me.getWidth();i++){
      for(int n=0;n<img_him.getHeight();n++){

        int rgb1 = img_me.getRGB(i,n); 
        int rgb2 = img_him.getRGB(i,n);

        
        if(isOpaque(rgb1)&&isOpaque(rgb2)){
          return true;
        }
        
      }
    }
    
    return false;
  }
  
  protected Rectangle2D.Double getSubRec(Rectangle2D.Double source, Rectangle2D.Double part) {
    
    //Rechtecke erzeugen
    Rectangle2D.Double sub = new Rectangle2D.Double();
    
    //get X - compared to the Rectangle
    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;
  }

  protected boolean isOpaque(int rgb) {

    int alpha = (rgb >> 24) & 0xff;  
    //red   = (rgb >> 16) & 0xff;  
    //green = (rgb >>  8) & 0xff;  
    //blue  = (rgb ) & 0xff;  
    
    if(alpha==0){
      return false;
    }

    return true;
    
  }
  
	
}
 

Neue Themen


Zurück
Oben