2020-04-15, 17:06
  #1
Medlem
Tjena! Har gymnasiearbete som jag hller p o fixa med en skut funktion p Java som jag ej fr och funka. Fr felmeddelande att konstruktorn e fel eller liknande p denna kod i PlayerEntity:
Kod:
	public boolean tryToFire(){
	    if(missile == null || !missile.getActive()){
	        missile = new ShotEntity(new ImageIcon(getClass().getResource("/rsz_shoot.png")).getImage(), x+13, y, 90);
	        missile.setActive(true);
	        return true;
	    }else
	        return false;
	}

Jag hller p att lgga till s att en bild ska skjutas i en rikning nr nedt piltangenten trycks ner.
Tack s himla mycket i frvg!!

PlayerEntity.java
Kod:
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;

import javax.swing.ImageIcon;

public class PlayerEntity extends Entity {


public ShotEntity missile = null;  // ingen missil!

	
	public PlayerEntity(Image[] images, Map map, double x, double y, int speed) {
		super(images, map, x, y, speed);
		// TODO Auto-generated constructor stub
	}
	
	// Ny metod som verskuggar
	public void draw(Graphics2D g){
	    if(missile != null && missile.getActive()){
	        missile.draw(g);   
	    }
	    super.draw(g);
	}
	
	public boolean tryToFire(){
	    if(missile == null || !missile.getActive()){
	        missile = new ShotEntity(new ImageIcon(getClass().getResource("/rsz_shoot.png")).getImage(), x+13, y, 90);
	        missile.setActive(true);
	        return true;
	    }else
	        return false;
	}

	public void move(long deltaTime) {
		super.move(deltaTime);
		if(speedY < 800 && falling) {
			speedY += gravity*(deltaTime/1000000000.0);
			//System.out.println(speedY);
			if(missile != null && missile.getActive()){ //skjutar metoden
			    missile.move(deltaTime);    
			}
		}

		double nx = x + dx*speedX*(deltaTime/1000000000.0);
		double ny = y + speedY*(deltaTime/1000000000.0);


		if (!validLocation(nx, ny)) {
			Point tile = hitTile(nx, ny, 1); //Vilken ruta krockar vi med
			
			if(tile.x == -1) {
				tile = hitTile(nx, ny, 3);
				if (tile.x == -1) {
					tile = hitTile(nx, ny, 4);
				}
				
			}

			// r det y som krockar
			if (validLocation(nx, y)) {
				x = nx;

				// Justrerar position i y-led, i kant med blocket
				if(speedY >= 0) {
					y = tile.y*map.getTileSize() - imageToShow.getHeight(null); // NDRAT
				}else if(speedY < 0) {
					y = tile.y*map.getTileSize() + map.getTileSize(); 
				}else
					System.out.println("HHHH xxxxxx");
			} else if (validLocation(x, ny)) { // r det i x-led krocken sker
				y = ny;

				// Justrerar position i x-led
				if(dx == 1) {
					x = tile.x*map.getTileSize() - imageToShow.getWidth(null); // NDRAT
				}else if(dx == -1) {
					x = tile.x*map.getTileSize() + map.getTileSize(); 
				}
			}else { // Fel i bde x- och y-led. Identisk kod -> skapa privata metioder
				System.out.println("BDA " + y);
				if(speedY >= 0) {
					y = (int)(tile.y*map.getTileSize() - imageToShow.getHeight(null)); // NDRAT
				}else if(speedY < 0) {
					y = (int)(tile.y*map.getTileSize() + map.getTileSize()); 
				}

				if(dx == 1) {
					x = (int)(tile.x*map.getTileSize() - imageToShow.getWidth(null)); // NDRAT
				}else if(dx == -1) {
					x = (int)(tile.x*map.getTileSize() + map.getTileSize());    
				}
				System.out.println("BDA " + y);
			}
		}else {
			x = nx;
			y = ny;
		}


		// Hoppa ifall tile r tillten
		
		
		
	

		if(hitTile(x,y+1,1).y != -1) {
			allowedjump = true;
			falling = false;
			speedY = 0;
		}
		else if(hitTile(x,y+1,3).y != -1) {
			allowedjump = true;
			falling = false;
			speedY = 0;
		} 
		else if(hitTile(x,y+1,4).y != -1) {
			allowedjump = true;
			falling = false;
			speedY = 0;
		}
		else {
			falling = true;
		}
		/*
		if(getSpeedX() < 200 && falling) {
			double speedY;
			speedY = getSpeedY() + gravity;
			setSpeedY(speedY);
		}*/

	}



	/**
	 * Frflyttar spelfiguren beroende p frfluten tid
	 * @param deltaTime tid som frflutit sedan frra uppdateringen i nano sekunder
	 */

}

ShotEntity.java
Kod:
import java.awt.Graphics2D;
import java.awt.Image;

public class ShotEntity extends Entity {

    public ShotEntity(Image[] images, Map map, double x, double y, int speed) {
		super(images, map, x, y, speed);
		// TODO Auto-generated constructor stub
	}

	@Override
    public void move(long deltaTime) {
        x += dy*(deltaTime/1000000000.0)*speedY;
    }

	public boolean getActive() {
		// TODO Auto-generated method stub
		return false;
	}

	
	
}
Citera
2020-04-15, 22:16
  #2
