Phát hiện nếu một sprite đã rời khỏi máy ảnh trong libgdx?


8

Có một phương pháp để biết nếu một sprite đã rời khỏi máy ảnh của sân khấu? hoặc tôi phải làm các hoạt động của tôi? : P

Câu trả lời:


5

Lớp Camera chứa một đối tượng Frustum với phương thức công khai pointInFrustum (điểm Vector3) trả về giá trị true nếu sprite của bạn nằm trong sự thất vọng của máy ảnh. Bạn cũng có thể xem wiki người dùng để biết các kỹ thuật loại bỏ khác. http://code.google.com.vn/p/libgdx-users/wiki/Culling


2
pointInFrustum (point) trả về true nếu điểm được chỉ định nằm trong phạm vi, không phải là Sprite. Sprite có thể có chiều rộng và chiều cao riêng để không thể kiểm tra trực tiếp bên trong màn hình bằng phương pháp đó.
arielsan

@arielsan Miễn là bạn có thể kiểm tra xem một điểm có nằm trong sự thất vọng hay không, bạn chỉ cần kiểm tra xem tất cả bốn điểm của một sprite có trong một điểm không.
TomTsagk

3

Nếu bạn đang tạo một trò chơi 2D với các ô xếp, bạn có thể dễ dàng thực hiện loại bỏ riêng của mình, nó rẻ hơn rất nhiều vì bạn chỉ lặp lại chính xác những gì bạn cần trong mảng gạch của mình.

Những điều bạn nên biết:

  • Vị trí camera
  • Chiều rộng / chiều cao khung nhìn
  • Ngói chiều cao / chiều cao

Bây giờ chúng ta có thể tính toán nên vẽ bao nhiêu gạch.

  • Tổng số gạch ngang trên màn hình = viewport.width / tileWidth
  • Tổng số ô dọc trên màn hình = viewport.height / tileHeight

Toán học phụ thuộc vào cách mọi thứ được thiết lập nhưng rất đơn giản. Ví dụ, nó tạo ra sự khác biệt nếu trung tâm của màn hình là vị trí camera, phía trên bên trái hoặc dưới cùng bên trái.

Bạn nên kết thúc với một cái gì đó như thế này:

int startX = cameraWorldPosX / tileWidth;
int startY = cameraWorldPosY / tileHeight;

//When you have the position of the camera in the center of the screen you do something like this:

int startX = (cameraWorldPosX - viewport.width / 2) / tileWidth;
int startY = (cameraWorldPosY - viewport.height / 2) / tileHeight;

for (int y = startY; y < startY + viewportWidth / tileWidth; y++)
{
    for (int x = startX; x < startX + viewportHeight / tileHeight; x++)
    {
        //Draw logic
    }
}

Lợi ích của việc này là kiểm tra xem một điểm có nằm trong sự bực bội của bạn hay không là với điểm sau bạn cần lặp lại qua từng điểm thay vì sử dụng một mảng đơn giản trong đó bạn luôn lặp lại một lượng gạch tương đương với số lượng gạch ngang * gạch dọc mà thực sự cần phải vẽ. Bằng cách này bạn có thể có bản đồ khổng lồ và vẫn có tốc độ khung hình tốt. Thật không may, điều này trở nên khó khăn và phức tạp hơn khi sử dụng 3D nhưng lại khó hơn theo cấp số nhân với sự tự do của người dùng với máy ảnh. Bạn có thể tưởng tượng một camera phối cảnh cố định di chuyển với nhân vật chỉ cần một vài biến số được mã hóa cứng để thực hiện các thủ thuật tương tự trên một mảng các lưới thể hiện bản đồ của bạn.


0

Chỉ cần sử dụng kiểm tra hình cầu giới hạn. (Bạn có thể tính bán kính bằng pythagoras) Nó nhanh như địa ngục và cũng hoạt động với xoay vòng. Nó không hoàn hảo nhưng không bao giờ gây ra sự loại bỏ sai.

Đối với phiên bản tối ưu hóa ad hoc Intersector có một số hình chữ nhật chứa các phương thức chỉnh lưu, chúng cũng có thể hoạt động. Nhưng bạn cần phải tính toán hình chữ nhật cho máy ảnh tự làm phiền mình.


0

Hàm này kiểm tra nếu một diễn viên có thể nhìn thấy (chỉ hoạt động cho 2D). Hoạt động trong mọi tình huống, ví dụ như khi diễn viên ở trong một nhóm.

    /**
     * Returns if the actor is visible or not. Useful to implement 2D culling.
     **/
    public static boolean actorIsVisible(Actor actor) {
        Vector2 actorStagePos = actor.localToStageCoordinates(new Vector2(0,0));
        Vector2 actorStagePosTl = actor.localToStageCoordinates(new Vector2(
            actor.getWidth(), 
            actor.getHeight()));

        Vector3 actorPixelPos = new Vector3(actorStagePos.x, actorStagePos.y, 0);
        Vector3 actorPixelPosTl = new Vector3(actorStagePosTl.x, actorStagePosTl.y, 0);

        actorPixelPos = actor.getStage().getCamera().project(actorPixelPos);
        actorPixelPosTl = actor.getStage().getCamera().project(actorPixelPosTl);

        return !(actorPixelPosTl.x < 0 ||
                 actorPixelPos.x > Gdx.graphics.getWidth() ||
                 actorPixelPosTl.y < 0 ||
                 actorPixelPos.y > Gdx.graphics.getHeight()
                );
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.