2009-03-08 3 views
3

이 문제를 해결하는 방법을 잘 모릅니다.2D 게임을 위해 Java로 타일 맵을 작성하는 방법은 무엇입니까?

기본적으로 400x400 창의 픽셀 -> 타일 표현이 필요합니다. 화면상의 각 좌표 (예 : 120x300)는 타일의 일부 여야합니다. 내 가장 작은 스프라이트는 4 픽셀이므로 1 타일 = 4 픽셀이라고 말할 수 있습니다. 플레이어와 적의 스프라이트는 모두 20 x 20이므로 각 플레이어/나쁜 녀석은 5 개의 타일을 차지합니다. 타일의 인덱스/ID를 납품하여 플레이어/몬스터 스프라이트의 X/Y 좌표를 검색

  • :

    은 그럼이지도 클래스를 사용하고 싶습니다.

  • 경계가 어디인지 알고 있으므로 스프라이트를 400x400 이상으로 이동하지 않으므로 숨 깁니다.

  • 타일이 비 었는지 여부를 아는 충돌 감지.

어떻게이 작업을 수행 할 수 있습니까? 여기에 x, y-> 타일 또는 타일 인덱스 -> x, y 변환 (적절하게 스프라이트 그리기)에 대해 구체적으로 말합니다.

답변

4

먼저 표현과 관련이있는 픽셀의 개념을 실제 게임 객체 인 타일로 분리하십시오. 제약 조건이 게임에 적용됩니다.

나는 당신이 원하는 거친 API를 스케치하는 것부터 시작하는 것이 좋습니다. 다음과 같음 :

