当前位置: 首页 > 知识库问答 >
问题:

使用libgdx进行触摸滚动

卫松
2023-03-14

我试图在一个libgdx游戏中实现触摸滚动。我有一个很宽的图像,是一个房间的全景。我希望能够滚动图像,让用户可以看到房间的四周。我有它,所以我可以滚动一定的距离,但当一个新的触摸拖动事件被注册的图像被移回到原来的位置。

这就是我实现它的方式

public class AttackGame implements ApplicationListener {

AttackInputProcessor inputProcessor;
Texture backgroundTexture; 
TextureRegion region;
OrthographicCamera cam;
SpriteBatch batch;
float width;
float height;
float posX;
float posY;

@Override
public void create() {
    posX = 0;
    posY = 0;
    width = Gdx.graphics.getWidth();
    height = Gdx.graphics.getHeight();  
    backgroundTexture = new Texture("data/pancellar.jpg");
    region = new TextureRegion(backgroundTexture, 0, 0, width, height);
    batch = new SpriteBatch();

}

@Override
public void resize(int width, int height) {
    cam = new OrthographicCamera();
    cam.setToOrtho(false, width, height);
    cam.translate(width / 2, height / 2, 0);
    inputProcessor = new AttackInputProcessor(width, height, cam);
    Gdx.input.setInputProcessor(inputProcessor);

}

@Override
public void render() {

    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    batch.draw(backgroundTexture, 0, 0, 2400, 460);
    batch.end();

}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}

@Override
public void dispose() {
    backgroundTexture.dispose();

}

}

在InputProcessor中

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {

    cam.position.set(screenX, posY / 2, 0);
    cam.update();
    return false;
}

在这个问题LibGdx如何使用OrthographicCamera?滚动的帮助下,我做到了这一步?。然而,这并没有真正解决我的问题。

我认为问题在于触摸拖动的坐标系不是世界坐标系,但我尝试过取消相机投影,但没有效果。

几个星期以来,我一直在努力解决这个问题,我真的非常感谢在这方面的一些帮助。

提前致谢。

共有3个答案

管玉堂
2023-03-14

简单的答案:

声明两个字段来保存新的和旧的拖动位置:

Vector2 dragOld, dragNew;

刚触摸时,您将这两个设置为与触摸的位置相等,否则您的凸轮将跳跃。

if (Gdx.input.justTouched())
{
    dragNew = new Vector2(Gdx.input.getX(), Gdx.input.getY());
    dragOld = dragNew;
}

更新拖动新帧,只需相互减去矢量即可获得用于平移相机的 x 和 y。

if (Gdx.input.isTouched())
    {
        dragNew = new Vector2(Gdx.input.getX(), Gdx.input.getY());
        if (!dragNew.equals(dragOld))
        {
            cam.translate(dragOld.x - dragNew.x, dragNew.y - dragOld.y); //Translate by subtracting the vectors
            cam.update();
            dragOld = dragNew; //Drag old becomes drag new.
        }
    }

这就是我用来拖动我的矫形凸轮,简单而有效。

步致远
2023-03-14

您需要在touchDragged回调中进行更多的计算,您不能只将触摸到的任何屏幕坐标传递给相机。你需要弄清楚用户的手指拖了多远,朝什么方向拖。绝对坐标不能立即使用。

请考虑从右上角向下拖动或从左上角向下拖动。在这两种情况下,您都希望(我推测)将相机移动相同的距离,但是在这两种情况下,屏幕坐标的绝对值将非常不同。

我认为最简单的事情是跟踪previousX和previous Y(在 方法中初始化它们)。然后在 touch>期间,用delta(例如,deltaX=screenX-previouseX)调用 touchDragged 中的上一个*

或者,您可以查看libgdx提供的一些更好的< code>InputProcessor包装器(参见https://code . Google . com/p/libgdx/wiki/InputGestureDetection)。

尹庆
2023-03-14

我最近做了你想做的事。这是我用来移动地图的Input类,您只需更改我的“stage”即可。“摄像头”的getCamera():

public class MapInputProcessor implements InputProcessor {
    Vector3 last_touch_down = new Vector3();

    ...

    public boolean touchDragged(int x, int y, int pointer) {
        moveCamera( x, y );     
        return false;
    }

    private void moveCamera( int touch_x, int touch_y ) {
        Vector3 new_position = getNewCameraPosition( touch_x, touch_y );

        if( !cameraOutOfLimit( new_position ) )
            stage.getCamera().translate( new_position.sub( stage.getCamera().position ) );

        last_touch_down.set( touch_x, touch_y, 0);
    }

    private Vector3 getNewCameraPosition( int x, int y ) {
        Vector3 new_position = last_touch_down;
        new_position.sub(x, y, 0);
        new_position.y = -new_position.y;
        new_position.add( stage.getCamera().position );

        return new_position;
    }

    private boolean cameraOutOfLimit( Vector3 position ) {
        int x_left_limit = WINDOW_WIDHT / 2;
        int x_right_limit = terrain.getWidth() - WINDOW_WIDTH / 2;
        int y_bottom_limit = WINDOW_HEIGHT / 2;
        int y_top_limit = terrain.getHeight() - WINDOW_HEIGHT / 2;

        if( position.x < x_left_limit || position.x > x_right_limit )
            return true;
        else if( position.y < y_bottom_limit || position.y > y_top_limit )
            return true;
        else
          return false;
}


    ...
}

这就是结果:http://www.youtube.com/watch?feature=player_embedded

 类似资料:
  • 我正在使用LIBGDX开发一款android游戏。 这里,x和y返回设备屏幕的触摸位置,值在0和设备屏幕宽度和高度之间。 有办法吗?我想获得与视口相关的触摸位置。。我用它来保持纵横比http://www.java-gaming.org/index.php?topic=25685.0

  • 启用触摸保护 把 Yubikey-manager 安装在一个绝对路径:【译者注:homebrew 是 macOS 平台的包管理软件】 ❯ brew install libu2f-host libusb swig ykpers ❯ git clone git@github.com:Yubico/Yubikey-manager.git ❯ git submodule update --init --r

  • 好的,我有一个手臂和旋转关节相连的球员。我想要的是手臂身体向接触点旋转。 我试图计算接触点与身体的角度,并用 但它在更新方法上表现得很奇怪。它绕着手臂身体的中心旋转,而不是绕着旋转关节连接的身体旋转。 我也在考虑一个关节,但我不知道哪个能像我想要的那样工作。 我将不胜感激任何帮助!

  • 我正在尝试使用MPAndroidChart在我的应用程序中创建图表。 但有一些具体的特点。 > 图形将比屏幕宽度宽,因此它必须具有最小宽度并可滚动(对于我正在使用的宽度,但它不可滚动):

  • 在过去的几天里,我一直在将我的游戏(Apopalypse)移植到Android Mobile平台。我在Google上快速搜索了精灵触摸检测,但没有找到任何有用的东西。每个气球触摸一次就会弹出,我只需要检测它是否被触摸。这是我的气球生成代码: 渲染(x、y、宽度和高度随机): 在主游戏类中产卵:

  • 为本机macOS应用程序创建TouchBar布局 进程: 主进程​ new TouchBar(options) 实验功能 用途:使用指定项目创建新的触摸条,使用 BrowserWindow.setTouchBar将 TouchBar加到窗口中 options - Object items (TouchBarButton | TouchBarColorPicker | TouchBarGroup |