Problem med diagram, Slick/JLWGL

Tags:    java slick jlwgl

Hej allesammen! Jeg har et problem med Slick og JLWGL. Ved ikke om nogen af jer har arbejdet med biblioteket før, men har problem i følgende kode:


Fold kodeboks ind/udJava kode 


Hvis jeg kører programmet og trykker W svarer programmet ikke... Hvilket jeg ikke helt forstår.

Her er resten af koden:

Game klassen
Fold kodeboks ind/udJava kode 


Menu klassen:
Fold kodeboks ind/udJava kode 




7 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Jeg antager at delta er et positivt.

Hvis ballPosY er mindre end defBallPosY + 10 så gør du den mindre. Men du sammenligner med løkken kører så længe den ikke er lig med defBallPosY. Så du gør blot forskellen større. De to statements skal nok byttes om.

Hvilke værdier kan delta tage? Hvis delta kan være mindre en 10 så vil ballPosY aldrig ændre sig. Lad os sige den er 9. Så er 9 * .1f = 0.9f , men ballPosY er en int så den smider fraktionen væk og trækker 0 til eller fra.

Hvis delta på den anden side kan være 20 eller mere kan du risikere at din ballPosY springer defBallPosY over.

Så hvis din delta er mindre end 10 vil din løkke aldrig stoppe. Hvis den er større end 19 stopper den måske. Det at løkken ikke stopper er din "svarer ikke".




Indlæg senest redigeret d. 03.10.2012 17:01 af Bruger #14645
Hvis programmet skal have en chance for at virke, så skal dine:

Fold kodeboks ind/udJava kode 


som minimum alle sammen være af typen float eller double.



Fold kodeboks ind/udJava kode 



Lad os sige at:
ballPosY = 173
defBallPosY = 175

Så gælder det at: ballPosY > defBallPosY - 20

Så bliver der trukket fra indtil:
ballPosY <= 155
(lad os sige 155)

Næste gang bliver der lagt en til:
ballPosY = 156

Så bliver der trukket fra igen
ballPosY = 155

Det bliver aldrig tilfældet at ballPosY == defBallPosY

Hvad med den anden retning?
ballPosY = 120
defBallPosY = 175

Så gælder det IKKE at: ballPosY > defBallPosY - 20

Så bliver der lagt til indtil:
ballPosY >= 155

Og så kører den frem og tilbage igen.

Hvis FPS er 60 så er delta omkring 16-17 så dine -= og += bliver 1 hele tiden fordi 16*0.1f = 1.6 bliver rundet ned (trunkeret) til 1.

Du er nok nødt til som Kevin siger at bruge floats eller double hvis det skal virke mere robust. Selvom det måske virker nu går der stadig noget tabt ved trunkering. Brugte du 0.05f i stedet ville det måske aldrig ændre sig.

Jeg gætter på det er et platform spil du laver ud fra koden (gå til venstre (A), højre (D), kommentaren JUMP (W)) og at det er bolden der skal hoppe. Men din while løkke stopper ikke indtil bolden er faldet på plads så selv hvis den afsluttede ville det ske med det samme. En anden tilgang er at du giver bolden en lodret hastighed når du hopper og så lader "tyngdekraften" lad den falde ned.

Så skal vi bruge en variabel til at holde styr på højden og den lodrette hastighed. Jeg bruger lige int i eksemplet for at det passer sammen, men du bør nok skifte til float eller double.:

Fold kodeboks ind/udJava kode 


Så håndterer vi faldet.

Fold kodeboks ind/udJava kode 


Så mangler vi bare at give bolden dens puf opad:

Fold kodeboks ind/udJava kode 







Indlæg senest redigeret d. 03.10.2012 19:32 af Bruger #14645
0.1f står for tallet 0,1 i float format, du skriver 0,1f for at fortælle java, at dette tal er i datatypen float.




Nu er det ved at være noget tid siden men jeg tror det er fordi Y er positiv nedad. Dvs. at hvis Y=100, så er Y-koordinat 110 under 100. Så for at få noget til at gå opad skal vi trække fra og for at få noget til at gå nedad skal vi lægge til.

Når vi giver den -10 svarer det ikke til at vi flytter den 10 pixel opad. Det svarer til vi giver den en hastighed på 10 opad. Dvs. vi ændrer hastigheder og ikke positioner. Det svarer lidt til at skyde med en kanon op i luften. Kuglen bliver ved med at flyve opad indtil tyngdekraften får vendt om.

