2013-08-20 47 views
9

Tôi đã cố gắng giải quyết vấn đề này trong hai ngày và tôi đã từ bỏ việc tìm một giải pháp hiện có.Nhiều máy ảnh trong libgdx (có thể tương tự trong các khung công tác khác)

Tôi đã bắt đầu học libgdx và hoàn thành một vài hướng dẫn. Và bây giờ tôi đã cố gắng sử dụng tất cả những gì tôi đã học và tạo ra một trò chơi cuộn bên đơn giản. Bây giờ, tôi biết rằng có những ví dụ libgdx về điều này, nhưng tôi đã không tìm thấy một trong đó kết hợp Box2d với scene2d và diễn viên cũng như các bản đồ lát gạch.

Vấn đề chính của tôi là với máy ảnh.

Bạn cần một máy ảnh cho Giai đoạn (theo như tôi biết được sử dụng cho ma trận chiếu của SpriteBatch được chuyển đến phương thức draw() tại diễn viên, nếu điều này sai, hãy sửa tôi) và bạn cần một máy ảnh cho TileMapRender để gọi phương thức render(). Ngoài ra, trong một số hướng dẫn có một OrthographicCamera trong GameScreen, được sử dụng khi cần thiết.

Tôi đã cố truyền đối tượng OrthographicCamera cho các phương pháp, tôi đã cố gắng sử dụng máy ảnh từ Giai đoạn và máy ảnh từ TileMapRenderer ở mọi nơi. Ví dụ:

OrthographicCamera ocam = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT); 
stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render 
tileMapRenderer.render(ocam); 
stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed 

Tôi cũng đã cố gắng sử dụng các máy ảnh khác nhau ở mọi nơi.

Sau khi thử tất cả những điều tôi đã không lưu ý những gì xảy ra chính xác khi nào nhưng tôi sẽ liệt kê những gì sẽ xảy ra:

  • Không có gì trên màn hình (Có lẽ máy ảnh là tránh xa những thứ mà được rút ra) là
  • Tôi có thể thấy bản đồ lát và đường viền từ trình gỡ lỗi (tôi cũng sử dụng debugRender nhưng tôi không nghĩ rằng nó can thiệp vào máy ảnh), nhưng không thể nhìn thấy hình ảnh của diễn viên (có thể là tắt màn hình)
  • Tôi có thể thấy mọi thứ mà tôi nên nhưng khi tôi cố gắng di chuyển Diễn viên và Máy ảnh, được cho là sẽ theo anh ta, nghi thức đi nhanh hơn cơ thể (hình vuông gỡ lỗi màu xanh lá cây).

Vì vậy, câu hỏi chính của tôi là:

  • Tôi không hiểu điều gì xảy ra khi bạn có nhiều camera. "Thông qua" mà bạn thực sự thấy trên montior?
  • Tôi có nên sử dụng nhiều máy ảnh và cách thực hiện không?

Ngoài ra, tôi nghĩ rằng tôi nên đề cập đến rằng tôi đang sử dụng OpenGL ES 2.0.

Tôi xin lỗi vì câu hỏi dài, nhưng tôi nghĩ rằng tôi nên mô tả chi tiết, vì nó hơi phức tạp đối với tôi.

+0

bạn đã gọi stage.act() & stage.draw() để hiển thị giai đoạn –

Trả lời

16

Bạn thực sự thấy tất cả chúng cùng một lúc. Mặc dù vậy, họ có thể nhìn vào một thế giới hoàn toàn khác, nhưng tất cả họ đều đưa quan điểm của họ lên màn hình. Bạn có thể sử dụng một số máy ảnh hoặc chỉ một máy ảnh. Nếu bạn chỉ sử dụng một trong những bạn cần phải chắc chắn rằng bạn cập nhật ma trận chiếu một cách chính xác, giữa vẽ TiledMap, Stage của bạn với các diễn viên và có thể cho Box2DDebugRenderer tùy chọn.

Tôi muốn sử dụng một Camera phụ cho Box2DDebugRenderer, vì bạn có thể dễ dàng vứt nó đi sau. Tôi giả sử bạn sử dụng hệ số chuyển đổi để chuyển đổi mét thành pixel và theo cách khác.Có tỷ lệ 1: 1 sẽ không tốt lắm. Tôi luôn sử dụng cái gì đó giữa 1m = 16px và 1m = 128px.

