如何使玩家被相机摧毁? [英] How to make player get destroyed through camera?

查看:69
本文介绍了如何使玩家被相机摧毁?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在让播放器被照相机摧毁时遇到了一些麻烦.在我的应用程序中,我使摄像机跟随玩家(球).但是相机只能将球追随向上.所以我要完成的是,当球员(球)到达界面(屏幕)的底部时,它被破坏了.销毁后,如果弹出一个新的活动(新屏幕),并显示"Game over",那就很好了. 非常感谢您的大力支持. 应用程序的界面

I've been having some trouble making the player get destroyed through the camera. In my application, I made the camera follow the player(the ball). But the camera can only follow the ball upward. So what I want to accomplish is, when the player(the ball) reaches the bottom of the interface(the screen) it gets destroyed. After it gets destroyed it would be good, if a new activity(new screen) pops up, that says "Game over". Thanks a lot for the great support. the interface of the application

package com.luca.tuninga;

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.*;



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);
    }
 }

}

推荐答案

据我了解,相机只会向上运动.因此,当球过渡到向上位置时,摄像头将更新并跟随,摄像头不会再下降.

From what I understand, the camera will follow upwards only. Thus when the ball transitions into upwards position, camera will update and follow through, camera won't go down again.

因此,您可以检查球何时位于摄像机视线之外;尤其是相机的底部.

So you can check when the ball is outside of the sight of camera; specifically the bottom of camera.

您可以执行以下操作,将其放在update()函数的末尾

You can do something like this putting it at the end of update() function

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,这是您用来创建此类物体的形状的半径)相对于摄像机视口高度的检查.

above is to check if when ball is completely out of camera's sight (thus I do + 0.5f which is its radius as you used to create the shape for such body) against camera's viewport height.

然后切换到另一个屏幕.这意味着当前屏幕将不再更新或绘制其内容,因此无需检查标志. 但是,如果您需要在下一帧中再次执行其他操作,则最好有一个标记来检查当前屏幕,以了解游戏已经结束,因此您可以检查是否执行某些操作.

Then switch to another screen. This means the current screen won't be update or draw its content anymore, thus no need to have a flag to check. But if you need to do something else again in next frame, you better have a flag checking for the current screen to know that the game is now over, and thus you can check whether to do certain operations.

这篇关于如何使玩家被相机摧毁?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