LibGdx - 朝另一个方向移动 Sprite
LibGdx - Move Sprite in the direction of another
我是 LibGdx 的新手,我还在学习中。我正在做一个小游戏项目来学习这个不错的框架。但是,我的游戏存在一些问题。我的游戏是自上而下的射击游戏。有一个人类角色(space 海军陆战队员)必须射杀一个外星人,外星人会一直朝他的方向移动,直到它死去。我的代码没有任何子弹 yet.I 能够让射手向光标方向旋转,外星人也向射手方向旋转,但我不能让外星人移动他的方向。我很确定我这样做的方法是完全错误的。我已经尝试了很多方法来修复它,但我无法修复它!谢谢你们的关注!
您可以在此处找到主要 class 的完整代码:
https://github.com/Igor-Lopes/LibGdx/blob/master/Splash.java#L125
public void moveAlien() {
float mX = 0;
float mY = 0;
int velocity = 50;
vAlien = new Vector2(-1 * (float) Math.sin(Alienbody.getAngle()) * velocity,
(float) Math.cos(Alienbody.getAngle() * velocity));
mX = (float) Math.cos(Math.toRadians(spacemarine.getRotation()));
mY = (float) Math.sin(Math.toRadians(spacemarine.getRotation()));
vAlien.x = mX;
vAlien.y = mY;
if (vAlien.len() > 0) {
vAlien = vAlien.nor();
}
vAlien.x = vAlien.x * velocity;
vAlien.y = vAlien.y * velocity;
vAlien.x += vAlien.x * Gdx.graphics.getDeltaTime();
vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();
}
public float rotateMarine() {
float angle = 0;
float mouseX = 0;
float mouseY = 0;
mouseX = Gdx.input.getX();
mouseY = 677 - Gdx.input.getY();
angle = (float) Math.toDegrees(Math.atan2(mouseX - spacemarine.getX(),
mouseY - spacemarine.getY()));
if (angle < 0)
angle += 360;
spacemarine.setRotation(angle * -1);
return angle;
}
public float rotateAlien(Sprite s, float posX, float posY) {
float angle = 0;
float mouseX = 0;
float mouseY = 0;
mouseX = posX;
mouseY = posY;
angle = (float) Math.toDegrees(Math.atan2(mouseX - s.getX(), mouseY - s.getY()));
if (angle < 0)
angle += 360;
s.setRotation(angle * -1);
return angle;
}
@Override
public void render(float delta) {
float angle;
moveAlien();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
world.step(Gdx.graphics.getDeltaTime(), 6, 2);
angle = rotateMarine();
rotateAlien(alien, spacemarine.getX(),
spacemarine.getY());
if (Gdx.input.isKeyPressed(Input.Keys.W) == true
&& spacemarine.getY() < 560) {
Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() + 4,
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.S) == true
&& spacemarine.getY() > 0) {
Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() - 4,
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.D) == true
&& spacemarine.getX() < 920) {
Marinebody.setTransform(spacemarine.getX() + 4, spacemarine.getY(),
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.A) == true
& spacemarine.getX() > 8) {
Marinebody.setTransform(spacemarine.getX() - 4, spacemarine.getY(),
angle);
}
alien.setPosition(Alienbody.getPosition().x, Alienbody.getPosition().y);
spacemarine.setPosition(Marinebody.getPosition().x, Marinebody.getPosition().y);
batch.begin();
spacemarine.draw(batch);
alien.draw(batch);
batch.end();
// stage.act();
// stage.draw();
}
我还没有足够的声望点数来添加 "comment",我不确定这是否是你的问题,但一个明确的错误是 "Y += X" 在你的 moveAlien方法就行了:vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();
我有一段时间的解决方案,但我忘记了 post。这是将敌人列表移向玩家的方法。
public void moveAlien() {
for (Aliens a : aliens) { //List of Aliens (Enemy)
Sprite s = a.getSprite(); //Get current enemy's sprite
float targetX = spacemarine.getX(); //Player's X
float targetY = spacemarine.getY(); //Player's Y
float spriteX = s.getX(); //Enemy's X
float spriteY = s.getY(); //Enemy's Y
float x2 = s.getX(); //Enemy's new X
float y2 = s.getY(); //Enemy's new Y
float angle; // We use a triangle to calculate the new trajectory
angle = (float) Math
.atan2(targetY - spriteY, targetX - spriteX);
x2 += (float) Math.cos(angle) * 125
* Gdx.graphics.getDeltaTime();
y2 += (float) Math.sin(angle) * 125
* Gdx.graphics.getDeltaTime();
s.setPosition(x2, y2); //Set enemy's new positions.
}
}
我是 LibGdx 的新手,我还在学习中。我正在做一个小游戏项目来学习这个不错的框架。但是,我的游戏存在一些问题。我的游戏是自上而下的射击游戏。有一个人类角色(space 海军陆战队员)必须射杀一个外星人,外星人会一直朝他的方向移动,直到它死去。我的代码没有任何子弹 yet.I 能够让射手向光标方向旋转,外星人也向射手方向旋转,但我不能让外星人移动他的方向。我很确定我这样做的方法是完全错误的。我已经尝试了很多方法来修复它,但我无法修复它!谢谢你们的关注! 您可以在此处找到主要 class 的完整代码: https://github.com/Igor-Lopes/LibGdx/blob/master/Splash.java#L125
public void moveAlien() {
float mX = 0;
float mY = 0;
int velocity = 50;
vAlien = new Vector2(-1 * (float) Math.sin(Alienbody.getAngle()) * velocity,
(float) Math.cos(Alienbody.getAngle() * velocity));
mX = (float) Math.cos(Math.toRadians(spacemarine.getRotation()));
mY = (float) Math.sin(Math.toRadians(spacemarine.getRotation()));
vAlien.x = mX;
vAlien.y = mY;
if (vAlien.len() > 0) {
vAlien = vAlien.nor();
}
vAlien.x = vAlien.x * velocity;
vAlien.y = vAlien.y * velocity;
vAlien.x += vAlien.x * Gdx.graphics.getDeltaTime();
vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();
}
public float rotateMarine() {
float angle = 0;
float mouseX = 0;
float mouseY = 0;
mouseX = Gdx.input.getX();
mouseY = 677 - Gdx.input.getY();
angle = (float) Math.toDegrees(Math.atan2(mouseX - spacemarine.getX(),
mouseY - spacemarine.getY()));
if (angle < 0)
angle += 360;
spacemarine.setRotation(angle * -1);
return angle;
}
public float rotateAlien(Sprite s, float posX, float posY) {
float angle = 0;
float mouseX = 0;
float mouseY = 0;
mouseX = posX;
mouseY = posY;
angle = (float) Math.toDegrees(Math.atan2(mouseX - s.getX(), mouseY - s.getY()));
if (angle < 0)
angle += 360;
s.setRotation(angle * -1);
return angle;
}
@Override
public void render(float delta) {
float angle;
moveAlien();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
world.step(Gdx.graphics.getDeltaTime(), 6, 2);
angle = rotateMarine();
rotateAlien(alien, spacemarine.getX(),
spacemarine.getY());
if (Gdx.input.isKeyPressed(Input.Keys.W) == true
&& spacemarine.getY() < 560) {
Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() + 4,
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.S) == true
&& spacemarine.getY() > 0) {
Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() - 4,
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.D) == true
&& spacemarine.getX() < 920) {
Marinebody.setTransform(spacemarine.getX() + 4, spacemarine.getY(),
angle);
}
if (Gdx.input.isKeyPressed(Input.Keys.A) == true
& spacemarine.getX() > 8) {
Marinebody.setTransform(spacemarine.getX() - 4, spacemarine.getY(),
angle);
}
alien.setPosition(Alienbody.getPosition().x, Alienbody.getPosition().y);
spacemarine.setPosition(Marinebody.getPosition().x, Marinebody.getPosition().y);
batch.begin();
spacemarine.draw(batch);
alien.draw(batch);
batch.end();
// stage.act();
// stage.draw();
}
我还没有足够的声望点数来添加 "comment",我不确定这是否是你的问题,但一个明确的错误是 "Y += X" 在你的 moveAlien方法就行了:vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();
我有一段时间的解决方案,但我忘记了 post。这是将敌人列表移向玩家的方法。
public void moveAlien() {
for (Aliens a : aliens) { //List of Aliens (Enemy)
Sprite s = a.getSprite(); //Get current enemy's sprite
float targetX = spacemarine.getX(); //Player's X
float targetY = spacemarine.getY(); //Player's Y
float spriteX = s.getX(); //Enemy's X
float spriteY = s.getY(); //Enemy's Y
float x2 = s.getX(); //Enemy's new X
float y2 = s.getY(); //Enemy's new Y
float angle; // We use a triangle to calculate the new trajectory
angle = (float) Math
.atan2(targetY - spriteY, targetX - spriteX);
x2 += (float) Math.cos(angle) * 125
* Gdx.graphics.getDeltaTime();
y2 += (float) Math.sin(angle) * 125
* Gdx.graphics.getDeltaTime();
s.setPosition(x2, y2); //Set enemy's new positions.
}
}