Medlem
Hm du har inte skickat med felmeddelandet s blir lite klurigt. Kan ta en gissning i och med att du sger att konstruktorn felar.

Ser ju ut som att det kan vara "ShotEntity" som det blir knas i, den tar ju in en array av bilder men du skickar bara in en bild. I din "trytoshoot" metod kan du istllet skapa en array av Images och peta in din bild som du laddar i den arrayen, drefter skickar du in arrayen i konstruktorn istllet fr bara bilden.
Citera
2020-04-16, 01:04
  #3
Medlem
Edit: sg att du inte heller verkar skicka in ngot Map objekt i ShootEntity konstruktorn
Citera
2020-04-16, 10:32
  #4
Medlem
Citat:
Ursprungligen postat av Sabelstefan
Edit: sg att du inte heller verkar skicka in ngot Map objekt i ShootEntity konstruktorn

Alright, tror jag hnger med vad du menar. Kan paste'a felmeddelandet men den sger att den vill skapa en ny konstruktor och att ngot antagligen missas eller inte fungerar.
Testade detta men verkar fortfarande bli massa klydd..

Kod:
	public boolean tryToFire(){
	    if(missile == null || !missile.getActive()){
	    		    	
			Image[] images = new Image[1];
			images[0] = new ImageIcon(getClass().getResource("/rsz_shoot.png")).getImage();
			
	        missile = new ShotEntity(new Image(), map, x+13, y, 90);
	        missile.setActive(true);
	        return true;
	        
	    }else
	        return false;
	}
Citera
2020-04-16, 11:45
  #5
Medlem
Citat:
missile = new ShotEntity(new Image(), map, x+13, y, 90);

Den biten skickar fortfarande in en Image, inte array! Med din skapade array br det bli shr:

Citat:
missile = new ShotEntity(images, map, x+13, y, 90);
Citera
2020-04-16, 17:20
  #6
Medlem
Citat:
Ursprungligen postat av Sabelstefan
Den biten skickar fortfarande in en Image, inte array! Med din skapade array br det bli shr:

Ahhhh! Yes tack!! Nu frsvann det felet! , men fr dock error p
Kod:
missile.setActive(true);
Den vill lgga till en get metod i ShotEntity klassen.

https://imgur.com/a/QKL1Bgb

Citera
2020-04-16, 19:30
  #7
Medlem
Citat:
Ursprungligen postat av Sweet1337
Ahhhh! Yes tack!! Nu frsvann det felet! , men fr dock error p
Kod:
missile.setActive(true);
Den vill lgga till en get metod i ShotEntity klassen.

https://imgur.com/a/QKL1Bgb

Vad jag kan se s har det redan genererats en get metod men det r vl set metoden som saknas och som IDEn vill lgga till?
Citera
2020-04-16, 19:57
  #8
Medlem
Getters och setters anvnds fr inkapsling av ett dataflt i en klass. Dataflt ska inte kunna ndras explicit eller accessas explicit utan man ska g genom dessa metoder. Din getter uppfyller egentligen inget syfte d den bara returnerar ett statiskt vrde, false.

Du br ndra gettern att returnera ngon boolean inom din klass, det finns i nulget ingen sdan s du mste skapa en. Drefter lgger du till en setter fr att kunna ndra vrdet p denna:

Kod:
import java.awt.Graphics2D;
import java.awt.Image;

public class ShotEntity extends Entity{

private boolean isActive;

    public ShotEntity(Image[] images, Map map, double x, double y, int speed) {
		super(images, map, x, y, speed);
		// TODO Auto-generated constructor stub
	}

	@Override
    public void move(long deltaTime) {
        x += dy*(deltaTime/1000000000.0)*speedY;
    }

	public boolean getActive() {
		// TODO Auto-generated method stub
		return isActive;
	}

         public void setActive(boolean b){
     isActive = b;
}
__________________
Senast redigerad av Sabelstefan 2020-04-16 kl. 20:03. Anledning: Bug
Citera
2020-04-16, 22:21
  #9
Medlem
Citat:
Ursprungligen postat av Sabelstefan
Getters och setters anvnds fr inkapsling av ett dataflt i en klass. Dataflt ska inte kunna ndras explicit eller accessas explicit utan man ska g genom dessa metoder. Din getter uppfyller egentligen inget syfte d den bara returnerar ett statiskt vrde, false.

Du br ndra gettern att returnera ngon boolean inom din klass, det finns i nulget ingen sdan s du mste skapa en. Drefter lgger du till en setter fr att kunna ndra vrdet p denna:

Kod:
import java.awt.Graphics2D;
import java.awt.Image;

public class ShotEntity extends Entity{

private boolean isActive;

    public ShotEntity(Image[] images, Map map, double x, double y, int speed) {
		super(images, map, x, y, speed);
		// TODO Auto-generated constructor stub
	}

	@Override
    public void move(long deltaTime) {
        x += dy*(deltaTime/1000000000.0)*speedY;
    }

	public boolean getActive() {
		// TODO Auto-generated method stub
		return isActive;
	}

         public void setActive(boolean b){
     isActive = b;
}

Tack!! Va dum jag e, missade ju settern
Citera
2020-04-16, 23:52
  #10
Medlem
Hehe ltt hnt! Lycka till med arbetet!
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in