Vad är fel med den metoden "forward" (I klassen Turtle)?
Tanken är att en kvadrat skall ritas ut i ett fönster när jag kör "TurtleDrawSquare". Metoden "forward" används i klassen "TurtleDrawSquare" för att göra detta men som det visas på bilden kommer det i fönstret "TurtleDrawSquare" bara upp ett tunnt svart sträck högst upp i hörnet av rutan. Obs att rutan som skall rita linjer har origo uppe i vänstra hörnet med en positiv y-axel nedåt och en positiv x-axel åt höger. Nedan är båda koderna bifogade. Tacksam för svar.
//uppdatering av koden
Du gör ingenting med this.x och this.y. De kanske inte behövs, men då får du göra w.setX eller nåt sånt i början, i stället för this.x=.
Laguna skrev:Du gör ingenting med this.x och this.y. De kanske inte behövs, men då får du göra w.setX eller nåt sånt i början, i stället för this.x=.
Menar du att jag ska ändra x-värdet i slutet av min metod efter if-satsen?
Jag menar att w.getX() kommer att vara 0 första gången, inte 300.
Jag har några kommentarer utöver det Laguna redan påpekat.
I penUp() resp penDown() så skapar du en ny boolsk variabel isPenDown och sätter den till true resp false. Jag tror att du avser att sätta klassvariabeln isPenDown. De är understrukna med gult vilket ger dig en hint om att allt inte står rätt till, i det här fallet att variabeln inte används. Ta bort deklarationen (boolean) i metoderna.
penUp och penDown är sk. setters och då är det vanligt att man använder set... som namn, ex setPenDown()
I kontrollen om isPenDown så skriver du isPenDown = false. Det är en tilldelning och ger inte det resultat du förväntar dig. Jämförelse gör du med dubbla likhetstecken (==). När du kontrollerar en boolean så behöver du inte kontrollera om den är true eller false, den är ett boolskt villkor i sig, dvs (isPenDown == true) kan du enklare skriva (isPenDown) och om du vill kontrollera om den är falsk så räcker (!isPenDown). I ditt fall kan du nöja dig med
if (isPenDown) {
// gör vad du ska om pennan är nere
} else {
// gör vad du ska om pennan är uppe
}
Laguna skrev:Jag menar att w.getX() kommer att vara 0 första gången, inte 300.
Men ger jag inte objektet ett startvärde när jag skapar objektet? (Dvs x- och y-koordinat 300)?
CurtJ skrev:Jag har några kommentarer utöver det Laguna redan påpekat.
I penUp() resp penDown() så skapar du en ny boolsk variabel isPenDown och sätter den till true resp false. Jag tror att du avser att sätta klassvariabeln isPenDown. De är understrukna med gult vilket ger dig en hint om att allt inte står rätt till, i det här fallet att variabeln inte används. Ta bort deklarationen (boolean) i metoderna.
penUp och penDown är sk. setters och då är det vanligt att man använder set... som namn, ex setPenDown()
I kontrollen om isPenDown så skriver du isPenDown = false. Det är en tilldelning och ger inte det resultat du förväntar dig. Jämförelse gör du med dubbla likhetstecken (==). När du kontrollerar en boolean så behöver du inte kontrollera om den är true eller false, den är ett boolskt villkor i sig, dvs (isPenDown == true) kan du enklare skriva (isPenDown) och om du vill kontrollera om den är falsk så räcker (!isPenDown). I ditt fall kan du nöja dig med
if (isPenDown) { // gör vad du ska om pennan är nere } else { // gör vad du ska om pennan är uppe }
Hej Curt och tack för hjälpen! Dock försvinner ritningen totalt när jag tar bort boolean från metoderna. Vet du varför?
Jag tycks ha löst det!! Tack så mycket för eran hjälp. Däremot blir jag inte klok på vad Curt menade med boolean.
Nu tror jag programmeraren visat det i din andra tråd men för att förtydliga min kommentar
Du har en public static boolean isPenDown som du använder här och där och det är rimligt men i metoderna penDown() och penUp() sätter du inte den variabeln utan du deklarerar en ny i respetive metod genom att du skriver boolean isPenDown = true. Denna variabel är bara tillgänglig i den metoden och du använder den inte någonstans, därför är den understruken med gult som varning. Om du vill sätta din globala variabel så ta bort ordet "boolean" där så används den globala isPenDown i st f att deklarera en ny.
CurtJ skrev:Nu tror jag programmeraren visat det i din andra tråd men för att förtydliga min kommentar
Du har en public static boolean isPenDown som du använder här och där och det är rimligt men i metoderna penDown() och penUp() sätter du inte den variabeln utan du deklarerar en ny i respetive metod genom att du skriver boolean isPenDown = true. Denna variabel är bara tillgänglig i den metoden och du använder den inte någonstans, därför är den understruken med gult som varning. Om du vill sätta din globala variabel så ta bort ordet "boolean" där så används den globala isPenDown i st f att deklarera en ny.
Tack jag förstår vad du syftar på. Jag skall trixa lite mer med det och se om jag kan lösa det. Jag har tagit era tips angående boolean och skall se om jag får rätsida på det.
Uppdatering: streck ritas ut även när dem inte skall ritas ut. Jag misstänker att felet ligger i metoden forward alternativt i konstruktorn.
Du har inte läst mitt råd tidigare om att villkor inte kan skrivas med ett =, då blir det en tilldelning. Läs min kommentar #6 igen och specifikt kodmallen i slutet på kommentaren.
CurtJ skrev:Du har inte läst mitt råd tidigare om att villkor inte kan skrivas med ett =, då blir det en tilldelning. Läs min kommentar #6 igen och specifikt kodmallen i slutet på kommentaren.
Hej! Tack så väldigt mycket för hjälpen, det löste sig nu.