One of the problems that i face is when i shoot arrows, things go way slower.
In desktop its ok, but in my android… jesus… It goes slow.
Video of Profile Analyzer of Netbeans
And here are the Arrow Classes…
package br.weapons;
import br.enemies_aux.SmokeEffect;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.maps.tiled.TiledMapTileLayer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;
public class Arrow {
private static int xVertice = -1;
public int type_Arrow;
public int posX, posY, shotPosX;
public int damage;
public double shotAngle, movingAngle;
public Sprite sprite;
public int manaWaste = 0;
public int shotToQuadrant = -1;
public double frameTime;
public Vector3 touch;
public Vector2 vector;
public boolean isInsideWindow;
public boolean hit = false;
public boolean toRemoveThis = false;
public SmokeEffect smokeEffect;
private TiledMapTileLayer.Cell Cell_Temp;
public Arrow(double posX, double posY, double angle, int quadrant) {
shotPosX = (int) posX;
this.posX = (int) posX;
this.posY = (int) posY;
this.shotAngle = angle;
frameTime = 0;
isInsideWindow = true;
smokeEffect = new SmokeEffect();
damage = 0;
shotToQuadrant = quadrant;
touch = new Vector3();
vector = new Vector2();
//System.out.println("Shot To Quadrant : " + shotToQuadrant);
}
public void render(SpriteBatch sb) {
if (hit) {
smokeEffect.render(sb, posX, posY);
if (smokeEffect.isFinished()) {
toRemoveThis = true;
}
} else {
if (toRemoveThis == false) {
//System.out.println("Sprite Rotation" + (float) toDegrees(shotAngle));
sprite.setPosition(posX, posY);
sprite.draw(sb);
}
}
}
public void update(TiledMapTileLayer collisionLayer, Camera camera) {
if (hit == false) {
lookNearbyCells(collisionLayer);
posX = (int) ArrowBallistic.getSX(posX, posY, ArrowBallistic.vo, ArrowBallistic.gravity, shotAngle, frameTime);
posY = (int) ArrowBallistic.getSY(posY, ArrowBallistic.vo, ArrowBallistic.gravity, shotAngle, frameTime);
//Will Fix this soon.
//movingAngle = ArrowBallistic.getMovingAngle(shotAngle, shotPosX, posX, shotToQuadrant);
sprite.setRotation((float) Math.toDegrees(shotAngle));
frameTime += 0.1; //0.001
touch.set(posX, posY, 0);
camera.project(touch);
vector.set(touch.x, touch.y);
isInsideWindow = (vector.x > (-Gdx.graphics.getWidth()) && vector.x < (Gdx.graphics.getWidth() * 2)) && (vector.y > (-Gdx.graphics.getHeight()));
if (!isInsideWindow) {
toRemoveThis = true;
}
}
}
public boolean isIsInsideWindow() {
return isInsideWindow;
}
public void lookNearbyCells(TiledMapTileLayer collisionLayer) {
boolean blocked = false;
boolean slope = false;
for (int i = 0; i < 3; i++) {
Cell_Temp = collisionLayer.getCell((int) (((posX + ((sprite.getWidth() / 2) * i)) / 16)), (int) (((posY + ((sprite.getHeight() / 2) * i)) / 16)));
if (Cell_Temp != null) {
blocked = Cell_Temp.getTile().getProperties().containsKey(ArrowInfo.BLOCKED);
slope = Cell_Temp.getTile().getProperties().containsKey(ArrowInfo.SLOPED);
if (blocked || slope) {
toRemoveThis = true;
}
}
for (int j = 0; j < 3; j++) {
Cell_Temp = collisionLayer.getCell((int) (((posX + ((sprite.getWidth() / 2) * i)) / 16)), (int) (((posY + ((sprite.getHeight() / 2) * j)) / 16)));
if (Cell_Temp != null) {
blocked = Cell_Temp.getTile().getProperties().containsKey(ArrowInfo.BLOCKED);
slope = Cell_Temp.getTile().getProperties().containsKey(ArrowInfo.SLOPED);
if (blocked || slope) {
toRemoveThis = true;
}
}
}
}
}
public boolean isToRemoveThis() {
return toRemoveThis;
}
public void setArrowHitSomething() {
hit = true;
}
public Rectangle getFrameRectangle() {
Rectangle frameRectangle = new Rectangle();
frameRectangle.height = sprite.getRegionHeight();
frameRectangle.width = sprite.getRegionWidth();
frameRectangle.x = posX;
frameRectangle.y = posY;
return frameRectangle;
}
public void dispose() {
smokeEffect.dispose();
}
}
package br.weapons.arrows;
import br.dir.DirectoriesWeapons;
import br.weapons.Arrow;
import br.weapons.ArrowInfo;
import com.badlogic.gdx.math.Rectangle;
import static java.lang.Math.toDegrees;
public class LightArrow extends Arrow {
public LightArrow(double posX, double posY, double angle, int quadrant) {
super(posX, posY, angle, quadrant);
damage = 20;
type_Arrow = ArrowInfo.light_Arrow;
DirectoriesWeapons directoriesWeapons = new DirectoriesWeapons();
sprite = directoriesWeapons.getLightArrow();
sprite.setRotation((float) toDegrees(shotAngle));
directoriesWeapons = null;
}
@Override
public Rectangle getFrameRectangle() {
Rectangle frameRectangle = new Rectangle();
frameRectangle.width = 40;
frameRectangle.height = 6;
frameRectangle.x = posX;
frameRectangle.y = posY;
return frameRectangle;
}
@Override
public void dispose() {
try {
sprite.getTexture().dispose();
smokeEffect.setFinished();
smokeEffect.dispose();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
World Update
public void updateAndRenderArrows(SpriteBatch spriteBatch, float delta) {
camera = current_Level.camera;
for (int i = 0; i < arrows.size; i++) {
Arrow arrow_TEMP = arrows.get(i);
for (int k = 0; k < enemies.size; k++) {
if (!arrow_TEMP.hit) {
Rectangle arrowRect = arrow_TEMP.getFrameRectangle();
Rectangle enemyRect = enemies.get(k).getFrameRectangle();
if (arrowRect.overlaps(enemyRect)) {
enemies.get(k).beingHit(arrow_TEMP.damage);
arrow_TEMP.setArrowHitSomething();
}
}
}
if (!arrow_TEMP.isToRemoveThis()) {
arrow_TEMP.update(collisionLayer, camera);
arrow_TEMP.render(spriteBatch);
} else {
arrows.removeIndex(i);
arrow_TEMP.dispose();
arrow_TEMP = null;
}
}
}