首页 > 解决方案 > 如何在Gdx android游戏编程中获得矩形的真实触摸位置?

问题描述

这是一个带有水桶和雨滴的简单安卓游戏。游戏是关于将雨滴放入桶中。问题出在桶上,因为桶的位置与触摸输入的位置不对应。

第二个问题是因为我不知道如何插入带有雨滴计数器的小窗口。我需要有一些我在桶里抓到的雨滴的柜台。

这是我的android游戏的代码:

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
import java.util.Iterator;


public class MyGdxGame extends ApplicationAdapter {

    private Texture dropImage;
    private Texture bucketImage;

    private Sound dropSound;
    private Music rainMusic;

    private OrthographicCamera camera;

    private SpriteBatch spriteBatch;

    private Rectangle bucket;
    private Array<Rectangle> raindrops;

    private long lastDropTime;




    @Override
    public void create () {
        dropImage = new Texture(Gdx.files.internal("droplet.png"));
        bucketImage = new Texture(Gdx.files.internal("bucket.png"));
        dropSound = Gdx.audio.newSound(Gdx.files.internal("drop.wav"));
        rainMusic = Gdx.audio.newMusic(Gdx.files.internal("rain.mp3"));

        rainMusic.setLooping(true);
        rainMusic.play();

        camera = new OrthographicCamera();
        camera.setToOrtho(false, 800, 400);

        spriteBatch = new SpriteBatch();

        bucket = new Rectangle();
        bucket.height = 64;
        bucket.width = 64;
        bucket.x = 800 / 2 - 64 / 2;
        bucket.y = 20;

        raindrops = new Array<Rectangle>();
        createRainDrops();


    }



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

        camera.update();
        spriteBatch.setProjectionMatrix(camera.combined);

        spriteBatch.begin();
        spriteBatch.draw(bucketImage, bucket.x, bucket.y);

        for (Rectangle raindrop: raindrops){
            spriteBatch.draw(dropImage, raindrop.x, raindrop.y);
        }
        spriteBatch.end();

触摸输入处理:

if (Gdx.input.isTouched()){  
            bucket.x = Gdx.input.getX() - 64 / 2;
            bucket.x = Gdx.input.getX();



        }

我知道我的解决方案是使用 Vector3,但不知道具体如何?当我尝试玩游戏时,我的触摸位置不在真实位置!

        if (bucket.x < 0){
            bucket.x = 0;
        }
        if (bucket.y > 800 - 64){
            bucket.x = 800 - 64;
        }


        if (TimeUtils.nanoTime() - lastDropTime > 1000000000){
            createRainDrops();
        }

        Iterator<Rectangle> iterator = raindrops.iterator();
        while (iterator.hasNext()){
            Rectangle raindrop = iterator.next();
            raindrop.y -= 200 * Gdx.graphics.getDeltaTime();
            if (raindrop.y + 64 < 0){
                iterator.remove();
            }
            if (raindrop.overlaps(bucket)){
                dropSound.play();
                iterator.remove();
            }

        }


    }

    @Override
    public void dispose () {
        dropSound.dispose();
        rainMusic.dispose();
        bucketImage.dispose();
        dropImage.dispose();
        spriteBatch.dispose();

    }

    private void createRainDrops() {
        Rectangle raindrop = new Rectangle();
        raindrop.width = 64;
        raindrop.height = 64;
        raindrop.y = 480;
        raindrop.x = MathUtils.random(0, 800 - 64);
        raindrops.add(raindrop);
        lastDropTime = TimeUtils.nanoTime();
    }


}

标签: javaandroidlibgdxtouch

解决方案


您忘记了 y 坐标:

if (Gdx.input.isTouched()){  
        bucket.x = Gdx.input.getX() - bucket.getWidth() / 2;
        bucket.y = Gdx.input.getY() - bucket.getHeight() / 2;
}

对于雨滴计数器,您可以使用BitmapFont

spriteBatch = new SpriteBatch();
font = new BitmapFont(Gdx.files.internal("Font.fnt"),
Gdx.files.internal("Font.png"), false);

并在渲染方法中

spriteBatch.begin();
font.draw(spriteBatch, "some string", x, y);
spriteBatch.end();

推荐阅读