Java 在android游戏中,以固定轨迹在四个不同位置繁殖敌人
这是我的第一个android游戏,我感谢所有的帮助。我想定义4个产卵区,从屏幕外的左、右、上、下开始。来自这个区域的敌人有一个固定的轨迹到中心,当这个敌人进入屏幕时,玩家可以将他们移动到一个特定的角落,但是如果它放开它,必须计算一个新的轨迹,使其继续移动到中心 我在思考如何定义这4个区域时遇到了困难,还有4种类型的敌人它们是相同的,但它们有不同的颜色,我应该将这4个敌人放在arrayList上吗?。如果我知道如何定义这4个随机决定产卵地点的产卵区域,那么我就不知道如何定义到中心的固定轨迹。此外,还需要将速度降低到更熟练的速度。抱歉,如果我问的太多了 当前代码看起来像我正在使用的AndEngine库:Java 在android游戏中,以固定轨迹在四个不同位置繁殖敌人,java,android,android-studio,andengine,Java,Android,Android Studio,Andengine,这是我的第一个android游戏,我感谢所有的帮助。我想定义4个产卵区,从屏幕外的左、右、上、下开始。来自这个区域的敌人有一个固定的轨迹到中心,当这个敌人进入屏幕时,玩家可以将他们移动到一个特定的角落,但是如果它放开它,必须计算一个新的轨迹,使其继续移动到中心 我在思考如何定义这4个区域时遇到了困难,还有4种类型的敌人它们是相同的,但它们有不同的颜色,我应该将这4个敌人放在arrayList上吗?。如果我知道如何定义这4个随机决定产卵地点的产卵区域,那么我就不知道如何定义到中心的固定轨迹。此外,
public class gameEscene extends baseScene {
// Regions for images
private ITextureRegion BackgroundRegion;
private ITextureRegion Corner;
private ITextureRegion Center;
private ITextureRegion Marco;
// Sprites
private Sprite spriteBackground;
private Sprite spriteCorner;
private Sprite spriteCenter;
private Sprite spriteMarco;
// Enemies
private ArrayList<Enemies> listEnemies;
private ITextureRegion regionEnemy;
// Time to generate enemies
private float timeEnemies = 0; // Counter
private float TIME_LIMIT = 2.5f; // Every 2.5s it creates
@Override
public void loadResources() {
BackgroundRegion = loadImage("black.jpg");
Corner = loadImage("Corner_T.png");
Center = loadImage("Center.png");
Marco = loadImage("m.png");
regionEnemy = loadimage("ship.png");
}
private void createEnemies() {
for (int x = 700; x <= 1200; x += 100) {
for (int y = 100; y <= 700; y += 100) {
Sprite ship = loadSprite(x, y, regionEnemy);
attachChild(ship);
Enemies enemy = new Enemies(ship);
listEnemies.add(enemy);
}
}
}
@Override
public void createScene() {
listEnemies = new ArrayList<>();
spriteBackground = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, BackgroundRegion);
spriteCorner = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Corner);
spriteCenter = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Center);
spriteMarco = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Marco);
attachChild(spriteBackground);
attachChild(spriteCorner);
attachChild(spriteCenter);
attachChild(spriteMarco);
createEnemies();
}
@Override
public void onBackKeyPressed() {
// Regresar al menú principal
admScenes.createMenuScenes();
admScenes.setScene(SceneType.MENU_SCENE);
admScene.liberateGameScene();
}
@Override
public sceneType getSceneType() {
return sceneType.GAME_SCENE;
}
@Override
public void liberateScene() {
this.detachSelf();
this.dispose();
}
@Override
public void liberateResources() {
BackgroundRegion.getTexture().unload();
Corner.getTexture().unload();
Center.getTexture().unload();
Marco.getTexture().unload();
regionEnemy.getTexture().unload();
BackgroundRegion = null;
Corner = null;
Center = null;
Marco = null;
regionEnemy = null;
}
@Override
protected void onManagedUpdate(float pSecondsElapsed) {
super.onManagedUpdate(pSecondsElapsed);
timeEnemies += pSecondsElapsed; // Acumulates time
if (timeEnemies>TIME_LIMIT) { // Time has completed
tiemeEnemies = 0;
Sprite spriteEnemy = loadSprite(GameControl.CAMARA_WIDTH+regionEnemy.getWidth(),
(float)(Math.random()*GameControl.CAMARA_HEIGHT-regionEnemy.getHeight()) +
regionEnemy.getHeight(),regionEnemy);
Enemies newEnemy = new Enemies(spriteEnemies);
//newEnemies.mover(0,10);
listEnemies.add(newEnemy); // Adds it to the scene
attachChild(newEnemy.getSpriteEnemy()); // Adds it to the list
}
// Updates every enemy and sees if any has gotten out of the screen
for (int i=listEnemies.size()-1; i>=0; i--) {
Enemies enemy = listEnemies.get(i);
enemy.mover(-10, 0);
if (enemy.getSpriteEnemy().getX()<-enemy.getSpriteEnemy().getWidth()) {
detachChild(enemy.getSpriteEnemy()); // Deletes it from the scene
listEnemies.remove(enemy); // eliminates it from the list
}
// Checks the collision of enemy with another sprite
if (spriteCenter.collidesWith(enemy.getSpriteEnemy())) {
detachChild(enemy.getSpriteEnemy());
//enemies.remove(enemy);
}
}
}
}
提前感谢您的帮助。要回答您的第一个问题,是的,ArrayList会很好地工作。关于轨迹的问题,你需要一些三角学
double angle = Math.atan2(sprite.getY()-centerY,sprite.getX()-centerX);
这将使用反切线来提供轨迹角度。您可能需要稍微调整此数字,以获得精灵的正确旋转角度
例如,如果精灵位于垂直中心,但位于右边缘,则此函数将返回0。但是,如果您的精灵在默认情况下面朝前,则需要在此位置将其逆时针旋转90度。我不知道旋转在你的库中是如何工作的,但是一个合适的代码可能是sprite.setRotationangle-Math.PI/2 PI radians=180度。一个ArrayList可以很好地实现这一点 关于使用轨迹,我注意到另一个建议使用三角学的评论。显然,如果你想设置图像的旋转,你需要这个,尽管我没有注意到你的帖子中有任何内容说你想让敌人面对中心。如果你不需要它,那么使用trig通常是一个糟糕的选择——虽然这可能会在你需要的程度上完成工作,因为我假设这是一个非常简单的应用程序,但这通常不是一个很好的主意,因为trig计算非常昂贵,而且你将获得的几乎总是不准确的
为了在不旋转图像的情况下向中心移动,我建议您只需确定需要移动的梯度,然后使用标量调整此速度向量,使其处于正确的速度(如毕达哥拉斯)。如果你想有一个恒定的速度,你可能还需要平方根函数,这也有点贵,但肯定比使用三角法便宜得多。我认为你应该解释一下你所描述的数学过程,因为不是每个人都知道。为了确定梯度,你只需计算上升/运行=y1-y2/x1-x2,其中x1,y1和x2,y2分别是敌人和中心的坐标。假设你想要每帧k的距离,那么我们的梯度告诉我们的是y移动的比率/x移动的比率。我们想调整x和y方向的运动,使总运动为k。这是通过计算常数c来实现的,其中c=k/sqrtx1-x2^2+y1-y2^2,那么x和y中的正确运动分别是c*x2-x1和c*y2-y1。你只需将它们加到你的x和y值中,你就可以按照你的要求移动到中心和正确的长度。顺便说一句,你实际上不需要在这里计算梯度。这对理解很有帮助。是的,我知道在这个例子中,你真正需要做的就是取斜率,但是梯度是一个更大的概念。来试试这个。你知道我如何设置4个不同的产卵区,让敌人从屏幕左、右、上、下三个方向出来吗?该区域将随机选择。我要做的是从0到高度生成2个随机数,从0到宽度生成2个随机数,并将繁殖位置设置为0,r1,width,r2,r3,0,r4,height。是否将该坐标发送到类似setPosition的方法中?是,他们确实会的。试过了,但不幸的是,这种方法似乎将精灵设置在那个位置,之后无法移动。
double angle = Math.atan2(sprite.getY()-centerY,sprite.getX()-centerX);