Vinnaren i pepparkakshustävlingen!
2020-01-24, 15:31
  #1
Medlem
Tjena!

Har googlat runt men hittar ingenting som passar in/verkar fungera.

Håller på med ett spel och vill byta bild mellan två olika bilder när min karaktär går höger och när han går vänster ska den ändra tillbaka till "vänster bilden"

Har just nu en bild som är min "fasta" karaktär i spelet men vet ej om jag ska skapa en array och sedan köra igenom den vid getKeyCode lyssnare eller om jag ska göra någon slags if sats.

Mvh!!

Game.java
Kod:
public class Game implements KeyListener {

	boolean gameRunning = true;
	int points = 0;
	
	private HashMap<String, Boolean> keyDown = new HashMap<String, Boolean>();

	private Map map;

	private Entity player;
	
	double camX, camY;

	private GameScreen gameScreen = new GameScreen("Ratchet And Clank", 1024, 768, false); // OBS! Skall Vara false.
	
	
	// Nu kommer klassen 
	
	
	

	public Game(){
		map = new Map("map2.txt", 42);
		gameScreen.setBackground(map);
		
		gameScreen.setKeyListener(this);
		
		keyDown.put("left", false);
		keyDown.put("right", false);
		keyDown.put("up", false);
		keyDown.put("down", false);

		loadImages();
		gameLoop();
	}

	public void loadImages(){
		Image img = new ImageIcon(getClass().getResource("/rsz_rsz_clank42x42right.png")).getImage();		
		player = new PlayerEntity(img, map, 42, 670, 100);
	}

	public void update(long delta){
		
		
		// Kamera som följer karaktären
		if(player.getX() > map.getTileSize()*11) {
			camX = player.getX();
			gameScreen.cameraMoveTo(camX - map.getTileSize()*11, camY);
		}

		player.setDx(0);
;
		
		if (keyDown.get("left")) {
			player.setDx(-1);
		}
		if (keyDown.get("right")) {
			player.setDx(1);
		}
		if (keyDown.get("up")  && player.getAllowedjump()) {
			player.jump(260.0);
			player.setAllowedjump(false); 
		}

		player.move(delta);
		
		Point hitTile = player.hitTile(2);
		
		if(hitTile.x != -1) {
			points++;
			map.setTile(hitTile.x, hitTile.y, 0);
		}
	}

	public void render(){
		gameScreen.render(player);
	}

	public void gameLoop(){
		long last = System.nanoTime();
		while(gameRunning){
			long delta = (System.nanoTime() - last);
			last = System.nanoTime();
			update(delta);
			render();
			// Fördröjning
			try { Thread.sleep(4); } catch (Exception e) {};
		}
	}

	/** Spelets tangentbordslyssnare */
	public void keyTyped(KeyEvent e) {
	}

	public void keyPressed(KeyEvent e) {
		// check the keyboard and record which keys are pressed

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			keyDown.put("left", true);
		}
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			keyDown.put("right", true);
		}
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			keyDown.put("down", true);
		}
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			keyDown.put("up", true);
		}
	}

	public void keyReleased(KeyEvent e) {
		// check the keyboard and record which keys are released

		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			keyDown.put("left", false);
		}
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			keyDown.put("right", false);
		}
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			keyDown.put("down", false);
		}
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			keyDown.put("up", false);
		}
	}

	public static void main(String[] args) {
		new Game();
	}
}

Entity.java
Kod:
/**
 * MINA ÄNDRINGAR
 * 1) import se.egy.graphics.Drawable; 
 * 2) public class Entity implements Drawable
 * 3) Bytt namn på metooden paint till draw
 */
public abstract class Entity implements Drawable{
	// x, y position på figuren i px
	protected double x, y;

	// Rörelseriktiningen på entiteten */
	protected int dx = 0, dy = 0;

	// Hastigheten på spelfiguren i px/s
	protected int speedX;
	protected double speedY = 0;

	// Bilden som representerar figuren
	protected Image image;

	// Rutnätet med spelplanen
	protected Map map;

	// Värde i rutnätet som inte spelfiguren kan gå till, typ en vägg.
	protected int blocked = 1;

	// jump value 
	protected boolean jumping = false;

	// falling value
	protected boolean falling = false;

	// gravity 
	protected double gravity = 400;

	// maximal hastighet
	protected double maxDY = 0.0;
	
	protected boolean allowedjump = true; 

	/**
	 * Konstruktor
	 * 
	 * @param image	bilden som representerar spelfiguren
	 * @param map	rutnätet med spelplanen
	 * @param x		x-position på skärmen
	 * @param y		y-position på skärmen
	 * @param speed	rörelsehastighet i px/s som figuren skall röra sig med
	 * @param gravity graviditeten spelaren ska ha
	 */
	public Entity(Image image, Map map, double x, double y, int speed) {
		this.image = image;
		this.map = map;
		this.x = x;
		this.y = y;
		this.speedX = speed;
		this.jumping = false;
	}
	


	/**
	 * Förflyttar spelfiguren beroende på förfluten tid
	 * @param deltaTime tid som förflutit sedan förra uppdateringen i nano sekunder
	 */
	public abstract void move(long deltaTime);


