But the moving of Sprites looking different. E. G. One is faster then Another or any lag and jumping more then moving.
I have detected the Move(X/Y)Modifier, but I don't know its the best Way to 'restart' Loop into Listeners.
Her's the simple movement Code. The 'Waypoints' containing X/Y-Descriptor of Fields (0/0, 0/1, 0/2, 5/5 etc.), the Loop get the Class of Fields (Terrain), get his Sprite, from the Sprite the real x/y-Coordinates, and move the Sprite of the Unit about sinus/cosinus and 'Pythagoras' for the Distance from one field to another.
Using java Syntax Highlighting
- private static final int LOOP_MOVE_WIDTH = 4;
- private static final long SLEEP_TIME = 30L;
- public void run() {
- final Unit unit = model.getUnit();
- final TiledSprite unitSprite = unit.getSprite();
- Point[] way = model.getWay();
- int currentX = unit.getX(); //Feldkoordinaten
- int currentY = unit.getY();
- for(Point p:way) {
- int nextX = p.x; //Feldkoordinaten
- int nextY = p.y;
- Terrain currentTerrain = model.getTerrain(currentX, currentY);
- Terrain nextTerrain = model.getTerrain(nextX, nextY);
- Sprite currentTerrainSprite = currentTerrain.getSprite();
- int currentTerrainX = (int) currentTerrainSprite.getX(); //Pixelkoordinaten
- int currentTerrainY = (int) currentTerrainSprite.getY();
- Sprite nextTerrainSprite = nextTerrain.getSprite();
- final int nextTerrainX = (int) nextTerrainSprite.getX(); //Pixelkoordinaten
- final int nextTerrainY = (int) nextTerrainSprite.getY();
- double atan2 = Math.atan2(nextTerrainY - currentTerrainY, nextTerrainX - currentTerrainX);
- double sin = Math.sin(atan2) * LOOP_MOVE_WIDTH;
- double cos = Math.cos(atan2) * LOOP_MOVE_WIDTH;
- double distance = Math.sqrt(Math.pow(nextTerrainX - currentTerrainX, 2) +
- Math.pow(nextTerrainY - currentTerrainY, 2));
- double realX = currentTerrainX;
- double realY = currentTerrainY;
- int spriteTileId = getSpriteTileId(currentTerrainX, currentTerrainY, nextTerrainX, nextTerrainY);
- spriteTileId = (spriteTileId != 0 ? spriteTileId * 2 : 0);
- unitSprite.setCurrentTileIndex(spriteTileId);
- while(distance > 0) {
- realX+= cos;
- realY+= sin;
- final double finalX = realX;
- final double finalY = realY;
- model.postToUpdateThread(new Runnable() {
- public void run() {
- unitSprite.setPosition((int)finalX, (int)finalY);
- }
- });
- try {
- TimeUnit.MILLISECONDS.sleep(SLEEP_TIME);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- distance-= LOOP_MOVE_WIDTH;
- }
- currentX = nextX;
- currentY = nextY;
- model.postToUpdateThread(new Runnable() {
- public void run() {
- unitSprite.setPosition(nextTerrainX, nextTerrainY);
- }
- });
- unit.setX(nextX); //Feldkoordinaten
- unit.setY(nextY);
- }
- }
Parsed in 0.038 seconds, using GeSHi 1.0.8.4
