Halli Hallo,
ich sitze jetzt seit 3 Tagen an der vielleicht "einfachsten" Sache der Welt fest, komme aber wirklich nicht weiter
Und zwar soll es mal ein Tower Defense Spiel für da Android werden mit OpenGL ES.
Hier ist meine Klasse "Creep" also der Gegner, der sich durch die Tower bewegen soll.
Es wird eine Position übergeben und anhand dieser das Feld berechnet, wo sich die Figur befindet. Der Wegfindealgorithmus übernimmt Start und End Koordinaten.
Mein Problem ist jetzt, das sich die Figur beim "negativ" Bewegen immer um 1 Feld weniger nach hinten/unten bewegt als sie es sollte.
Ich habe schon unzählige Methoden durch und das ist eine davon. Ich probierte einfach immer wieder das "aktuelle" Feld als Startposition zu übergeben und mich dann weiter durchzuhangeln. Selbe ergebniss wie oben, es fehlt IMMER ein Feld.... habt ihr eine Ahnung, oder sowas schonmal gemacht
ich wäre 1000 mal dankbar.
Eine andere Frage wäre, das ist ja Frameindependent Movement. Aber wie schaffe ich es jetzt, das sich die Figur auch wirklich auf dem "Feld" bewegt und nicht ein paar Pixel weiter link/rechts oder wo anders daneben befindet? Man merkt da besonders, wenn das Spiel ruckelt und die "Sprünge"/Frame besonders groß werden.
Mfg
Oliver
ich sitze jetzt seit 3 Tagen an der vielleicht "einfachsten" Sache der Welt fest, komme aber wirklich nicht weiter
Und zwar soll es mal ein Tower Defense Spiel für da Android werden mit OpenGL ES.
Hier ist meine Klasse "Creep" also der Gegner, der sich durch die Tower bewegen soll.
Code:
package de.liquidtitan.simpletowerdefense.objects;
import android.util.FloatMath;
import android.util.Log;
import de.liquidtitan.simpletowerdefense.game.astar.AStarPathFinder;
import de.liquidtitan.simpletowerdefense.game.astar.Path;
import de.liquidtitan.simpletowerdefense.game.astar.Path.Step;
import de.liquidtitan.simpletowerdefense.game.opengl.basics.GameObject;
import de.liquidtitan.simpletowerdefense.game.opengl.math.Vector2D;
import de.liquidtitan.simpletowerdefense.game.world.World;
public class Creep extends GameObject{
private final AStarPathFinder finder;
public final Vector2D velocity=new Vector2D();
public static final float CREEP_VELOCITY=100f;
public static final int FINAL_ABS_POSITION_X=8;
public static final int FINAL_ABS_POSITION_Y=2;
public Path path=null;
private int tileX=0;
private int tileTmpX=0;
private volatile int tileY=0;
private volatile int tileTmpY=0;
public Creep(float x,float y,float width,float height,AStarPathFinder finder){
super(x,y,width,height);
this.finder=finder;
}
public void setAbsolutePosition(int x,int y){
tileX=tileTmpX=x;
tileY=tileTmpY=y;
path=finder.findPath(tileX,tileY,FINAL_ABS_POSITION_X,FINAL_ABS_POSITION_Y);
fromPathToVelocity(tileX,tileY);
}
public void update(float deltaTime){
tileX=(int)FloatMath.floor(position.x/World.FIELD_SIZE_X);
tileY=(int)FloatMath.floor(position.y/World.FIELD_SIZE_Y);
if(tileX!=tileTmpX||tileY!=tileTmpY){
tileTmpX=tileX;
tileTmpY=tileY;
int x=path.getStep(1).getX();
int y=path.getStep(1).getY();
path=finder.findPath(x,y,FINAL_ABS_POSITION_X,FINAL_ABS_POSITION_Y);
fromPathToVelocity(x,y);
}
position.add(velocity.x*deltaTime,velocity.y*deltaTime);
if(position.x<0)
position.x=0;
if(position.y<0)
position.y=0;
}
public void fromPathToVelocity(int absX,int absY){
if(path!=null){
Step step=path.getStep(1);
int stepX=step.getX();
int stepY=step.getY();
if(stepX>absX&&stepY==absY){
velocity.set(CREEP_VELOCITY,0);
}else if(stepX==absX&&stepY<absY){
velocity.set(0,-CREEP_VELOCITY);
}else if(stepX<absX&&stepY==absY){
velocity.set(-CREEP_VELOCITY,0);
}else if(stepX==absX&&stepY>absY){
velocity.set(0,CREEP_VELOCITY);
}
}else
velocity.set(0,0);
}
}
Es wird eine Position übergeben und anhand dieser das Feld berechnet, wo sich die Figur befindet. Der Wegfindealgorithmus übernimmt Start und End Koordinaten.
Mein Problem ist jetzt, das sich die Figur beim "negativ" Bewegen immer um 1 Feld weniger nach hinten/unten bewegt als sie es sollte.
Ich habe schon unzählige Methoden durch und das ist eine davon. Ich probierte einfach immer wieder das "aktuelle" Feld als Startposition zu übergeben und mich dann weiter durchzuhangeln. Selbe ergebniss wie oben, es fehlt IMMER ein Feld.... habt ihr eine Ahnung, oder sowas schonmal gemacht
Eine andere Frage wäre, das ist ja Frameindependent Movement. Aber wie schaffe ich es jetzt, das sich die Figur auch wirklich auf dem "Feld" bewegt und nicht ein paar Pixel weiter link/rechts oder wo anders daneben befindet? Man merkt da besonders, wenn das Spiel ruckelt und die "Sprünge"/Frame besonders groß werden.
Mfg
Oliver