dermetfan

evtl solution André Lopes collision doesSpriteFit

Oct 14th, 2013
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package br.enemies_aux;
  2.  
  3. import br.enemies.Enemy_Extend;
  4. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  5. import com.badlogic.gdx.maps.tiled.TiledMapTileLayer;
  6. import com.badlogic.gdx.math.Vector2;
  7.  
  8. /**
  9.  *
  10.  * @author André Vinícius Lopes  + Robin Stu ( Sorry for that ) :D
  11.  */
  12. public class EnemyMovement {
  13.  
  14.     private static final String BLOCKED = "blocked";
  15.     private static final String SLOPED = "slope";
  16.     public static final int DIRECTION_RIGHT = 0;
  17.     public static final int DIRECTION_LEFT = -1;
  18.     public static final int DIRECTION_VERY_CLOSE = 11;
  19.  
  20.     private static TiledMapTileLayer.Cell cellAnalyze;
  21.  
  22.     public static void updateMovementGround(float delta, Vector2 velocity, float gravity, float speed, TiledMapTileLayer collisionLayer, int tileWidth, int tileHeight, TextureRegion currentFrame, int direction, float jump, Enemy_Extend enemy) {
  23.  
  24.         //Initialize
  25.         float oldX, oldY;
  26.         boolean slopesBottom = false;
  27.         boolean collidesBottom = false;
  28.         boolean collidesRight = false;
  29.         boolean collidesLeft = false;
  30.  
  31.         boolean slopesLeft = false;
  32.         boolean slopesRight = false;
  33.         boolean slopesTop;
  34.         boolean collidesTop;
  35.  
  36.         oldX = enemy.getX();
  37.         oldY = enemy.getY();
  38.  
  39.         velocity.y -= gravity * delta;
  40.  
  41.         if (velocity.y > speed) {
  42.             velocity.y = speed;
  43.         } else if (velocity.y < -speed) {
  44.             velocity.y = -speed;
  45.         }
  46.  
  47.         if (enemy.direction == DIRECTION_RIGHT) {
  48.             enemy.velocity.x = enemy.speed;
  49.         } else if (enemy.direction == DIRECTION_LEFT) {
  50.             enemy.velocity.x = -enemy.speed;
  51.         }
  52.  
  53.         enemy.setY((enemy.getY() + velocity.y * delta));
  54.  
  55.         if (velocity.y < 0) {
  56.             slopesBottom = slopesBottom(collisionLayer, enemy);
  57.             collidesBottom = collidesBottom(collisionLayer, enemy);
  58.         }
  59.  
  60.         if (velocity.y > 0) {
  61.             slopesTop = slopesTop(collisionLayer, enemy);
  62.             collidesTop = collidesTop(collisionLayer, enemy);
  63.         }
  64.  
  65.         if (collidesBottom && !slopesBottom) {
  66.             enemy.velocity.y = 0;
  67.             enemy.setY(oldY);
  68.         }
  69.  
  70.         /////////////////////////
  71.         //AnalyzeSlopes in Y
  72.         if (slopesBottom) {
  73.             enemy.setY(oldY + (0.8f * 4)); // Because its senofTheta
  74.         }
  75.  
  76. //////////////////////////////////////////////////////////////////////////////
  77.         //Analyze X  
  78. //////////////////////////////////////////////////////////////////////////////
  79.         enemy.setX((enemy.getX() + velocity.x * delta));
  80.  
  81.         boolean canJumpObstacle = false;
  82.  
  83.         if (velocity.x < 0) {
  84.             slopesLeft = slopesLeft(collisionLayer, enemy);
  85.             collidesLeft = collidesLeft(collisionLayer, enemy);
  86.         }
  87.         if (velocity.x > 0) {
  88.             slopesRight = slopesRight(collisionLayer, enemy);
  89.             collidesRight = collidesRight(collisionLayer, enemy);
  90.         }
  91.  
  92.         if (collidesRight) {
  93.             enemy.setX(oldX);
  94.             if (!slopesBottom && !slopesRight) {
  95.  
  96.             }
  97.         }
  98.  
  99.         if (collidesLeft) {
  100.             enemy.setX(oldX);
  101.             if (!slopesBottom && !slopesLeft) {
  102.                 canJumpObstacle = canJumpObstacle(collisionLayer, enemy);
  103.             }
  104.         }
  105.         System.out.println("\n" + System.nanoTime());
  106.         System.out.println("Collides Right :" + collidesRight);
  107.         System.out.println("Collides Left :" + collidesLeft);
  108.         System.out.println("Can Jump Obstacle  :" + canJumpObstacle);
  109.  
  110.         if ((collidesRight || collidesLeft) && !canJumpObstacle) {
  111.  
  112.             if (enemy.direction == DIRECTION_LEFT) {
  113.                 enemy.direction = DIRECTION_RIGHT;
  114.             } else {
  115.                 enemy.direction = DIRECTION_LEFT;
  116.             }
  117.         }
  118.  
  119.     }
  120.  
  121.     public static void updateMovementWizard(float delta, Vector2 velocity, float gravity, float speed, TiledMapTileLayer collisionLayer, int tileWidth, int tileHeight, TextureRegion currentFrame, int direction, float jump, int state, Enemy_Extend enemy) {
  122.  
  123.     }
  124.  
  125.     public static void updateMovementMovXAxis(float delta, Vector2 velocity, float gravity, float speed, TiledMapTileLayer collisionLayer, TextureRegion currentFrame, int xiLimit, int xfLimit, boolean limitIsValid, Enemy_Extend enemy) {
  126.  
  127.     }
  128.  
  129. //////////////////////////////////////////////////////////////////////////////
  130.     //Cell Analyzers
  131. //////////////////////////////////////////////////////////////////////////////
  132.     private static boolean canJumpObstacle(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  133.  
  134.         System.out.println("VX = " + enemy.velocity.x);
  135.         System.out.println("VY = " + enemy.velocity.y);
  136.  
  137.         if (enemy.velocity.x >= 0) {
  138.             for (float tileEye = 0; tileEye <= (enemy.jump); tileEye += collisionLayer.getTileHeight() / 2) {
  139.  
  140.                 float x = enemy.getX() + enemy.getWidth() + collisionLayer.getTileHeight() / 2;
  141.                 float y = enemy.getY() + tileEye;
  142.  
  143.                 if (!isCellBlocked(x, y, collisionLayer)) {
  144.  
  145.                     boolean doesTheSpriteFit = doesTheSpriteFit(tileEye, collisionLayer, enemy);
  146.  
  147.                     if (doesTheSpriteFit) {
  148.                         enemy.setY((y));
  149.                         return true;
  150.                     }
  151.                 }
  152.             }
  153.         } else if (enemy.velocity.x < 0) {
  154.  
  155.             for (float tileEye = 0; tileEye < enemy.getHeight() + (enemy.jump); tileEye += collisionLayer.getTileHeight() / 2) {
  156.  
  157.                 float x = enemy.getX() - (collisionLayer.getTileHeight() / 2);
  158.                 float y = enemy.getY() + tileEye;
  159.  
  160.                 if (!isCellBlocked(x, y, collisionLayer)) {
  161.  
  162.                     boolean doesTheSpriteFit = doesTheSpriteFit(tileEye, collisionLayer, enemy);
  163.  
  164.                     if (doesTheSpriteFit) {
  165.                         enemy.setY((y));
  166.                         return true;
  167.                     }
  168.                 }
  169.             }
  170.  
  171.         }
  172.  
  173.         return false;
  174.     }
  175.  
  176.     private static boolean doesTheSpriteFit(float tileEye, TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  177.  
  178.         boolean spriteFit = true;
  179.  
  180.         if (enemy.velocity.x > 0) {
  181.             for (float auxtileEye = tileEye; auxtileEye <= (enemy.getHeight()); auxtileEye += collisionLayer.getTileHeight() / 2) {
  182.  
  183.                 float xi = enemy.getX() + enemy.getWidth() + collisionLayer.getTileHeight() / 2;
  184.                 float yi = enemy.getY() + auxtileEye;
  185.  
  186.                 if (isCellBlocked(xi, yi, collisionLayer)) {
  187.                     spriteFit = false;
  188.                     break;
  189.                 }
  190.             }
  191.  
  192.         }
  193.  
  194.         if (enemy.velocity.x == 0) {
  195.         for (float auxtileEye = tileEye; auxtileEye <= (enemy.getHeight()); auxtileEye += collisionLayer.getTileHeight() / 2) {
  196.  
  197.                 float xi = enemy.getX() + enemy.getWidth() / 2;
  198.                 float yi = enemy.getY() + auxtileEye;
  199.  
  200.                 if (isCellBlocked(xi, yi, collisionLayer)) {
  201.                     spriteFit = false;
  202.                     break;
  203.                 }
  204.             }
  205.         }
  206.  
  207.         if (enemy.velocity.x < 0) {
  208.             for (float auxtileEye = tileEye; auxtileEye <= (-enemy.getHeight()); auxtileEye -= collisionLayer.getTileHeight() / 2) {
  209.  
  210.                 float xi = enemy.getX() + enemy.getWidth() - collisionLayer.getTileHeight() / 2;
  211.                 float yi = enemy.getY() - auxtileEye;
  212.  
  213.                 if (isCellBlocked(xi, yi, collisionLayer)) {
  214.                     spriteFit = false;
  215.                     break;
  216.                 }
  217.  
  218.             }
  219.         }
  220.  
  221.         return spriteFit;
  222.     }
  223.  
  224. //////////////////////////////////////////////////////////////////////////////
  225.     private static boolean isCellSloped(float x, float y, TiledMapTileLayer collisionLayer) {
  226.  
  227.         cellAnalyze = collisionLayer.getCell((int) (x / collisionLayer.getTileWidth()), (int) (y / collisionLayer.getTileHeight()));
  228.  
  229.         if (cellAnalyze != null && cellAnalyze.getTile() != null && cellAnalyze.getTile().getProperties().containsKey(SLOPED)) {
  230.             return true;
  231.         } else {
  232.             return false;
  233.         }
  234.     }
  235.  
  236.     public static boolean slopesRight(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  237.         for (float step = 0; step < enemy.getHeight(); step += collisionLayer.getTileHeight() / 2) {
  238.             if (isCellSloped(enemy.getX() + enemy.getWidth(), enemy.getY() + step, collisionLayer)) {
  239.                 return true;
  240.             }
  241.         }
  242.         return false;
  243.     }
  244.  
  245.     public static boolean slopesLeft(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  246.         for (float step = 0; step < enemy.getHeight(); step += collisionLayer.getTileHeight() / 2) {
  247.             if (isCellSloped(enemy.getX(), enemy.getY() + step, collisionLayer)) {
  248.                 return true;
  249.             }
  250.         }
  251.         return false;
  252.     }
  253.  
  254.     public static boolean slopesTop(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  255.         for (float step = 0; step < enemy.getWidth(); step += collisionLayer.getTileWidth() / 2) {
  256.             if (isCellSloped(enemy.getX() + step, enemy.getY() + enemy.getHeight(), collisionLayer)) {
  257.                 return true;
  258.             }
  259.         }
  260.         return false;
  261.  
  262.     }
  263.  
  264.     public static boolean slopesBottom(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  265.         for (float step = 0; step < enemy.getWidth(); step += collisionLayer.getTileWidth() / 2) {
  266.             if (isCellSloped(enemy.getX() + step, enemy.getY(), collisionLayer)) {
  267.                 return true;
  268.             }
  269.         }
  270.         return false;
  271.     }
  272.  
  273.     //Block :
  274.     private static boolean isCellBlocked(float x, float y, TiledMapTileLayer collisionLayer) {
  275.  
  276.         cellAnalyze = collisionLayer.getCell((int) (x / collisionLayer.getTileWidth()), (int) (y / collisionLayer.getTileHeight()));
  277.  
  278.         if (cellAnalyze != null && cellAnalyze.getTile() != null && cellAnalyze.getTile().getProperties().containsKey(BLOCKED)) {
  279.             return true;
  280.         } else {
  281.             return false;
  282.         }
  283.     }
  284.  
  285.     public static boolean collidesRight(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  286.         for (float step = 0; step < enemy.getHeight(); step += collisionLayer.getTileHeight() / 2) {
  287.             if (isCellBlocked(enemy.getX() + enemy.getWidth(), enemy.getY() + step, collisionLayer)) {
  288.                 return true;
  289.             }
  290.         }
  291.         return false;
  292.     }
  293.  
  294.     public static boolean collidesLeft(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  295.         for (float step = 0; step < enemy.getHeight(); step += collisionLayer.getTileHeight() / 2) {
  296.             if (isCellBlocked(enemy.getX(), enemy.getY() + step, collisionLayer)) {
  297.                 return true;
  298.             }
  299.         }
  300.         return false;
  301.     }
  302.  
  303.     public static boolean collidesTop(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  304.         for (float step = 0; step < enemy.getWidth(); step += collisionLayer.getTileWidth() / 2) {
  305.             if (isCellBlocked(enemy.getX() + step, enemy.getY() + enemy.getHeight(), collisionLayer)) {
  306.                 return true;
  307.             }
  308.         }
  309.         return false;
  310.  
  311.     }
  312.  
  313.     public static boolean collidesBottom(TiledMapTileLayer collisionLayer, Enemy_Extend enemy) {
  314.         for (float step = 0; step < enemy.getWidth(); step += collisionLayer.getTileWidth() / 2) {
  315.             if (isCellBlocked(enemy.getX() + step, enemy.getY(), collisionLayer)) {
  316.                 return true;
  317.             }
  318.         }
  319.         return false;
  320.     }
  321.  
  322.     public static int getOpposedPlayedSide(int playerPosX, int enemyPosX) {
  323.         if (playerPosX == enemyPosX) {
  324.             //System.out.println("Dont Halt! - Too Close!");
  325.             return DIRECTION_VERY_CLOSE;
  326.         } else if (playerPosX > enemyPosX) {
  327.             //System.out.println("Player is to the Right");
  328.             return DIRECTION_LEFT;
  329.         } else if (playerPosX < enemyPosX) {
  330.             //System.out.println("Player is to the Left");
  331.             return DIRECTION_RIGHT;
  332.         }
  333.  
  334.         System.out.println("Error! EnemyMovement.Direction");
  335.         return DIRECTION_VERY_CLOSE;
  336.     }
  337.  
  338.     public static int getPlayerSide(int playerPosX, int enemyPosX) {
  339.         if (playerPosX == enemyPosX) {
  340.             //System.out.println("Halt! - Too Close!");
  341.             return DIRECTION_VERY_CLOSE;
  342.         } else if (playerPosX > enemyPosX) {
  343.             //System.out.println("Player is to the Right");
  344.             return DIRECTION_RIGHT;
  345.         } else if (playerPosX < enemyPosX) {
  346.             //System.out.println("Player is to the Left");
  347.             return DIRECTION_LEFT;
  348.         }
  349.  
  350.         System.out.println("Error! EnemyMovement.Direction");
  351.         return DIRECTION_VERY_CLOSE;
  352.  
  353.     }
  354.  
  355. }
Advertisement
Add Comment
Please, Sign In to add comment