2014-03-31 3 views
3

축소 할 때 더 작은 (4x4) 텍스처를 사용하고 확대 할 때 더 큰 (16x16) 텍스처를 사용하여 스프라이트 컬렉션을 그립니다. 줌 레벨이 임계 값이면 스왑이 발생합니다.libgdx spritebatch 텍스처의 원점을 기반으로 한 드로잉이 아닙니다.

그러나 부드럽게 전환하려면 sprite ([x, y]에 위치)를 그 원점을 스프라이트 중심으로 그려야합니다. 현재 그들은 왼쪽 하단 구석을 기준으로 그려지고 있습니다. 따라서 텍스처 스왑이 발생하면 스프라이트가 약간 점프합니다. 기원이 일치하지 않기 때문입니다.

디버깅 할 변수를 만들고 올바른지 확인했습니다.

TextureRegion sprite = null; 

    boolean useHighResTexture = (_gameRef.cameraZoom < CAMERA_ZOOM_SWITCH_LO_RES); 
    if (useHighResTexture) { 
     //Zoomed in, Hi res, Use animation 
     sprite = animation.getKeyFrame(animationStateTime, true); 

    } else { 
     //Zoomed out, lo-res, Use static image 
     sprite = Assets.instance.getSmall(); 
    } 


    float spriteWidth = sprite.getRegionWidth(); 
    float spriteHeight = sprite.getRegionHeight(); 
    float spriteOriginX = spriteWidth/2; 
    float spriteOriginY = spriteHeight/2; 

    //Draw(TEXTURE, x, y, originx, originy, 
    //  width, height, scaleX, scaleY, rotation, 
    //  srcX, srcY, 
    //  srcWidth, srcHeight, boolflipX, boolflipY 

    //this.setCenter(spriteOriginX, spriteOriginY); 

    batch.draw(sprite.getTexture(), this.x, this.y, spriteOriginX, spriteOriginY, 
      spriteWidth, spriteHeight, 1.0f, 1.0f, this.directionFaced, 
      sprite.getRegionX(), sprite.getRegionY(), 
      sprite.getRegionWidth(), sprite.getRegionHeight(), false, false); 

당신은 내가 AssetsManager를 사용하여 버전 확대 (16 × 16)에 애니메이션 및 축소 버전 (4 × 4)에 정적 이미지를 사용하고 있음을 볼 수 있습니다.

변수 spriteWidth, spriteHeight 올바른지 모두에서 하나 또는 축소 여부에 따라 16또는 4.

변수 spriteOriginXspriteOriginY은 (I 가정) 모두 8 2가 또는 축소 여부에 따라 하나에서 정확하다.

나는 (왼쪽 아래 모서리에서 오프셋 (offset))를 그 기원에 따라 스프라이트를 그릴 것 위에로 설정 기원

batch.draw() 올바른 내 전화가와 생각이나 했 겠어요?

많은 감사, J

답변

7

아니, 그것은 올바르지 않습니다. draw()은 항상 왼쪽 하단 모서리를 위치로 사용합니다. 원점은 크기 조절 및 회전에만 사용됩니다. ,

batch.draw(sprite.getTexture(), this.x - spriteOriginX, this.y - spriteOriginY, 
    spriteOriginX, spriteOriginY, spriteWidth, spriteHeight, 1.0f, 1.0f, 
    this.directionFaced, sprite.getRegionX(), sprite.getRegionY(), 
    sprite.getRegionWidth(), sprite.getRegionHeight(), false, false 
); 

을 왼쪽과이 당신을 그냥 "푸시"왼쪽 하단 모서리를 (위치 인)함으로써 :
그래서 당신이 당신의 위치에서 원점을 빼야한다는 것을 의미한다 너비와 높이가 반으로 줄어들어 스프라이트의 중심이 실제로 정의됩니다.

다시 : 원점은 회전 및 크기 조정에만 사용됩니다. draw() 방법으로 회전을 설정하면 원점을 중심으로 회전합니다 (중간의 경우).

+0

감사합니다. 치료를합니다. 주제를 벗어나서 간단한 두 가지가 아닌 두 가지 텍스처 스왑간에 부드럽게 전환하는 좋은/표준 방법론을 알고 계십니까? – Jammo

+0

나는이 변화가 정말로 필요하다고 생각하지 않는다. 당신의 경우 엔 아마도 애니메이션의 원인이 될 수 있습니다. 애니메이션이 확대 된 경우에만 재생되며 그렇지 않은 경우에는 보이지 않습니다. 그러나 여기에서도 내가 필요한지 확실하지 않다. 나는 큰 성과 향상이 있다고 생각하지 않는다. 'TextureFilter'를 사용하려고합니다. 그들은 1 Texel (텍스처의 픽셀)이 화면에 하나의 픽셀이 아닌 경우 픽셀의 색상을 계산하는 방법을 설명합니다. 2 가지 경우가 있습니다 : 축소 : 1 텍셀이 1 픽셀 미만 (축소 한 경우) 및 관리 : 1 텍셀이 1 픽셀 이상 (확대)입니다. 그러나 그것은 다른 이야기입니다. – Springrbua

관련 문제