Gå til innhold

Anbefalte innlegg


package Entities;

import it.randomtower.engine.ResourceManager;
import it.randomtower.engine.entity.Entity;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;

public class Bouncy extends Entity{
	
	public static String BOUNCY = "Bouncy";
	public Image boucy;
	public boolean Selected = Harden.Selected;
	public static boolean SelectedBouncy = false;
	//Bouncy
	public Bouncy(float x, float y) throws SlickException {
		super(x, y);
		boucy = ResourceManager.getImage("bouncy");
		setGraphic(boucy);
		setHitBox(x, y, 64, 64);
		addType(PLAYER);
	}
	public void update(GameContainer window, int delta) throws SlickException {
		Input input = window.getInput();
		if(input.isKeyPressed(Input.KEY_A)){
			System.out.println("Harden");
			Selected = true;
			SelectedBouncy = false;
		}
		
		
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(SelectedBouncy = true){
				x += (.2 * delta);
			}else{
				SelectedBouncy = false;
			}
		}
			
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(SelectedBouncy = false){
				x += (.0 * delta);
			}else{
				SelectedBouncy = true;
			}
		}

		
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(SelectedBouncy = true){
				x -= (.2 * delta);
			}else{
				SelectedBouncy = false;
			}
		}

		
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(SelectedBouncy = false){
				x -= (.0 * delta);
			}else{
				SelectedBouncy = true;
			}
		}
				
		
		

		super.update(window, delta);
	}
	
	public void render(GameContainer window, Graphics g)
			throws SlickException {
		super.render(window, g);
	}

}

Over er Bouncy sin klasse med ingen feil som vises.

package Entities;

import it.randomtower.engine.entity.Entity;
import it.randomtower.engine.ResourceManager;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.InputListener;
import org.newdawn.slick.SlickException;

public class Harden extends Entity{
	public static String HARDEN = "Harden";
	public Image harden;
	public static boolean Selected = true;
	public boolean SelectedBouncy = Bouncy.SelectedBouncy;
	//Harden
	public Harden(float x, float y) throws SlickException {
		super(x, y);
		harden = ResourceManager.getImage("harden");
		setGraphic(harden);
		setHitBox(x, y, 64, 64);
		addType(PLAYER);
	}
	public void update(GameContainer window, int delta) throws SlickException {
		Input input = window.getInput();
		if(input.isKeyPressed(Input.KEY_S)){
			System.out.println("Bouncy");
			Selected = false;
			SelectedBouncy = true;
		}
		
		
		
		//vanlig
		
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(Selected = true){
				x += (.2 * delta);
			}else{
				Selected = false;
			}
		}
			
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(Selected = false){
				x += (.0 * delta);
			}else{
				Selected = true;
			}
		}

		
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(Selected = true){
				x -= (.2 * delta);
			}else{
				Selected = false;
			}
		}

		
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(Selected = false){
				x -= (.0 * delta);
			}else{
				Selected = true;
			}
		}
		
		super.update(window, delta);
	}
	
	public void render(GameContainer window, Graphics g)
			throws SlickException {
		super.render(window, g);
	}

}

Og her er Harden.

 

Problemet er at når jeg prøver å bytte, beveger begge seg samtidig. Poenget er at du skal kunne trykke på "S" om du vil bruker Bouncy og "A" om du vil bruke harden. Jeg printer på byttingen for å se om det registreres, og det gjør det og.

 

Så, hva er feil?

Endret av Svetoma
Lenke til kommentar
Videoannonse
Annonse

Du bør vel sjekke KEY_A og KEY_S i både Bouncy- og Harden-klassene? I f.eks. Harden-klassen bør du sette "Selected = true;" og "SelectedBouncy = false;" hvis KEY_A blir trykket på?

 

Ellers vil jeg si du har unødvendig mange kodelinjer her, du kan f.eks. redusere koden i Harden.update() slik:

  public void update(GameContainer window, int delta)
          throws SlickException
  {
    Input input = window.getInput();
    if (input.isKeyPressed(Input.KEY_S)) {
      System.out.println("Bouncy");
      Selected = false;
      SelectedBouncy = true;
    }
    if (input.isKeyPressed(Input.KEY_A)) {
      System.out.println("Harden");
      Selected = true;
      SelectedBouncy = false;
    }

    //vanlig
    if (Selected) {
      if (input.isKeyDown(Input.KEY_RIGHT)) {
        x += (.2 * delta);
      }
      if (input.isKeyDown(Input.KEY_LEFT)) {
        x -= (.2 * delta);
      }
    }

    super.update(window, delta);
  }

