2009-02-02 7 views
0

저는 XNA에서 테트리스와 같은 게임을 만들려고 노력하고 있습니다. 현재 어떤 방법으로이를 처리 할 수 ​​있을지 생각하고 있습니다.배열 내부의 객체 이동

이것은 내가 지금까지 가지고있는 것입니다 : 블록이라고 불리는 클래스가 있는데, 예를 들어 텍스처와 색조가 있습니다. 다음 전체 그리드 것

Block[,] blocks = new Block[10,20]; 

:

그런 다음 내가 좋아하는, 이중 배열에 모든 것을 가지고 계획되었다. 처음에는

blocks[x,y+1] = blocks[x,y]; 

blocks[x,y] = null; 

나는 이것이 좋은 아이디어라고 생각했지만, 지금은 생각을 해 봤는데 때 정말 아니에요 : 블록 아래쪽으로 이동할 때

그리고,이 같은 일을 생각하고 있었는데 확실한. 기억과 어떻게 작동합니까? 내가 그 일을 할 때마다 새로운 객체를 생성합니까? 누군가가 배열 내부에서 객체를 움직일 때 실제로 어떻게 작동하는지 설명해 주시겠습니까?

저는 테트리스 관련 답변을 찾고 있지 않습니다. 실제로 어떻게 작동하는지에 관심이 있습니다.

감사합니다.

답변

2

아니요, 포인터를 움직이는 것뿐입니다. 당신이 말할 때 :

blocks[x,y+1] = blocks[x,y]; 

당신이하고있는 일은 당신이 포인터를 바꾸는 것입니다. 오브젝트는 그대로있는 그대로 유지되지만 인덱스 x, y에있는 대신 x, y + 1의 인덱스에있게됩니다. 당신이 거기 당신이 객체 X에 대한 참조를 제거하고

blocks[x,y] = null; 

을 말할 때 다른 아무것도에 대한 참조를 유지하지 않는 경우, y를, 가비지 Collecter 그것을 정리합니다.

0

배열에 값 유형 (int, string 등)을 저장하는 경우 값 유형을 C#에서 변경할 수 없기 때문에 값을 복사 할 때마다 실제로 데이터 사본을 만들 수 있습니다. 배열에 클래스 (참조 유형)를 저장하므로 코드는 실제로는 전체 객체가 아니라 포인터의 복사본을 만들고 있습니다.

1

위의 첫 번째 대답은 거의 정확하지만 할당이 포인터를 바꿔 쓰지 않고 복제하고 있습니다. 첫 번째 코드 행 다음에 원래 블록 [x, y]에서 참조 된 객체에 대한 두 개의 참조가 있습니다. 널 지정은 원래 참조를 제거하지만 블록 [x, y + 1]에 여전히 새 참조가 있습니다. Null은 하나의 힙 객체가 GC에 대해 공정한 게임이 될 것이라는 사실을 알리지 않습니다.