Svetoma Skrevet 17. oktober 2013 Del Skrevet 17. oktober 2013 (endret) 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 17. oktober 2013 av Svetoma Lenke til kommentar
jonny Skrevet 17. oktober 2013 Del Skrevet 17. oktober 2013 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
Svetoma Skrevet 18. oktober 2013 Forfatter Del Skrevet 18. oktober 2013 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
jonny Skrevet 18. oktober 2013 Del Skrevet 18. oktober 2013 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
Svetoma Skrevet 18. oktober 2013 Forfatter Del Skrevet 18. oktober 2013 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
Svetoma Skrevet 18. oktober 2013 Forfatter Del Skrevet 18. oktober 2013 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
jonny Skrevet 18. oktober 2013 Del Skrevet 18. oktober 2013 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
Svetoma Skrevet 18. oktober 2013 Forfatter Del Skrevet 18. oktober 2013 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
jonny Skrevet 18. oktober 2013 Del Skrevet 18. oktober 2013 (endret) 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 18. oktober 2013 av jonny Lenke til kommentar
Svetoma Skrevet 18. oktober 2013 Forfatter Del Skrevet 18. oktober 2013 Jeg får vel bare prøve på egenhånd. Forslaget ditt fungerte akkurat som planglagt. Man lærer trossalt av feil Takk for veldig mye hjelp. Diskusjon.no er best! Og om andre som leser dette har forslag, si i fra! - Svetoma/Markus Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå