Java LibGDX:Can';我似乎不能把物体画成一个数组
敌人等级Java LibGDX:Can';我似乎不能把物体画成一个数组,java,arrays,libgdx,Java,Arrays,Libgdx,敌人等级 public class Enemy extends Sprite{ private Vector2 velocity = new Vector2(0,0); private float speed = 30, gravity = 30 * 1.8f; public Enemy(Sprite sprite){ super(sprite); } public void draw(SpriteBatch spriteBatch){ update(Gdx.graphi
public class Enemy extends Sprite{
private Vector2 velocity = new Vector2(0,0);
private float speed = 30, gravity = 30 * 1.8f;
public Enemy(Sprite sprite){
super(sprite);
}
public void draw(SpriteBatch spriteBatch){
update(Gdx.graphics.getDeltaTime());
super.draw(spriteBatch);
}
public void update(float delta) {
velocity.y -= gravity * delta;
setY(velocity.y + speed * delta);
}
}
public class PlayScreen implements Screen {
private Player player;
private OrthographicCamera camera;
private OrthogonalTiledMapRenderer renderer;
private TiledMap map;
private Rectangle rightRectangle, leftRectangle, playerRectangle;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
renderer.render();
renderer.getSpriteBatch().begin();
player.draw(renderer.getSpriteBatch());
boolean wallLeft = leftRectangle.overlaps(player.rectangle);
boolean wallRight = rightRectangle.overlaps(player.rectangle);
if(wallLeft){
System.out.println("wallLeft Overlap");
player.velocity.x = 0;
}
else if(wallRight){
System.out.println("wallRight Overlap");
player.velocity.x = 0;
}
enemies = new ArrayList<Enemy>();
enemy = new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
for(it = enemies.iterator(); it.hasNext();){
enemy.draw(renderer.getSpriteBatch());
enemy.setOrigin(500, 500);
}
renderer.getSpriteBatch().end();
}
@Override
public void resize(int width, int height) {
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
}
@Override
public void show() {
camera = new OrthographicCamera();
map = new TiledMap();
renderer = new OrthogonalTiledMapRenderer(map);
player = new Player(new Sprite(new Texture("img/player.png")));
rightRectangle = new Rectangle(1280,0,0,720);
leftRectangle = new Rectangle(0,0,0,720);
player.setPosition(
Gdx.graphics.getWidth()/2f - player.getWidth()/2f,
Gdx.graphics.getHeight()/2f - player.getHeight()/2f
- Gdx.graphics.getHeight()/5f);
}
}
播放屏幕类
public class Enemy extends Sprite{
private Vector2 velocity = new Vector2(0,0);
private float speed = 30, gravity = 30 * 1.8f;
public Enemy(Sprite sprite){
super(sprite);
}
public void draw(SpriteBatch spriteBatch){
update(Gdx.graphics.getDeltaTime());
super.draw(spriteBatch);
}
public void update(float delta) {
velocity.y -= gravity * delta;
setY(velocity.y + speed * delta);
}
}
public class PlayScreen implements Screen {
private Player player;
private OrthographicCamera camera;
private OrthogonalTiledMapRenderer renderer;
private TiledMap map;
private Rectangle rightRectangle, leftRectangle, playerRectangle;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
renderer.render();
renderer.getSpriteBatch().begin();
player.draw(renderer.getSpriteBatch());
boolean wallLeft = leftRectangle.overlaps(player.rectangle);
boolean wallRight = rightRectangle.overlaps(player.rectangle);
if(wallLeft){
System.out.println("wallLeft Overlap");
player.velocity.x = 0;
}
else if(wallRight){
System.out.println("wallRight Overlap");
player.velocity.x = 0;
}
enemies = new ArrayList<Enemy>();
enemy = new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
for(it = enemies.iterator(); it.hasNext();){
enemy.draw(renderer.getSpriteBatch());
enemy.setOrigin(500, 500);
}
renderer.getSpriteBatch().end();
}
@Override
public void resize(int width, int height) {
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
}
@Override
public void show() {
camera = new OrthographicCamera();
map = new TiledMap();
renderer = new OrthogonalTiledMapRenderer(map);
player = new Player(new Sprite(new Texture("img/player.png")));
rightRectangle = new Rectangle(1280,0,0,720);
leftRectangle = new Rectangle(0,0,0,720);
player.setPosition(
Gdx.graphics.getWidth()/2f - player.getWidth()/2f,
Gdx.graphics.getHeight()/2f - player.getHeight()/2f
- Gdx.graphics.getHeight()/5f);
}
}
公共类PlayScreen实现屏幕{
私人玩家;
私人正交摄影机;
私有正交瓦片渲染器;
私人平铺地图;
私有矩形rightRectangle、leftRectangle、playerRectangle;
@凌驾
公共无效渲染(浮动增量){
glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.gl\u颜色\u缓冲\u位);
render.render();
renderer.getSpriteBatch().begin();
player.draw(renderer.getSpriteBatch());
布尔wallLeft=leftRectangle.overlaps(player.rectangle);
布尔wallRight=rightRectangle.overlaps(player.rectangle);
如果(左墙){
System.out.println(“墙左重叠”);
player.velocity.x=0;
}
否则如果(wallRight){
System.out.println(“墙右重叠”);
player.velocity.x=0;
}
敌人=新的ArrayList();
敌人=新敌人(新精灵(新纹理(“img/player.png”));
添加(新敌人(新精灵)(新纹理(“img/player.png”));
添加(新敌人(新精灵)(新纹理(“img/player.png”));
for(it=feeds.iterator();it.hasNext();){
draw(renderer.getSpriteBatch());
敌方。setOrigin(500500);
}
renderer.getSpriteBatch().end();
}
@凌驾
公共空心调整大小(整型宽度、整型高度){
camera.viewportWidth=宽度;
camera.viewportHeight=高度;
camera.update();
}
@凌驾
公开展览({
摄影机=新的正交摄影机();
map=新的tileMap();
渲染器=新的正交平铺贴图渲染器(贴图);
player=新玩家(新精灵(新纹理(“img/player.png”));
rightRectangle=新矩形(1280,0,0720);
leftRectangle=新矩形(0,0,0720);
播放器设置位置(
Gdx.graphics.getWidth()/2f-player.getWidth()/2f,
Gdx.graphics.getHeight()/2f-player.getHeight()/2f
-Gdx.graphics.getHeight()/5f);
}
}
因此,如果我运行这个,应用程序就会冻结,不再响应。我相信问题是当我尝试将“敌人”添加到PlayScreen类中时。以前它运行得很好,因为我没有把“敌人”类加入到这个项目中。我想做的是,把每个敌人吸引到敌人的阵阵中,然后确定他们的位置 是的,您缺少一个推进循环的
it.next()
for(it = enemies.iterator(); it.hasNext();){
enemy.draw(renderer.getSpriteBatch());
enemy.setOrigin(500, 500);
}
我认为您也不希望每次都绘制相同的敌人
,因此您应该在循环开始时设置敌人=it.next()
另外,我不能百分之百确定这个软件的后端是如何工作的,但是我很确定你不想在下面的代码片段中加载同一个精灵的3个副本。你应该加载精灵一次,并对每个敌人使用相同的精灵
enemy = new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
enemies.add(new Enemy(new Sprite(new Texture("img/player.png"))));
谢谢你的帮助!是否可以将敌方=it.next()和it.next都放在同一个for循环中,因为当我这样做时,它会给我一个NoTouchException错误。此外,当我只放置一个敌人=it.next()或it.next(),它将始终在位置(0,0)处生成我的敌人*我注意到在敌方类中,我将速度设置为(0,0),我刚刚删除了它,当使用迭代器时,
it.next()
调用返回列表中的下一个敌方(您需要将其分配给一个变量,例如您的敌方
变量),并且应该在循环中只调用一次,因为您在循环中只检查一次it.hasNext()
。如果您没有在上面的代码中做更多的事情,那么循环列表的一种更常见、更容易理解的方法是:for(int i=0;i
对不起,我不能对其余的进行评论,因为我已经很久没有使用Libgdx了,但我建议您通过一些libgdx教程来尝试更好地组织和理解您的代码。也不要在渲染方法中实例化任何东西!这大约每秒调用60次,然后将触发大量对象创建。您将多次触发垃圾收集器。这可能会影响您的游戏性能。改为在onCreate()中执行。为此,我没有onCreate方法。还有别的方法可以用吗?