Diskuze: Izometrická kolize

C# .NET .NET (C# a Visual Basic) Izometrická kolize American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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 (Satik)a 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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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

Nahoru Odpovědět 31.12.2012 19:36
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Čápka
TomBen:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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 Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 31.12.2012 23:03
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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  +1 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.