	/**
	 * Kontrollerar om en position på skärmen inte är blockerd
	 * @param nx
	 * @param ny
	 * @return
	 */
	public boolean validLocation(double nx, double ny) {
		if(hitTile(nx, ny, blocked).x != -1) {
			return false;
		}else {
			return true;
		} 
	}


	protected Point hitTile(double xPos, double yPos, int tileValue) {
		int x = -1, y = -1;

		if (map.getTileFromPx(xPos, yPos) == tileValue) {
			x = (int)xPos/map.getTileSize();
			y = (int)yPos/map.getTileSize();
			return new Point(x, y);
		}
		if (map.getTileFromPx(xPos + image.getWidth(null)-1, yPos) == tileValue) {
			x = (int)(xPos + image.getWidth(null)-1)/map.getTileSize();
			y = (int)yPos/map.getTileSize();
			return new Point(x, y);
		}
		if (map.getTileFromPx(xPos + image.getWidth(null)-1, yPos + image.getHeight(null)-1) == tileValue) {
			x = (int)(xPos + image.getWidth(null)-1)/map.getTileSize();
			y = (int)(yPos + image.getHeight(null)-1)/map.getTileSize(); 
			return new Point(x, y);
		}
		if (map.getTileFromPx(xPos, yPos + image.getHeight(null)-1) == tileValue) {
			x = (int)(xPos)/map.getTileSize();
			y = (int)(yPos + image.getHeight(null)-1)/map.getTileSize();
			return new Point(x, y);
		}

		return new Point(x, y);
	}
	/**
	 * Kontrollerar om spelfiguren ligger på en ruta med ett visst värde.
	 * 
	 * @param tileValue
	 * @return koordinaten på rutan i rutnätet med sökt värde Om den inte finns returneras(-1,-1)
	 */
	public Point  hitTile(int tileValue) {		
		return hitTile(x, y, tileValue);
	}
	/**
	 * Draw this entity to the graphics context provided.
	 * 
	 * @param g The graphics context to which the entity should be drawn
	 */
	public void draw(Graphics2D g) {
		g.drawImage(image, (int)x, (int)y, null);
	}
	
	public void jump(double speed) {
		speedY = -speed;
		falling = true;
	}
	

	
	
	// Getters och Setters
	public int getDx() {
		return dx;
	}

	public void setDx(int dx) {
		this.dx = dx;
	}


	public double getX() {
		return x;
	}


	public void setX(double x) {
		this.x = x;
	}


	public double getY() {
		return y;
	}


	public void setY(double y) {
		this.y = y;

	}
	
	
	// Gravity när man hoppar
	
	public int getSpeedX() {
		return speedX;
	}	
	
	public void setSpeedX(int speedX) {
		 this.speedX = speedX;
	}
	
	public double getSpeedY() {
		return speedY;
	}	
	
	public void setSpeedY(double ySpeed) {
		 this.speedY = ySpeed;
	}
	
	
	
	public void setAllowedjump(boolean allowedjump) {
		this.allowedjump = allowedjump;
	}
	
	public boolean getAllowedjump() {
		return allowedjump;
	}

}

PlayerEntity.java
Kod:
public class PlayerEntity extends Entity {

	public PlayerEntity(Image image, Map map, double x, double y, int speed) {
		super(image, map, x, y, speed);
		// TODO Auto-generated constructor stub
	}


	public void move(long deltaTime) {
		if(speedY < 800 && falling) {
			speedY += gravity*(deltaTime/1000000000.0);
			//System.out.println(speedY);
		}

		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

			// Ä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() - image.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() - image.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() - image.getHeight(null)); // ÄNDRAT
				}else if(speedY < 0) {
					y = (int)(tile.y*map.getTileSize() + map.getTileSize()); 
				}

				if(dx == 1) {
					x = (int)(tile.x*map.getTileSize() - image.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 {
			falling = true;
		}
		/*
		if(getSpeedX() < 200 && falling) {
			double speedY;
			speedY = getSpeedY() + gravity;
			setSpeedY(speedY);
		}*/

	}



}
Citera
2020-01-24, 17:48
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Sweet1337
Tjena!

Har googlat runt men hittar ingenting som passar in/verkar fungera.

Håller på med ett spel och vill byta bild mellan två olika bilder när min karaktär går höger och när han går vänster ska den ändra tillbaka till "vänster bilden"

Har just nu en bild som är min "fasta" karaktär i spelet men vet ej om jag ska skapa en array och sedan köra igenom den vid getKeyCode lyssnare eller om jag ska göra någon slags if sats.

Mvh!!
...kod
Om jag nu förstår dig rätt så är ditt problem hur du ska byta ikon (eller "gubb-bild" beroende på vilken knapp du klickat på, är det så?

I sådana fall kanske du kan deklarera upp en HashMap med 4 entries (left, right, up, down) eller så, samt bildnamn som värdet.

I din lyssnare sedan kan du ju, beroende på vilket event som triggades, få tag på rätt bild ur din hashmap med hjälp av get i mapinterfacet och sedan skicka in denna bild i nån update-metod i din spelarklass så att bilden uppdateras.

Vad tror du om det?
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