LibGDX平移有时会跳跃

罗宾·埃勒克曼(Robin Ellerkmann)

我正在开发一款基于图块的游戏,该游戏应该可以滚动,但只能在世界范围内进行。因此,我根据几个示例/教程的建议设置了pan()方法,但它并不总是能够正常工作。有时,它会跳回到上一个手势的起点,或者移动得非常缓慢。此外,边框也不起作用。也许有人可以指出我犯的错误。

public void pan(float x, float y, float deltaX, float deltaY) { 
    moveCamera(x, y);   
}   

private void moveCamera(float x, float y) {
    Vector3 new_position = getNewCameraPosition((int) x, (int)y);

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

    lastTouchDown.set(x, y, 0);
}

private Vector3 getNewCameraPosition(int x, int y) { 
    Vector3 newPosition = lastTouchDown;        
    newPosition.sub(x, y, 0);   
    newPosition.y = -newPosition.y;     
    newPosition.add(this.getViewport().getCamera().position);

    return newPosition;
}

private boolean cameraOutOfLimit( Vector3 position ) {
    int x_left_limit = (int) (Global.SCREEN_WIDTH / 2);
    int x_right_limit = (int) (Global.COLS_OF_TILES * Global.TILE_WIDTH - (Global.SCREEN_WIDTH / 2));
    int y_bottom_limit = (int) (Global.SCREEN_HEIGHT / 2);
    int y_top_limit = (int) (Global.ROWS_OF_TILES * Global.TILE_HEIGHT - Global.SCREEN_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; 
}
Tenfour04

上面的代码对我来说似乎很复杂,我真的不明白为什么您要修改一个lastTouchPosition与触摸位置无关的矢量

我会做这样的事情。每当您要移动相机时,这些方法都会锁定目标X和Y位置。

float clampCamTargetX(float x) {
    x = Math.max(x, (int) (Global.SCREEN_WIDTH / 2));
    x = Math.min(x, (int) (Global.COLS_OF_TILES * Global.TILE_WIDTH - (Global.SCREEN_WIDTH / 2)));
    return x;
}

float clampCamTargetY (float y){
    y = Math.max(y,(int)(Global.SCREEN_HEIGHT/2));
    y = Math.min(y,(int)(Global.ROWS_OF_TILES*Global.TILE_HEIGHT-Global.SCREEN_HEIGHT/2));
    return y;
}

然后,如果要平移它,您将执行以下操作:

void panCamera(float deltaX, float deltaY) {
    Camera camera = this.getViewport().getCamera();
    Vector3 camPosition = camera.position;
    camPosition.x = clampCamTargetX(camPosition.x + deltaX);
    camPosition.y = clampCamTargetY(camPosition.y + deltaY);
    camera.update();
}

或者,如果您想要一个完整的解决方案以将相机平稳地移动到最后触摸的位置,请尝试以下操作:

float startXCam, startYCam, targetXCam, targetYCam;
float elapsedTimeCam;
boolean panningCam = false;
static final float CAM_PAN_DURATION = 0.4f;

public void render (){
    //...
    panCameraToTouchPoint(Gdx.graphics.getDeltaTime());
    //...
}

void panCameraToTouchPoint (float deltaTime){
    Camera camera = getViewport().getCamera();
    Vector3 camPosition = camera.position;
    if (Gdx.input.justTouched()) {
        startXCam = camPosition.x;
        startYCam = camPosition.y;
        targetXCam = clampCamTargetX(Gdx.input.getX());
        targetYCam = clampCamTargetY(Gdx.input.getY());
        elapsedTimeCam = 0;
        panningCam = true;
    }

    if (panningCam){
        elapsedTimeCam += deltaTime;
        float alpha = elapsedTimeCam / CAM_PAN_DURATION;
        if (alpha >= 1){
            alpha = 1;
            panningCam = false;
        }
        camPosition.x = Interpolation.pow2Out.apply(startXCam, targetXCam, alpha);
        camPosition.y = Interpolation.pow2Out.apply(startYCam, targetYCam, alpha);
        camera.update();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有时会恢复,有时会结帐

来自分类Dev

mmap有时会失败

来自分类Dev

片段有时会重叠-Android

来自分类Dev

BootStrap映像有时会重叠

来自分类Dev

CIGaussianBlur有时会更改imageOrientation

来自分类Dev

XDomainRequest有时会随机中止

来自分类Dev

Laravel有时会验证规则

来自分类Dev

有时会引发NetworkOnMainThreadException

来自分类Dev

Paramiko有时会引发“ AuthenticationException”

来自分类Dev

自动登录有时会失败

来自分类Dev

自动登录有时会失败

来自分类Dev

CIGaussianBlur有时会更改imageOrientation

来自分类Dev

Ubuntu 14.04有时会冻结

来自分类Dev

presentViewController有时会崩溃

来自分类Dev

.NET ImageList有时会损坏

来自分类Dev

Selenium executeScript有时会失败

来自分类Dev

mmap有时会失败

来自分类Dev

音量有时会达到最大

来自分类Dev

WCF有时会返回401

来自分类Dev

AJAX 请求有时会乱序

来自分类Dev

onClickListener() 有时会错过 ImageView

来自分类Dev

canvas.drawCircle有时会起作用,有时会不起作用

来自分类Dev

为什么Clang有时会返回nullptr,有时会返回我想要的?

来自分类Dev

setSelectionFromTop有时会工作,有时会不工作

来自分类Dev

onHandleIntent有时会工作,有时会不工作

来自分类Dev

Windows 10键盘有时会重复按键,有时会忽略按键

来自分类Dev

Ubuntu 16.04 WiFi有时会工作,有时会不工作

来自分类Dev

将Sprite的TextureRegion从另一个Atlas更改为一个有时会失败-LIBGDX

来自分类Dev

jQuery有时会加载所有值,但有时会丢失一些值