我在Android OpenGL中有一个精灵。这个精灵(一个小的beetlebug)总是向前移动,我使用:
sprite.setPosition(posX, posY);
现在我有一个旋转方法,当用户向左或向右移动错误时:
private void applyRotation() {
for(int i=0;i<beetleBug.size;i++) {
Sprite s = beetleBug.get(i);
s.setOrigin(s.getWidth() / 2, s.getHeight() / 2);
s.setRotation(angle);
}
}
现在当虫子向前移动时,他总是这样做,必须计算新的x和y坐标,这取决于旋转角度,这样虫子总是向前移动。有人有算法通过旋转角度来计算方向吗?
以下是整个Bug类:
public class Bug {
private SpriteBatch spriteBatch = null;
private TextureAtlas spriteSheet;
private Array<Sprite> beetleBug;
private int currentFrame = 0;
private final float frameLength = 0.10f; //in seconds, how long a frame last
private float animationElapsed = 0.0f;
private float angle = 0.0f;
private float posX = 0.0f;
private float posY = 0.0f;
private float sizeX = 100.0f;
private float sizeY = 100.0f;
private float offSet = 50.0f;
public Bug() {
spriteBatch = new SpriteBatch();
spriteSheet = new TextureAtlas("assets/data/bug.txt");
beetleBug = spriteSheet.createSprites("bug");
// dont forget to set the size of your sprites!
for(int i=0; i<beetleBug.size; i++){
beetleBug.get(i).setSize(sizeX, sizeY);
}
applyPosition();
}
public void handleInput() {
boolean leftKey = Gdx.input.isKeyPressed(Input.Keys.LEFT);
boolean rightKey = Gdx.input.isKeyPressed(Input.Keys.RIGHT);
if(rightKey) {
if(angle <= 0) {
angle = 360;
}
angle -= 2f;
applyRotation();
}
if(leftKey) {
if(angle >= 360) {
angle = 0;
}
angle += 2f;
applyRotation();
}
applyPosition();
}
private void applyPosition() {
float x = (float) Math.cos(angle);
float y = (float) Math.sin(angle);
posX = posX + x;
posY = posY + y;
for(int i=0; i<beetleBug.size; i++){
beetleBug.get(i).setPosition(posX - offSet, posY -offSet); // optional: center the sprite to screen
}
}
private void applyRotation() {
for(int i=0;i<beetleBug.size;i++) {
Sprite s = beetleBug.get(i);
s.setOrigin(s.getWidth() / 2, s.getHeight() / 2);
s.setRotation(angle);
}
}
public void render(OrthographicCamera cam) {
float dt = Gdx.graphics.getDeltaTime();
animationElapsed += dt;
while(animationElapsed > frameLength){
animationElapsed -= frameLength;
currentFrame = (currentFrame == beetleBug.size - 1) ? 0 : ++currentFrame;
}
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
beetleBug.get(currentFrame).draw(spriteBatch);
spriteBatch.end();
}
}
答案 0 :(得分:1)
创建一个标准化矢量来表示甲虫的方向,然后乘以速度。将该矢量添加到甲虫的当前位置,你就得到了他的新位置。
vx = cos(angle), vy = sin(angle)
vx = vx*speed, vy = vy*speed
x = x + vx, y = y + vy
一些问题:注意你的精灵的图形旋转和你自己的旋转内部表示方式是一样的。一些框架会翻转它们旋转图形的方式。上述[cos(角度),sin(角度)]是指向正x轴的零角度。 cos / sin / tan的许多实现使用弧度而不是度数进行计算,因此请进行适当的转换。
[cos angle, sin angle]
向右为零(正x),逆时针为零。 [-sin angle, cos angle]
为零向上(正y),逆时针。
答案 1 :(得分:1)
现在完美地运作:
将x-coordintae设置为 -
private void applyPosition(){
float radians = (float) Math.toRadians(angle);
float x = -(float) Math.sin(radians);
float y = (float) Math.cos(radians);
posX = posX + x;
posY = posY + y;
for(int i=0; i<beetleBug.size; i++){
beetleBug.get(i).setPosition(posX - offSet, posY -offSet);
}
}
答案 2 :(得分:0)
这可能有效:
int currentX = 100; //beetleCurrentX
int currentY = 100; //beetleCurrentY
int angle = 200; //beetleAngle
int len = 2; //Step that the beetle makes (jumps 2 in this case)
int x2Pos = sin(angle)*len + currentX;
int y2Pos = cos(angle)*len + currentY;
sprite.setPosition(x2Pos,y2Pos);
如果每帧都执行此操作,您将使甲虫沿角度方向移动。