Egy egyszerű játékmotort építettem a SurfaceView segítségével.
Egy RectF-et használok „kamera” ablakként, hogy megjelenítsem a SurfaceView vászon méretezett pixelszélességét és magasságát, és kitaláljam, mi van a képernyőn.
A canvas.translate-t használom, hogy oda lépjek, ahová a kamera „mutat”. Íme a húzóhurok:
mCamera.UpdateCamera();
scaleWorld(c, mCamera);
c.translate(-mScreen.left, mScreen.top - miHeight
* (1 / mCamera.getScaleLevel()));
drawBehavior.drawGame(c);
Mindenesetre, ha lövök egy lövedéket, a játék zökkenőmentesen jelenik meg, és nem látok fekete vizuális felvillanást, ami az a szín, amelyet a vászon öblítésére használok.
Ha azonban azonnal megváltoztatom azt, amit a kamera lát, esetleg 3 vagy több „képernyővel” távolabb, gyakran, de nem mindig, fekete felvillan. Néha "szerencsém" van, és az átmenet zökkenőmentes.
Ezek a felvillanások általában a bittérképeim pozíciójában vannak, mivel a talajt és a hátteret rekurzívan rajzolom meg egy vagy két bittérkép segítségével.
Nekem úgy tűnt, hogy a hirtelen változás okozta a problémát, ezért megpróbáltam lényegében a gameLoop szálat kukába rakni, hogy mindent leállítsak, majd beállítani az új Rect koordinátákat, majd újraindítani egy másik szállal, de ez nem működik.
Gondolom, belegondolva, egyszerűen csak késleltetem a rendszer „sokkját” azzal, hogy ezt tettem, nem kezeltem.
Mielőtt megpróbálnám a szőnyeg alá söpörni ezt a talán szörnyű tervet, esetleg elhalványítással vagy más vizuális trükkel, kíváncsi vagyok, van-e valakinek mélyebb megértése a témában, és el tudna vezetni egy elegánsabb megoldáshoz.