2016-09-07 2 views
1

現在、私は小惑星を避けなければならないゲームをプログラミングしています。私はいくつかの混乱した座標に対処しなければならず、スプライトの座標を推測しなければなりませんでした。私は今、自分の世界を描く任意の単位を持っています。残念ながら、私のゲーム画面は完全には機能しません。小惑星をレンダリングしたいとき、ゲーム画面に黒い画面が表示されます。GameScreenはブラックスクリーンを表示します

public class GameScreen extends Screen { 

private OrthographicCamera cam; 
private Spaceship spaceship; 
private Asteroids asteroids; 
private Background bg; 



@Override 
public void create() { 
    // TODO Auto-generated method stub 

    bg = new Background(); 
    spaceship = new Spaceship(); 
    asteroids = new Asteroids(); 

    float aspectratio = 16/10; 

    cam = new OrthographicCamera(100, 100 * aspectratio); 

    cam.position.set(cam.viewportWidth/2f, cam.viewportHeight/2f, 0); 

    cam.update(); 

    } 



@Override 
public void render(SpriteBatch batch) { 
    // TODO Auto-generated method stub 

    cam.update(); 
    batch.setProjectionMatrix(cam.combined); 

    batch.begin(); 
    bg.render(batch); 
    spaceship.render(batch); 
    batch.end(); 

} 

上記のコードは正常に動作し、私にこの例を示します

enter image description here

を私はGameScreenクラスの小惑星のためのrenderメソッドを追加するとGameScreenはちょうど黒です:

@Override 
    public void render(SpriteBatch batch) { 
    // TODO Auto-generated method stub 

    cam.update(); 
    batch.setProjectionMatrix(cam.combined); 

    batch.begin(); 
    bg.render(batch); 
    spaceship.render(batch); 
    batch.end(); 

    } 

enter image description here

小惑星クラス:

public class Asteroid { 

private Vector2 p; 
private Vector2 v; 

private float mass; 
private float radius; 

public final float maxV = 200; 
public final float minV = 50; 

public final float rMin = 10; 
public final float rMax = 30; 

public final float minX = MyGdxGame.WIDTH; 
public final float minY = MyGdxGame.HEIGHT;; 

float alpha = MathUtils.random(0, 360); 

public Asteroid(float maxX, float maxY, List<Asteroid> asteroids) { 

    do { 

    radius = MathUtils.random(rMin, rMax); 
    masse = radius * radius * radius; 

    float alpha = MathUtils.random(0, 360); 

    p = new Vector2(MathUtils.random(minX, maxX), MathUtils.random(minY, 
      maxY)); 

    float vBetrag = MathUtils.random(minV, maxV); 

    v = new Vector2(vBetrag * MathUtils.cosDeg(alpha), 
      vBetrag * MathUtils.cosDeg(alpha)); 
    } while (ueberlappMit(asteroids)); 

} 

private boolean ueberlappMit(List<Asteroid> asteroids) { 

    for(Asteroid a: asteroids){ 
     if(abstand(a) < radius + a.radius + 10){ //! 
      return true; 
     } 
    } 

    return false; 

} 

public void update(float deltaT, float xMin, float xMax, float yMin, float yMax) { 
    p.x += v.x * deltaT; 
    p.y += v.y * deltaT; 

    while(p.x > xMax) 
    { 
     p.x -= (xMax - xMin); 
    } 
    while(p.x < xMin) 
    { 
     p.x += (xMax - xMin); 
    } 
    while(p.y > yMax) 
    { 
     p.y -= (yMax - yMin); 
    } 
    while(p.y < yMin) 
    { 
     p.y += (yMax - yMin); 
    } 
} 


public float abstand(Asteroid a2) { 

    return p.dst(a2.p); 

} 

小惑星クラス:あなたの助けみんなのため

public class Asteroids extends Entity { 

private final int numberofAsteroids = 150; 
private float xMin, xMax, yMin, yMax; 
private List<Asteroid> asteroids = new ArrayList<Asteroid>(); 

private final int cyclicBoundaryConditionsMultiple = 2; 

public Asteroids() { 


    xMin = MyGdxGame.WIDTH * (-cyclicBoundaryConditionsMultiple); 
    xMax = MyGdxGame.WIDTH * (cyclicBoundaryConditionsMultiple); 
    yMin = MyGdxGame.HEIGHT * (-cyclicBoundaryConditionsMultiple); 
    yMax = MyGdxGame.HEIGHT * (cyclicBoundaryConditionsMultiple); 


    for (int i = 0; i < anzahl; i++) { 
     Asteroid a = new Asteroid(xMax, yMax, asteroids); 
     asteroids.add(a); 
    } 

} 

@Override 
public void update() { 

    for (Asteroid a : asteroids) { 
     a.update(Gdx.graphics.getDeltaTime(), xMin, xMax, yMin, yMax); 
    } 

    for (int i = 0; i < numberofAsteroids; i++) { 

     Asteroid a1 = asteroids.get(i); 

     for (int j = i + 1; j < anzahl; j++) { 

      Asteroid a2 = asteroids.get(j); 

      float abstand = a1.abstand(a2); 

      if (abstand < a1.getRadius() + a2.getRadius()) { 

       calculateCollision(a1, a2); 

      } 

     } 

    } 

} 


} 

@Override 
public void render(ShapeRenderer renderer) { 

    for (Asteroid a : asteroids) { 

     System.out.println("RENDER A"); 

     renderer.setColor(0, 0, 0, 1); 
     renderer.circle(a.getP().x, a.getP().y, a.getRadius()); 

    } 

    } 
+0

私のlogcatは言う: 9月7日16:58:53.269:I /タイムライン(24341):タイムライン:Activity_idle ID:[email protected]時間:5449248 9月7日16:58:59.776:私/ AndroidInput(24341):センサーリスナーは、 –

+0

を破棄してください。レンダリングコードを教えてください? –

+0

@JonathanBothaレンダリング方法は、下部のAsteriods Clssにあります。 bgは背景だけをレンダリングし、小惑星がなければ正常に動作します。 –

答えて

0

たTHXたくさん、私は問題を解決しました。 private boolean ueberlappMit(List asteroids)メソッドは、小惑星が重複しているかどうか、小惑星が再び作成されるかどうかを調べます。問題は、あまりにも高い半径を選択することによって、ゲームが小惑星クラスのdo whileループに詰まってしまったことです。

関連する問題