2013-07-29 3 views
2

libgdx와 scene2d를 사용하는 카드 게임을하고있는 임. 내 카드 클래스는 Image 액터 클래스를 확장합니다. 나는 드래그 할 때 x 위치에 따라 카드가 그려지는 순서를 설정하는 방법을 찾고 있습니다. x에 따라 액터 z 인덱스를 조정하는 방법은 무엇입니까?

enter image description here

그래서 나는 시도 :

@Override 
public void drag(InputEvent event, float x, float y, int pointer) { 
    float sx = event.getStageX(); 
    float sy = event.getStageY(); 
    if(sx - offsetX > 0 && sy - offsetY > 0){ 
     event.getTarget().setPosition(sx - offsetX, sy - offsetY); 
     c.setZIndex((int) sx); 
    }    
} 

분명히, Z- 색인이 무대/그룹에서 배우의 수에 바인딩되어 있기 때문에이 늘 작동합니다. 그래서 기본적으로 인덱스는 0-4가되어야합니다. 내 다음 접근 방식은 화면 너비를 5로 나누고 그 값을 zindex로 설정하는 것입니다. 카드가 전체 너비에 걸쳐 고르게 분리되어 있으면 잘 작동합니다. 하지만 카드가 중간에 압축되어 있으면 모양이 좋아지지 않습니다. 2 장에서 3 장의 카드가 가운데에 떨어지며 마지막으로 끌린 카드는 다른 카드 위에 그려진 카드입니다. 나는 그다지 원하지 않는다.

나의 마지막 접근 방식은 모든 카드를 xposition으로 주문하고 z- 색인을 제공하는 루프를 사용했습니다. 그리고 이것은 내가 원하는 것처럼 작동하지만 느린 (다른 모든 것들이 믹스에 추가되었을 때)

어쨌든 저는 액터를 반복하지 않고 x- 위치에 상대적으로 z- 인덱스를 설정할 수 있습니까?

답변

3

모든 카드의 초기 위치를 배열하십시오. 드래그가 발생할 때마다 이미 가지고있는 드래그 방법을 기반으로 배열을 다시 섞습니다. 0에서 길이 1까지의 배열에 저장된 위치를 사용하여 카드를 그립니다. 첫 번째 카드의 위치는 인덱스 0이고 마지막 숫자는 배열에서 1을 뺀 길이입니다.

또는 Group을 사용하십시오. 그리기 순서로 그룹을 추가하십시오. 그룹의 액터를 바꿀 수 있습니다. 드래그 이벤트를 기반으로 카드를 교환하십시오.

+0

의미 나는 여전히 그 배열 (지점)을 통해 루프해야 할 것인가? 내 질문은 그것을 통해 반복하지 않고 그것을하는 방법이었습니다. 그룹의 스왑 기능에 관해서는이 기능을 시도해보십시오.하지만 다시 한 번 배우를 찾아야 만합니다. :/모든 배우를 반복하지 않고이 작업을 수행 할 수 있습니까? – noisyass2

+0

당신은 하드웨어의 힘을 과소 평가하고 있습니다. 100 명의 액터가 있고 배열을 반복하면 (배열이 매우 가벼운 것을 기억하십시오. 벡터에 포함 된 모든 것은 벡터입니다 (Vector2의 posArray []), 이것은 아무 것도 분해하지 않습니다. 아무리해도 libGDX에게 그릴 것을 요구해야합니다. 따라서 libgdx는 액터를 반복해야합니다. –

+0

@ noisyass2 벤치마킹을 시도하십시오. 배열을 사용하는 첫 번째 제안은 훨씬 빠르다. –