Ellers liker jeg ikke bruken av statiske variabler på denne måten, men det får nå være...

Lenke til kommentar

Takk for svar! Jeg vet systemet mitt er klumsete, men spillet er ikke nær å være ferdig en gang. Dette er bare en måte jeg kan finne en måte å løse spillerbytte-kontrollene. Det må gjøres mye selv om jeg løser problemet.

 

- Svetoma/Markus

Lenke til kommentar

OK, en form for kodegenerering inne i bildet her, altså? Du bruker "=" istedenfor "==" i testene dine, det gjør at ting går galt. I tillegg (som jeg allerede har vært inne på) ser jeg ikke at "Bouncy.SelectedBouncy" og "Harden.Selected" blir satt til "true" noe sted (mulig du gjør dette et annet sted som du ikke har vist, men hvorfor er disse verdiene statiske?).

 

Når det gjelder input-håndtering: Du bruker window.getInput() i både Bouncy og Harden, vil dette input-objektet inneholde all input inntil et visst tidspunkt, eller kan det endre seg fra Bouncy.update() håndteres og til Hardy.update() håndteres? Hva om brukeren trykker både A og S samtidig?

Lenke til kommentar

Vel, jeg endret på koden med "==" etter jeg skrev innlegget fordi jeg tenkte at dette var bare en test. Jeg bruker statiske fordi jeg ville kunne bruke både SelectedBouncy og Selected i hver av klassene. Ja, jeg er elendig i Java og jeg finner nok en løsning på ved å trykke begge knappene på en gang. Jeg kan sende kodene jeg har nå, siden de er blitt endret en god del.

Takk for mye hjelp!

 

- Svetoma/Markus

Lenke til kommentar

Her er den nye koden. Den funker, men den funker ikke. Fordi Bouncy beveger seg ikke når jeg velger han, men jeg kan trykke tilbake til Harden. Forslag? Vi begynner med Harden.

public void update(GameContainer window, int delta) throws SlickException {
		Input input = window.getInput();
		
		//vanlig
		
		if(input.isKeyPressed(Input.KEY_S)){
			System.out.println("Bouncy");
			Selected = false;
		}
		if(input.isKeyPressed(Input.KEY_A)){
			System.out.println("Harden");
			Selected = true;
		}
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(Selected == true){
				x += (.2 * delta);
			}
		}	
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(Selected == false){
				x += (.0 * delta);
			}
		}
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(Selected == true){
				x -= (.2 * delta);
			}
		}
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(Selected == false){
				x -= (.0 * delta);
			}
		}
		//xbox
		if(input.isControlPressed(4, 5)){
			System.out.println("Harden");
			Selected = false;
		}
		if(input.isControllerLeft(5)){
			if(Selected == true){
				x -= (.2 * delta);
			}
		}
		if(input.isControllerLeft(5)){
			if(Selected == false){
				x -= (.0 * delta);
			}
		}
		if(input.isControllerRight(5)){
			if(Selected == false){
				x += (.0 * delta);
			}
		}
		if(input.isControllerRight(5)){
			if(Selected == true){
				x += (.2 * delta);
			}
		}
		super.update(window, delta);
	}
	public void render(GameContainer window, Graphics g)throws SlickException {
		super.render(window, g);
	}
}

Så kommer Bouncy:

public void update(GameContainer window, int delta) throws SlickException {
		Input input = window.getInput();
		
		if(input.isKeyPressed(Input.KEY_A)){
			System.out.println("Harden");
			SelectedBouncy = false;
		}
		if(input.isKeyPressed(Input.KEY_S)){
			System.out.println("Bouncy");
			SelectedBouncy = true;
		}
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(SelectedBouncy == true){
				x += (.2 * delta);
			}
		}	
		if(input.isKeyDown(Input.KEY_RIGHT)){
			if(SelectedBouncy == false){
				x += (.0 * delta);
			}
		}
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(SelectedBouncy == true){
				x -= (.2 * delta);
			}
		}
		if(input.isKeyDown(Input.KEY_LEFT)){
			if(SelectedBouncy == false){
				x -= (.0 * delta);
			}
		}		
		//xbox
		if(input.isControlPressed(5, 5)){
			System.out.println("Bouncy");
			SelectedBouncy = true;
		}
		if(input.isControllerLeft(5)){
			if(SelectedBouncy == true){
				x -= (.2 * delta);
			}
		}
		if(input.isControllerLeft(5)){
			if(SelectedBouncy == false){
				x -= (.0 * delta);
			}
		}
		if(input.isControllerRight(5)){
			if(SelectedBouncy == false){
				x += (.0 * delta);
			}
		}
		if(input.isControllerRight(5)){
			if(SelectedBouncy == true){
				x += (.2 * delta);
			}
		}
		super.update(window, delta);
	}
	
	public void render(GameContainer window, Graphics g)throws SlickException {
		super.render(window, g);
	}

}