Vì vậy, bạn khởi tạo nó theo cách này, và sử dụng một cho renderer gỡ lỗi của bạn:

OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth()/Constants.PIXEL_PER_METER, Gdx.graphics.getHeight()/Constants.PIXEL_PER_METER); 

Đối TiledMapRenderer của bạn, bạn có thể sử dụng một camera phụ là tốt, nhưng điều đó ai sẽ làm việc trong màn hình tọa độ duy nhất, do đó không chuyển đổi:

OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

TiledMap sẽ luôn được hiển thị tại (0, 0). Vì vậy, bạn cần phải sử dụng máy ảnh để di chuyển xung quanh trên bản đồ. Nó có thể sẽ đi theo một cơ thể, vì vậy bạn có thể cập nhật nó qua:

tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER) 

Hoặc trong trường hợp nó sau một diễn viên:

tiledMapCam.position.set(actor.getX(), actor.getY()) 

tôi thực sự đã không được sử dụng cùng với scene2d Box2D nào, vì tôi không cần phải tương tác rất nhiều với các đối tượng trò chơi của tôi. Bạn cần phải thực hiện một PhysicsActor tùy chỉnh ở đây, mở rộng Actor và xây dựng cây cầu từ scene2d đến Box2D bằng cách có một cơ thể như một tài sản. Nó sẽ phải thiết lập vị trí Actors, xoay vv dựa trên cơ thể ở mọi bước cập nhật. Nhưng ở đây bạn có một vài lựa chọn. Bạn có thể sử dụng lại tileMapCam và làm việc trong các tọa độ màn hình. Trong trường hợp này, bạn cần luôn nhớ nhân với Constants.PIXELS_PER_METER khi bạn cập nhật diễn viên của mình. Hoặc bạn sẽ sử dụng một cam khác có cùng chế độ xem như physicsDebugCam. Trong trường hợp này, không cần chuyển đổi, nhưng tôi không chắc liệu điều này có thể can thiệp vào một số điều cụ thể của scene2d hay không. Đối với ParallaxBackground bạn cũng có thể sử dụng một máy ảnh khác, đối với giao diện người dùng, bạn có thể sử dụng lại một giai đoạn và một máy ảnh khác ... hoặc sử dụng lại những người khác bằng cách đặt lại chính xác. Đó là sự lựa chọn của bạn nhưng tôi nghĩ rằng một số máy ảnh không ảnh hưởng đến hiệu suất nhiều. Ít đặt lại và chuyển đổi thậm chí có thể cải thiện nó.

Sau khi mọi thứ được thiết lập, bạn chỉ cần hiển thị mọi thứ, sử dụng máy ảnh chính xác và hiển thị mọi "lớp"/"chế độ xem" trên đầu trang của nhau. Đầu tiên là ParallaxBackground, sau đó là Tiledmap của bạn, sau đó là Entity-Stage, sau đó là khung nhìn Box2DDebugging của bạn, sau đó là UI-stage của bạn.

Nói chung hãy nhớ gọi số spriteBatch.setProjectionMatrix(cam.combined); và sử dụng cam.update() sau khi bạn thay đổi bất kỳ thứ gì trong máy ảnh của mình.

+0

Tôi có vấn đề tương tự; Tôi đang vẽ một bản đồ lát gạch bằng cách sử dụng một đơn vị tùy chỉnh và phép chiếu (như là một phần của một Giai đoạn), và tôi muốn hiển thị một giao diện người dùng gỡ lỗi với văn bản như FPS trên đầu trang đó. Tuy nhiên, ngay cả khi tôi sử dụng một 'OrthographicCamera' riêng biệt cho giao diện gỡ lỗi và kéo nó ra màn hình w/h, và đặt nó trên lô sprite được sử dụng để hiển thị văn bản, nó sẽ hiển thị dưới dạng giới hạn bản đồ chứ không phải màn hình của tôi giới hạn. Tôi có phải thiết lập lại một cái gì đó sau khi gọi stage.draw() và trước khi debugUi.render() để ngăn chặn điều này xảy ra? Chắc chắn là tôi đang thiếu gì đó. – Matthias

+0

@Matthias Vui lòng tạo câu hỏi mới bao gồm mã có liên quan. – noone

+0

chắc chắn: http://stackoverflow.com/questions/26936952/resetting-the-viewport-after-creating-rendering-a-scene2d-stage – Matthias