Diskuze: Izometrická kolize
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Vlastník
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tak nic, udělám to tím diamantem, tohle je moc složité
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ů.
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.
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);
}
}
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.
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;
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ší.
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.
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);
}
Zobrazeno 10 zpráv z 10.