Sånn! Da er det bare å lese gjennom. Jeg er tilgjenglig hele tiden, så ikke vær redd for å poste eller spørre.

Lenke til kommentar

Jeg kjenner ikke noe til bibliotekene du bruker, er du sikker på at Bouncy-objektet detekterer at S blir trykket inn? Dvs. du skal få en utskrift fra både Bouncy- og Harden-objektene, slik at du får to linjer med "Bouncy" når S trykkes inn... men som sagt, jeg kjenner ikke til bibliotekene du bruker (tenker på Input-klassen/grensesnittet), så jeg vet ikke hva som skjer bak kulissene.

 

Og hvorfor har du fortsatt med kode som dette?

  if(input.isKeyDown(Input.KEY_RIGHT)){
    if(Selected == false){
      x += (.0 * delta);
    }
  }

Den gjør jo absolutt ingen ting, og kan bare fjernes?

Lenke til kommentar

Utskriftene er for å holde orden om begge registreres. Bibliotekene er LWGJL og SIick2d med MarteEngine. Nå har jeg også prøvd å fjerne "false" greiene, som funker helt fint ut de. Men jeg har fortsatt problemer med at Bouncy står stille. Kanskje jeg kan ha en livestream som viser hva som skjer og slik at du kan rette meg underveis?

 

- Svetoma/Markus

Lenke til kommentar

Jeg har ikke hatt muligheter til å følge med her en stund, dessverre. Jeg tror likevel du lærer mest av å slite litt med sakene på egenhånd. Her er et forslag til hvordan koden for Harden-klassens update()-metode kan se ut:

class Harden ... {
  ...
  public void update(GameContainer window, int delta)
          throws SlickException
  {
    Input input = window.getInput();
		
    if (input.isKeyPressed(Input.KEY_S)
        || input.isControlPressed(4, 5))
    {
      System.out.println("Bouncy");
      Selected = false;
    }
    else if (input.isKeyPressed(Input.KEY_A)
             || input.isControlPressed(5, 5))
    {
      System.out.println("Harden");
      Selected = true;
    }

    if (Selected) {
      if (input.isKeyDown(Input.KEY_RIGHT)
          || input.isControllerRight(5))
      {
        x += (.2 * delta);
      }
      if (input.isKeyDown(Input.KEY_LEFT)
          || input.isControllerLeft(5))
      {
        x -= (.2 * delta);
      }
    }

    super.update(window, delta);
  }

  public void render(GameContainer window, Graphics g)
          throws SlickException
  {
    super.render(window, g);
  }

}

Jeg ville også gjort et par andre ting:

- ikke bruk konstanter som 4 og 5 (som i isControlPressed() osv.), gi i allefall konstantene navn. Det blir mye lettere å forstå koden (4 og 5 sier meg ingenting), og du kan rette et sted hvis du skulle ha brukt feil verdier eller ønsker å bruke en annen verdi. Antagelig vil du vel også gjøre det mulig for brukeren å konfigurere hvilke taster/knotter på kontrolleren som skal brukes, så du bør finne på noe lurt her. KEY_A, KEY_S, KEY_LEFT og KEY_RIGHT bør derfor heller ikke brukes.

- antagelig gjør du livet enklere for deg om du bestemmer hvem karakter som skal bevege seg et sted (ikke i både Harden og Bouncy, dette bør gjøres et annet sted _før_ Bouncy.update() og Hardy.update() kalles), nå ser jeg ikke bort fra at det kan forekomme at begge to blir valgt samtidig eller ingen av dem blir valgt i det hele tatt

 

Edit: For "Harden"-koden din ovenfor ser det ut til at input.isKeyPressed(Input.KEY_A) og input.isControlPressed(4, 5) ikke stemmer overens (enten er utskriften feil, eller så er settingen av Selected feil, jeg går ut i fra det siste)...

Endret av jonny
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...