Vinnaren i pepparkakshustävlingen!
2020-04-15, 17:06
  #1
Medlem
Tjena! Har gymnasiearbete som jag håller på o fixa med en skut funktion på Java som jag ej får och funka. Får 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 håller på att lägga till så att en bild ska skjutas i en rikning när nedåt piltangenten trycks ner.
Tack så himla mycket i förväg!!

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 både x- och y-led. Identisk kod -> skapa privata metioder
				System.out.println("BÅDA " + 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("BÅDA " + y);
			}
		}else {
			x = nx;
			y = ny;
		}


		// Hoppa ifall tile är tillåten
		
		
		
	

		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);
		}*/

	}



	/**
	 * Förflyttar spelfiguren beroende på förfluten tid
	 * @param deltaTime tid som förflutit sedan förra 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 säger 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 istället skapa en array av Images och peta in din bild som du laddar i den arrayen, därefter skickar du in arrayen i konstruktorn istället för bara bilden.
Citera
2020-04-16, 01:04
  #3
Medlem
Edit: såg att du inte heller verkar skicka in något Map objekt i ShootEntity konstruktorn
Citera
2020-04-16, 10:32
  #4
Medlem
Citat:
Ursprungligen postat av Sabelstefan
Edit: såg att du inte heller verkar skicka in något Map objekt i ShootEntity konstruktorn

Alright, tror jag hänger med vad du menar. Kan paste'a felmeddelandet men den säger att den vill skapa en ny konstruktor och att något 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 bör det bli såhär:

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 bör det bli såhär:

Ahhhh! Yes tack!! Nu försvann det felet! , men får dock error på
Kod:
missile.setActive(true);
Den vill lägga 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 försvann det felet! , men får dock error på
Kod:
missile.setActive(true);
Den vill lägga 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 väl set metoden som saknas och som IDEn vill lägga till?
Citera
2020-04-16, 19:57
  #8
Medlem
Getters och setters används för inkapsling av ett datafält i en klass. Datafält 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 värde, false.

Du bör ändra gettern att returnera någon boolean inom din klass, det finns i nuläget ingen sådan så du måste skapa en. Därefter lägger du till en setter för att kunna ändra värdet 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 används för inkapsling av ett datafält i en klass. Datafält 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 värde, false.

Du bör ändra gettern att returnera någon boolean inom din klass, det finns i nuläget ingen sådan så du måste skapa en. Därefter lägger du till en setter för att kunna ändra värdet 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 lätt hänt! Lycka till med arbetet!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback