[英]Making a bullet pass opposite sides of the screen
因此,对于编码任务,我们必须进行坦克比赛。 我使用以下方法创建了子弹类:
package com.MyName.battletanks;
import com.badlogic.gdx.graphics.g2d.Sprite;
public class Bullet {
public Sprite b;
public float vx = 0;
public float vy = 0;
public Bullet(Sprite temp) { b = temp;}
public void move() { b.translate(vx*3,vy*3);}
}
我的变量如下:
Sprite Player1;
Sprite Player2;
ArrayList<Bullet> bullets;
单击空格后,它将使用以下命令创建项目符号:
if (Gdx.input.isKeyPressed(Input.Keys.SPACE)) {
Bullet bullet = new Bullet(new Sprite(new Texture("Bullet1.png")));
bullet.b.setPosition(Player1.getX() + Player1.getWidth() / 2, Player1.getY() + Player1.getHeight() / 2);
float rotation = (float) Math.toRadians(Player1.getRotation());
bullet.vx = (float) Math.cos(rotation);
bullet.vy = (float) Math.sin(rotation);
bullets.add(bullet);
}
现在,这是我的代码,可让我的坦克穿过屏幕的一侧到达另一侧:
if (Player1.getX() > Gdx.graphics.getWidth()){
Player1.setX(-64f);
} else if(Player1.getX()<-64f){
Player1.setX(Gdx.graphics.getWidth());
}
if (Player1.getY() > Gdx.graphics.getHeight()){
Player1.setY(-64);
} else if(Player1.getY() < -64f){
Player1.setY(Gdx.graphics.getHeight());
}
现在,播放器1是一个精灵,但是,项目符号是使用arraylist和自制项目符号类创建的。 结果,我无法使用对子弹头所做的Player1的代码。 所以,我的问题是,如何让我的子弹传递到屏幕的另一侧?
您可以使用模%
运算符执行%
操作:
bullet.position.x %= Gdx.graphics.getWidth();
bullet.position.y %= Gdx.graphics.getHeight();
这未经测试,但可以正常工作。 另外,我注意到您为速度使用了2个浮点,并且您确实应该使用Vector2
因为这样您就可以轻松缩放和标准化它,这对速度很有用。
对于Player
类和Bullet
类而言,这实际上是相同的,因为您具有相同的屏幕空间,因此您可以通过将当前代码转换为带有任何sprite的函数来重用当前代码。 该功能的定义如下:
void fitOnScreen(Sprite sprite) {
if (sprite.getX() > Gdx.graphics.getWidth()){
sprite.setX(-64f);
} else if(sprite.getX()<-64f){
sprite.setX(Gdx.graphics.getWidth());
}
if (sprite.getY() > Gdx.graphics.getHeight()){
sprite.setY(-64);
} else if(sprite.getY() < -64f){
sprite.setY(Gdx.graphics.getHeight());
}
}
您可以在Player
上调用此函数,还可以遍历每个项目符号,例如:
fitOnScreen(Player1);
for (Bullet b: bullets) fitOnScreen(b.b);
好吧,您要问的是如何遍历项目符号的每个实例并更改其属性。
我必须同意@Zac的算法对于一颗子弹可以正常工作,但是您需要将其放入循环中以遍历每颗子弹才能生效。
这是您可以在游戏屏幕的render()方法中执行的操作的示例:
Iterator<Bullet> it = bullets.iterator();
while(it.hasNext()) {
Bullet bullet = it.next();
// Now you do the position correction
bullet.b.setPosition(bullet.b.getX()%Gdx.graphics.getWidth(), bullet.b.getY()%Gdx.graphics.getHeight());
}
当然,还有其他方法可以这样做,但这可能是最简单的方法。 您也可以在此循环中回收用于播放器的代码。
另外,请注意,使用这种方法时,项目符号越多,应用程序就越拖延。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.