2017-09-05 3 views
0

J'ai eu des problèmes pour que le lecteur soit détruit par l'appareil photo. Dans ma demande, j'ai fait suivre la caméra au joueur (la balle). Mais la caméra ne peut que suivre la balle vers le haut. Donc, ce que je veux accomplir, c'est que lorsque le joueur (la balle) atteint le bas de l'interface (l'écran), il est détruit. Après qu'il soit détruit ce serait bien, si une nouvelle activité (nouvel écran) apparaît, qui dit "Game over". Merci beaucoup pour le grand soutien. S'il vous plaît jeter un oeil à la interface of the application.Comment un objet peut-il être détruit par le viseur de la caméra?

package 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.World; 
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.CircleShape; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.utils.viewport.Viewport; 


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.position.set(camera.position.x, camera.position.y); 
    def.gravityScale = 3; 
    CircleShape shape = new CircleShape(); 
    shape.setRadius(0.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

Pourquoi postez-vous la même question? –

+0

Je pose de nouveau la même question, parce que la dernière fois la réponse était bonne, mais il y avait une erreur, donc je ne pouvais pas arrêter de comprendre ce que je devais faire. – Luca

+0

Peu importe. Vous ne postez pas de questions en double. Si vous voulez une clarification, commentez. –

Répondre

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

    if (ballBody.getPosition().y < camera.position.y){ 
     destroyBall(); 
    } else if (ballBody.getPosition().y > camera.position.y + 300){ 
     camera.position.set(ballBody.getPosition().y - 300); 
    } 

    update(); 

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

J'espère que cela fonctionne. Vous pouvez écrire la méthode destroyBall() vous-même.

+0

Merci, ça marche. Mais je devrais probablement vous demander comment vous écririez la méthode destroyBall, parce que mon chemin ne fonctionne pas toujours. – Luca