NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
gcx11
Tvůrce
Avatar
gcx11:3.5.2017 21:05

Ahoj, dělám na hře v Javě a narazil jsem na problém.

Mám 2D mapu, kterou mám rozdělenou na čtvercové chunky. Každý chunk má svojí x-ovou a y-ovou souřadnici. Problém nastal, když jsem se snažil dostat souřadnici chunku z pozice myši ve hře.

Protože podle všeho -60/100= -0.6 = 0 a ne -1, jak jsem očekával.
Vyřešil jsem to přes Math.Floor, ale existuje nějaké lepší řešení?

public Chunk mouseToChunk(int mouseX, int mouseY){
        return Chunk.chunks.getOrDefault(
                new Coord((int)Math.floor((mouseToGameX(mouseX))/(double)Chunk.SIZE),
                          (int)Math.floor((mouseToGameY(mouseY))/(double)Chunk.SIZE)),
                null);
    }
 
Odpovědět
3.5.2017 21:05
Avatar
Odpovídá na gcx11
Neaktivní uživatel:3.5.2017 21:24

Java (a nejen Java) totiž při konverzi z doublu na int zahodí desetinná místa, zatímco floor zaokrouhlí na největší celé číslo, které je menší než to původní.

Nahoru Odpovědět
3.5.2017 21:24
Neaktivní uživatelský účet
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
gcx11:3.5.2017 21:28

Co jsem koukal, tak i Python, ale nelíbí se mi, že musím předávět celá čísla na double, aby to počítalo "dobře".

 
Nahoru Odpovědět
3.5.2017 21:28
Avatar
Odpovídá na gcx11
Neaktivní uživatel:3.5.2017 21:31

Myslím si, že se s tím budeš muset smířit :D

Nahoru Odpovědět
3.5.2017 21:31
Neaktivní uživatelský účet
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
gcx11:3.5.2017 21:35

Musí na to být nějaký vzorec, co používá celá čísla.

 
Nahoru Odpovědět
3.5.2017 21:35
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na gcx11
Adam Ježek:3.5.2017 21:36

To je nedostatek již zastaralého 2.7, v dalších verzích je to opraveno. Jentak pro info, aktuálně nejnovější je verze 3.6, ve které se objevují veškeré novinky. Python 2.7 má jednu aktualizaci zhruba za půl roku a vývoj od roku 2014 téměř stojí, až na nějaké bezpečností aktualizace. Pokud nepotřebuješ, aby SW jel na nějaké zastaralé mašině nebo používal archaické knihovny, přejdi na 3

Editováno 3.5.2017 21:37
Nahoru Odpovědět
3.5.2017 21:36
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Adam Ježek
gcx11:3.5.2017 21:42

Jsi si jistý? Já to zkoušel na python.org a chová se to stejně jako v 3.4. A řeším hlavně, jak to je v Javě :)

 
Nahoru Odpovědět
3.5.2017 21:42
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na gcx11
Adam Ježek:3.5.2017 21:48

Ano, jsem
V Javě i spustě jiných jazycích to samozřejmě s intem nefunguje, jak už bylo řečeno, ale já opravoval tvé nesprávné tvrzení o počítání v Pythonu.

Nahoru Odpovědět
3.5.2017 21:48
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Odpovídá na Adam Ježek
Neaktivní uživatel:3.5.2017 21:52

Jenže ty opravuješ tvrzení, co tu nikdo neřekl a příklad, který nepotřebuje.

Nahoru Odpovědět
3.5.2017 21:52
Neaktivní uživatelský účet
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Adam Ježek
gcx11:3.5.2017 21:58

Řeším to, když se to desetinné číslo převede na integer. Tak vyjde 0 a ne -1. Kód na vyzkoušení:

int(-60/100)
Editováno 3.5.2017 21:58
 
Nahoru Odpovědět
3.5.2017 21:58
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Adam Ježek:3.5.2017 21:59

Napsal

Co jsem koukal, tak i Python, ale nelíbí se mi, že musím předávět celá čísla na double, aby to počítalo "dobře".

Jenže Python počítá "dobře" i bez převodu celých čísel na double. A ten komentář vyzněl tak, že by klidně použil Python, jenže se mylně domnívá, že to v Pythonu nefunguje.

Fakt, že napsání int(0.6) usekne část za tečkou jsi už zmínil.

Editováno 3.5.2017 22:01
Nahoru Odpovědět
3.5.2017 21:59
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Adam Ježek
gcx11:3.5.2017 22:21

Úplně mi vypadlo, že v Pythonu funguje

-60//100

avšak v Javě nic takového není.

 
Nahoru Odpovědět
3.5.2017 22:21
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na gcx11
Atrament:4.5.2017 1:04

Pokud chceš offset jenom za pomocí int a všechno mezi -100 až -1 má vracet -1, -200 až -101 má vracet -2 atd. tak by mohlo posloužit:

(x - (x >>> 31) * 99) / 100 // (x >>> 31) vrátí 1 pokud je x záporné, pokud je kladné tak to vrátí 0
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
4.5.2017 1:04
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Atrament
gcx11:4.5.2017 13:57

Ve skutečnosti to mám jako 160, ale chápu princip výpočtu a funguje to, díky :)

 
Nahoru Odpovědět
4.5.2017 13:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.