Отрисовка фигуры по щелчку мыши с использованием Libgdx (Android) - PullRequest
0 голосов
/ 16 января 2020

Можно ли визуализировать сферу с помощью Libgdx после того, как пользователь нажимает / нажимает на экран, в выбранной пользователем позиции? Неважно, что я пытаюсь, похоже, он не работает и либо вылетает из программы, либо просто ничего не делает.

Я бы хотел короткий демонстрационный код, если это возможно - спасибо!

Вот мой весь класс. Я, вероятно, неправильно делаю множество вещей:

package com.mygdx.game;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.Material;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.FPSLogger;


/**
 * See: http://blog.xoppa.com/basic-3d-using-libgdx-2/
 * @author Xoppa
 */
public class Render implements ApplicationListener {
    public Environment environment;
    public PerspectiveCamera cam;
    public CameraInputController camController;
    public ModelBatch modelBatch;
    private FPSLogger fps;

    public Model model;

    @Override
    public void create() {
        Gdx.graphics.setContinuousRendering(false);
        DataBase.r = this;

        environment = new Environment();
        environment.set(new ColorAttribute(ColorAttribute.Specular, 0.4f, 0.4f, 0.4f, 0.6f));
        environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, 0f, 0f, -1f));

        modelBatch = new ModelBatch();

        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(0f, 0f, 10f);
        cam.lookAt(0,0,0);
        cam.near = 1f;
        cam.far = 300f;
        cam.update();

        ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createSphere(1f, 1f, 1f, 30, 30,
                new Material(), Usage.Position | Usage.Normal);
        ModelInstance instance = new ModelInstance(model);
        instance.transform.setToTranslation(1, 1, 1);
        ModelInstance instance2 = new ModelInstance(model);
        camController = new CameraInputController(cam);
        Gdx.input.setInputProcessor(camController);
        DataBase.array.add(instance);
        DataBase.array.add (instance2);

        Gdx.input.setInputProcessor(new InputAdapter());

        if (Gdx.input.justTouched()) {
            System.out.println ("yes");
            ModelInstance Instance = new ModelInstance (model);
            Instance.transform.setToTranslation(Gdx.input.getX(),Gdx.input.getY(), 0);
            DataBase.array.add(Instance);
            Gdx.graphics.requestRendering();
        }

        fps = new FPSLogger();
    }

    @Override
    public void render() {




        camController.update();

        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        for (ModelInstance instance: DataBase.array) {
            modelBatch.render(instance, environment);
        }
        modelBatch.end();




        //fps.log();
    }


    @Override
    public void dispose() {
        modelBatch.dispose();
        model.dispose();
    }




    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}

DataBase.array - это просто ArrayList<ModelInstance>.

1 Ответ

2 голосов
/ 16 января 2020

Я не понимаю, что вы там делаете, возможно, мой стиль написания отличается, но все же я могу предложить решение. Я не предлагаю использовать сенсорные события и создание текстур при рендеринге. Но для примера:

//defined out of method
//OrthographicCamera cam , Boolean drawBoolean
//Texture texture ,SpriteBatch sb , Vector3 tmp
if (Gdx.input.justTouched()) {
      tmp = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);

      //your camera obj 
      cam.unproject(tmp);

      //Your sphere or rectangle object
      texture =  new Texture("yourTexture.png");
      drawBoolean=true;          
 }
 if(drawBoolean)
     //sprite batch , use your render() thing
     sb.draw(texture , tmp.x ,tmp.y);     
   }

Надеюсь, вы сможете адаптировать его под свой код.

...