Så hastigheden er op 10 enheder opad pr. millisekund, og tyngdekraften er på 0.1 enheder pr. millisekund. Nu ved jeg ikke hvor højst den hoppede men nu kan vi prøve at gætte hvorfor den hopper så højt:

10/0.1 = 100. Så det vil tage 100ms for tyngdekraften at vende den op. Så vil den nok nå at hoppe omkring 5*100ms = 500 pixel. Tyngdekraften er lineær så den flyver gennemsnitlig med 10/2=5 opad.

Men for at få et pænere resultat prøve vi lige at arbejde baglæns. Lad os sige vi vil have den til at hoppe 100 pixel og tage 1s (1000ms) til toppen.

OPAD / TYNGDEKRAFT = 1000ms
Og
//Tyngdekraften tager det halve så vi skal "dobbelt" så høj op i beregningerne.
OPAD * 1000ms = 2 * 100 pixel

Så må
OPAD = 200 / 1000 = 0.2

OPAD / 1000ms = TYNGDEKRAFT = 0.0002

Så prøv at erstat -10 med -0.2 og tyngekraften med 0.0002





Indlæg senest redigeret d. 10.10.2012 19:55 af Bruger #14645
Delta er antallet af millisekunder mellem hvert update (frame) i spillet.

Har skrevet koden om, sådan her:
Fold kodeboks ind/udJava kode 


Men det virker stadig ikke..



Fold kodeboks ind/udJava kode 



Lad os sige at:
ballPosY = 173
defBallPosY = 175

Så gælder det at: ballPosY > defBallPosY - 20

Så bliver der trukket fra indtil:
ballPosY <= 155
(lad os sige 155)

Næste gang bliver der lagt en til:
ballPosY = 156

Så bliver der trukket fra igen
ballPosY = 155

Det bliver aldrig tilfældet at ballPosY == defBallPosY

Hvad med den anden retning?
ballPosY = 120
defBallPosY = 175

Så gælder det IKKE at: ballPosY > defBallPosY - 20

Så bliver der lagt til indtil:
ballPosY >= 155

Og så kører den frem og tilbage igen.

Hvis FPS er 60 så er delta omkring 16-17 så dine -= og += bliver 1 hele tiden fordi 16*0.1f = 1.6 bliver rundet ned (trunkeret) til 1.

Du er nok nødt til som Kevin siger at bruge floats eller double hvis det skal virke mere robust. Selvom det måske virker nu går der stadig noget tabt ved trunkering. Brugte du 0.05f i stedet ville det måske aldrig ændre sig.

Jeg gætter på det er et platform spil du laver ud fra koden (gå til venstre (A), højre (D), kommentaren JUMP (W)) og at det er bolden der skal hoppe. Men din while løkke stopper ikke indtil bolden er faldet på plads så selv hvis den afsluttede ville det ske med det samme. En anden tilgang er at du giver bolden en lodret hastighed når du hopper og så lader "tyngdekraften" lad den falde ned.

Så skal vi bruge en variabel til at holde styr på højden og den lodrette hastighed. Jeg bruger lige int i eksemplet for at det passer sammen, men du bør nok skifte til float eller double.:

Fold kodeboks ind/udJava kode 


Så håndterer vi faldet.

Fold kodeboks ind/udJava kode 


Så mangler vi bare at give bolden dens puf opad:

Fold kodeboks ind/udJava kode 




Undskyld for den sene tilbagemelding..

- Har ændret det hele til float, men der er nogle ting jeg ikke forstår, og der er nogle ting som ikke helt virker efter hensigt..

Fold kodeboks ind/udJava kode 


Hvorfor skal ballVelY være et negativt tal? Det var så delen jeg ikke forstod.

Programmet virker ikke efter hensigten, for bolden hopper alt for højt, hvilket jeg ikke forstår, eftersom at ballPosY kun bliver 10px mindre. Og bolden hopper vanvittigt hurtigt, hvilket jeg heller ikke forstår, vi bruger jo delta * 0.1f;

- Og nu jeg spørger så meget kan et ekstra spørgsmål vel ikke gøre det store...

Hvad betyder det når vi ganger med 0.1f ? er det hex? Eller hvordan hænger det lige sammen? Og hvad er 0.1f ligmed?



t