NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:31.12.2012 19:05

Zdravím, píši izometrický editor map a mám problém s kolizí myši a kosočtverců na mapě. Používám přístup zig-zag (viz obrázek), diamant se mi nelíbil. Proot nemůžu použít kód Luboš Běhounek Satika nebo nevím, jak ho upravit.

Našel jsem řešení, které však bylo pro mřížku se stejně širokými sprity, mé mají 64x32. Když jsem ho upravil, funguje nepřesně:

private Point PoziceNaMape(Point souradnice)
{
            int x = souradnice.X;
            int y = souradnice.Y;

            int xFromColCenter = x % 64 - 64 / 2;
            int yFromRowCenter = y % 32 - 32 / 2;
            int col = (x - xFromColCenter) / 64;
            int row = (y - yFromRowCenter) / 32;
            if (yFromRowCenter < xFromColCenter)
            {
                if (yFromRowCenter < (-xFromColCenter)) --row;
                else ++col;
            }
            else if (yFromRowCenter > xFromColCenter)
            {
                if (yFromRowCenter < (-xFromColCenter)) --col;
                else ++row;
            }

            return new Point(col, row);
}

Díky za nápady :)

Editováno 31.12.2012 19:06
Odpovědět
31.12.2012 19:05
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:31.12.2012 19:36

Tak nic, udělám to tím diamantem, tohle je moc složité :)

Nahoru Odpovědět
31.12.2012 19:36
New kid back on the block with a R.I.P
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Hartinger
TomBen:31.12.2012 20:04

Trochu jsem na to koukal.
Asi by se muselo pro všechny středy kosočtverců v jejichž obdélníku opsaném se bod myši nachází určit jestli se ten bod nachází v té které polorovině dělené spojicí vrcholů.

http://maths.cz/…-primce.html

Skoro bych myslel, že existuje nějaké velice jednoduché řešení výpočtem,
ale asi bych sprostě udělal pro jeden opsaný obdélník pixelovou masku
a s tou to nadrzo porovnal.

Nahoru Odpovědět
31.12.2012 20:04
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:31.12.2012 22:37

Možná jsem to udělal trochu složitějším postupem, ale výsledná funkce je jednoduchá. Je to v Javě, ale snad to zvládneš přepsat :)

class Mapa {

    public static void main(String[] args) {
        boolean assertsEnabled = false;
        assert assertsEnabled = true;
        if (!assertsEnabled)
            throw new RuntimeException("Assert se zapíná parametrem -ea");
        //       Obrazovka   Hra
        Kontrola(0,0,       0,10, "levý horní");
        Kontrola(640,0,    10,20, "pravý horní");
        Kontrola(640,640,  20,10, "pravý dolní");
        Kontrola(0,640,    10, 0, "levý dolní");
    }

    private static void Kontrola(int x1, int y1, int x2, int y2,
            String text) {
        Point mys = new Point(x1,y1);
        Point mapa = new Point(x2,y2);
        assert PoziceNaMape(mys).toString().equals(mapa.toString()) :
            "mys: "+mys.toString()+" => mapa má být: "+mapa.toString()+
            " je: "+PoziceNaMape(mys).toString() + "; "+text;
    }

    private static Point PoziceNaMape(Point souradnice) {
        return new Point((souradnice.getX()+souradnice.getY())/64,
            10+(souradnice.getX()-souradnice.getY())/64);
    }
}
Nahoru Odpovědět
31.12.2012 22:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:31.12.2012 22:46

Nakonec jsem to přepsal do toho diamantu, nicméně pořád to nefunguje :( Mám tam následující kód (vlastně obdoba toho tvého):

PointF mapPoint = new PointF();
souradnice.X /= (64 / 2);
souradnice.Y /= (64 / 4);
mapPoint.X = (souradnice.X + souradnice.Y) / 2;
mapPoint.Y = (souradnice.X - souradnice.Y) / 2;

Souřadnice dávají smysl, ale reagují tak +- políčko, je to velmi nepřesné. Potřeboval bych to přesně na hrany těch kosočtverců. souradnice je pozice kurzoru myši v oknu, políčko je 64x32. Výsledné souřadnice na mapě jsou mapPoint. Přikládám obrázek.

Nahoru Odpovědět
31.12.2012 22:46
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:31.12.2012 22:53

Zkus to takhle. Měl by ses přitom zbavit i toho nepříjemného side-effectu.

PointF mapPoint = new PointF();
mapPoint.X = (souradnice.X + souradnice.Y * 2) / 64;
mapPoint.Y = (souradnice.X - souradnice.Y * 2) / 64;
Nahoru Odpovědět
31.12.2012 22:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:31.12.2012 23:03

Už to jede, díky! :)

Nahoru Odpovědět
31.12.2012 23:03
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:31.12.2012 23:07

Není zač. Zkusil jsem si na tom TDD přesně tak, jak se má dělat. Nejdřív test, potom program. Je to o něco zábavnější.

Nahoru Odpovědět
31.12.2012 23:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:31.12.2012 23:20

Stejně je mi záhadou, že ti nevadil ten side-effect na objektu souradnice. Vždyť ti to muselo udělat v aplikaci docela zmatek.

Nahoru Odpovědět
31.12.2012 23:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:31.12.2012 23:35

Teď jsem si to refaktoroval. Je to paráda. Když máš test, tak si lehce ověříš, že to stále funguje. Nakonec jsem to přidal jako další metodu do třídy Point. Tím mi odpadlo pár getterů...

public Point izometricky64() {
    return new Point((this.X + this.Y * 2) / 64, (this.X - this.Y * 2) / 64);
}
Nahoru Odpovědět
31.12.2012 23:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 10 zpráv z 10.