public class Board { 
    public Board (int width, int height){.. } 
    public boolean isOccupied(int x, int y){.. } 
    public void moveTo(Point from, Point to) { .. 
    (maybe throws an exception for outofbounds) 

여기서 보드의 모든 내부 장치는 픽셀이 아니라 타일입니다. 이어서 화소 정보는 타일 내부에 2 차원 어레이 또는 단일 어레이로서 표현 될 수있는 내부 곱하기

public Point getPixelPosition(int xTilePos, int yTilePos, int pixelsPerTile).. 

의 비트와 함께 타일 표현으로부터 독립적으로 기판으로부터 경우 사용자는 것 유도 될 수있다 일종의 내부 표현 체계를 사용하여 배열을 보드 사각형에 매핑하여 mod 산술을 매핑하십시오.

+0

그 getPixelPosition()에 대한 코드와 나는 당신의 대답을 받아 들일 것입니다 : –

+0

Geez ClickUpvote는 힌트를 얻습니다. 화면을 모델로 사용하는 것은 좋은 디자인이 아닙니다. 메모리 모델을 사용하십시오. 색상 및 위치는 독립적 인 속성입니다. 메모리 모델을 사용하여 다른 속성을 저장할 수도 있습니다. 예 : http://www.fastgraph.com/qfrip.html – jim

+0

x, y 속성을 모르는 상태에서 스프라이트를 화면에 그려서 한 타일에서 다른 타일로 이동했음을 나타낼 수 있습니까? –

1

짧은 답변 : 곱셈 및 모듈러스 연산.

그러나이 문제로 인해 어려움을 겪고있는 경우 게임을 작성하기 전에 진지한 수학 재충전을하는 것이 좋습니다.

또한 명세서

내 작은 요정 4 픽셀, 그래서 우리 말할 수 1 기와 = 4 개 픽셀이. 플레이어와 적의 스프라이트는 모두 20 x 입니다. 따라서 각 플레이어/나쁜 사람은 타일 5 개를 차지합니다.

은 합리적인 기하학에 적합하지 않습니다. "1 타일 = 4 픽셀"에 의해 타일이 2x2라는 것을 의미하면 플레이어는 5가 아닌 100을 취합니다. 만약 당신이 4x4라면 플레이어는 여전히 25가 아닌 5를 얻습니다.

+0

타일 = 픽셀/4. 작은 스프라이트 (4x4) = 4/4 = 1 타일. 큰 스프 라이트 (20 x 20) = 20/4 = 5. 아니? 아마 5 점과 같은 타일 인덱스를 기준으로 x, y 좌표를 검색하는 방법이 나에게 충격을줍니다. 예를 들어 보여 주시겠습니까? –

+0

번호 20 픽셀 x 20 픽셀 = 400 평방 픽셀. 4x4 타일은 16 평방 픽셀입니다. 400/16 = 400x4 픽셀 영역 안에 25x4x4 타일. – Paul

1
/** size of a tile in pixel (for one dimension)*/ 
int TILE_SIZE_IN_PIXEL = 4; 
/** size of a piece in tiles (for one dimension)*/ 
int PIECE_SIZE_IN_TILE = 5; 


public int tileToPixel(int positionInTiles){ 
    return TILE_SIZE_IN_PIXEL * positionInTiles; 
} 

/** returns the tile coordinate to which the given tile coordinate belongs 

Note: tileToPixel(pixelToTile(x)) only returns x if x is the upper or left edge of a tile 
*/ 
public int pixelToTile(int positionInPixel){ 
    return positionInPixel/TILE_SIZE_IN_PIXEL; 
} 

아마도 두 개의 인수 (x와 y)로 연산하는 메소드를 원할 것입니다.

ID-> 조각 변환과 그 반대의 경우에는 다양한 방법을 사용할 수 있습니다. 선택할 수있는 것은 정확한 요구 사항 (속도, 게임 크기 ...)에 달려 있습니다. 따라서 구현 세부 사항을 숨기고 나중에 변경할 수 있도록하십시오.

나는 정말 쉬운 솔루션을 시작했으면합니다 : 당신이 시작 도착

public class Piece{ 
    /** x position measured in tiles */ 
    private int x; 
    /** y position measured in tiles */ 
    private int y; 

    /** I don't think you need this, but you asked for it. I'd pass around Piece instances instead */ 
    private final Long id; 

    public void getX(){ 
     return x; 
    } 
    public void getY(){ 
     return y; 
    } 

    public void getID(){ 
     return id; 
    } 

} 

public class Board(){ 
    private Set<Long,Piece> pieces = new HashMap<Piece>(pieces); 

    public Piece getPieceOnTile(int tileX, int tileY){ 
     for(Piece piece:pieces){ 
      if (isPieceOnTile(piece, tileX, tileY)) return piece; 
     } 
    } 

    private boolean isPieceOnTile(piece, tileX, tileY){ 
     if (piece.getX() < tileX) return false; 
     if (piece.getX() > tileX + PIECE_SIZE_IN_TILE) return false; 

     if (piece.getY() < tileY) return false; 
     if (piece.getY() > tileY + PIECE_SIZE_IN_TILE) return false; 

     return true; 
    } 
} 

희망을. 컴파일러가 없으면 모든 코드가 작성되므로 오타 및 물론 버그가 포함될 수 있습니다.이 버그는 크리에이티브 커먼즈 라이선스에 따라 배포 될 수 있습니다.

세트에 조각을 보관하는 방식은 조각이 많지 않으면 잘 작동합니다. 대부분의 보드 영역에 조각이 포함되어 있지 않으면 2D 배열보다 효과적입니다. 모든 것은 현재 중첩 된 부분이 없다고 가정합니다. 필요한 경우 getPieceOnTile은 조각 컬렉션을 반환해야합니다. 순서가 중요하지 않은 경우 집합, 존재하는 경우 목록입니다.

+0

고마워요,하지만 타일 번호를 기준으로 x.y 좌표를 결정하는 방법을 알려주시겠습니까? 그게 내가 tileToPixel 메서드에 대한 것입니다 –

+0

을 알아낼 수 없었어요 –

관련 문제