2017-09-03 9 views
1

私はカメラを使ってプレーヤーを破壊するいくつかの問題を抱えてきました。私のアプリケーションでは、カメラをプレーヤー(ボール)に追従させました。しかし、カメラはボールを上向きにしか追従できません。だから私が達成したいのは、プレーヤー(ボール)がインターフェイスの下に達すると(スクリーン)、それは破壊されるということです。それが破壊された後は、新しいアクティビティ(新しいスクリーン)がポップアップすると、「ゲームオーバー」と表示されます。 大きな支持をいただき、ありがとうございます。 the interface of the applicationカメラでプレーヤーを破壊する方法は?

パッケージcom.luca.tuninga;

import com.badlogic.gdx.ApplicationAdapter; 
import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.GL20; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.Input; 
import com.badlogic.gdx.math.MathUtils; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.*; 



public class MyGdxGame extends ApplicationAdapter { 


public static float APP_FPS = 60f; 
public static int V_WIDTH = 480; 
public static int V_HEIGHT = 640; 


Box2DDebugRenderer b2dr; 
World world; 
Body ballBody; 

OrthographicCamera camera; 

float cameraMaxY; 

@Override 
public void create() { 
    world = new World(new Vector2(0, -9.8f), false); 
    b2dr = new Box2DDebugRenderer(); 


    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, V_WIDTH, V_HEIGHT); 
    cameraMaxY = camera.position.y; 


    ballBody = createBall(); 
    createWalls(); 
} 

private void update() { 
    world.step(1f/APP_FPS, 6, 2); 

    if (Gdx.input.isTouched()) { 
     ballBody.setLinearVelocity(0, MathUtils.clamp(ballBody.getLinearVelocity().y, 0, 3)); 
     ballBody.applyForceToCenter(new Vector2(0, 650f), false); 
    } 

    if (ballBody.getPosition().y * 32 > cameraMaxY) { 
     camera.translate(0, (ballBody.getPosition().y * 32) - cameraMaxY); 
     camera.update(); 

     cameraMaxY = camera.position.y; 
    } 
} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(.25f, .25f, .25f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    update(); 

    b2dr.render(world, camera.combined.cpy().scl(32f)); 
} 

@Override 
public void dispose() { 
    super.dispose(); 
    world.dispose(); 
} 

private Body createBall() { 
    Body body; 
    BodyDef def = new BodyDef(); 
    def.type = BodyDef.BodyType.DynamicBody; 
    def.fixedRotation = true; 
    def.position.set(camera.position.x/ 32 + .5f, camera.position.y/ 32); 
    def.gravityScale = 3; 
    CircleShape shape = new CircleShape(); 
    shape.setRadius(.5f); 

    body = world.createBody(def); 
    body.createFixture(shape, 1.0f); 
    return body; 

} 

private void createWalls() { 
    Body body; 
    BodyDef def = new BodyDef(); 
    def.type = BodyDef.BodyType.StaticBody; 
    def.fixedRotation = true; 

    PolygonShape shape = new PolygonShape(); 
    shape.setAsBox(1, 200/32); 
    for(int i = 0; i < 20 ; i++) { 
     def.position.set(1.01f, i * (200/32)); 
     body = world.createBody(def); 
     body.createFixture(shape, 1.0f); 

     def.position.set(V_WIDTH/32 - 1, i * (200/32)); 
     body = world.createBody(def); 
     body.createFixture(shape, 1.0f); 
    } 
} 

} 

答えて

0

私が理解するところでは、カメラは上向きにしかフォローされません。したがって、ボールが上方に移動すると、カメラは更新されてフォロースルーされ、カメラは再び降下しません。

ボールがカメラの視界の外にあることを確認できます。具体的にはカメラの底面。あなたは、これがupdate()機能上記

if ((ballBody.getPosition().y + 0.5f) * 32 < ballBody.getPosition().y - 
    camera.getViewportHeight()/2) { 
    // destroy body 
    world.destroyBody(ballBody); 

    // TODO: switch to another screen (thus next frame update & draw loop of this screen won't be called anymore) 
} 

の終わりにそれを置くような何かを行うことができます

はボールがカメラの視界の外に完全(ときので、私はのようにその半径+ 0.5fを行うかどうかを確認することですカメラのビューポートの高さに対してこのようなボディのシェイプを作成していました)。

次に、別の画面に切り替えます。これは、現在の画面が更新されない、またはコンテンツがそれ以上描画されないことを意味します。したがって、チェックするフラグは必要ありません。 でも次のフレームで何か他のことをやり直す必要がある場合は、現在の画面を確認してゲームが終了したことを知るフラグを設定して、特定の操作をするかどうかを確認できます。