2015-06-23 39 views
9

Tôi đã ở đây trong 2-3 tuần và tôi vẫn không thể quản lý để phát hiện xung đột thích hợp. Tôi đã tạo ra một mê cung bằng cách sử dụng hình chữ nhật. Tôi muốn đối tượng của tôi (mà là trong một hình chữ nhật) để ngăn chặn bất cứ khi nào đối tượng của tôi va chạm với bất kỳ bức tường và có thể di chuyển bất cứ nơi nào (hoặc trượt xuống một bức tường). Các bức tường của tôi (hình chữ nhật) có tọa độ âm như sau:Phát hiện va chạm giữa các hình chữ nhật (không chồng chéo) - libgdx

shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH 
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST 
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST 
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH 

Tôi hiện đang sử dụng phương pháp chồng chéo mà tôi đã tìm thấy trong SO. Đây là phương pháp thuộc lớp CollisionManager của tôi:

private boolean overlaps (Rectangle collision, Rectangle wall) { 
    return Math.min(collision.x, collision.x + collision.width) 
     < Math.max(wall.x, wall.x + wall.width) 
    && Math.max(collision.x, collision.x + collision.width) 
     > Math.min(wall.x, wall.x + wall.width) 
    && Math.min(collision.y, collision.y + collision.height) 
     < Math.max(wall.y, wall.y + wall.height) 
    && Math.max(collision.y, collision.y + collision.height) 
     > Math.min(wall.y, wall.y + wall.height); 
} 

Tôi có chức năng lưu mọi di chuyển vị trí của đối tượng. Vì vậy, khi một vụ va chạm xảy ra, đối tượng phục hồi để di chuyển trước đó trước khi di chuyển qua (kể từ khi di chuyển cuối cùng là khi va chạm xảy ra) (ví dụ dưới đây):

private void overlapsTop(Entity object, Rectangle wall){ 

    Rectangle r = new Rectangle(); 
    if(spritePositions.size() != 0){ 
     r = spritePositions.get(spritePositions.size()-1); 
    } 
    object.update(r.x, r.y, r.width, r.height); 
    object.getObject().setBounds(r.x, r.y, r.width, r.height); 
    spritePositions.clear(); 
} 

Thông tin thêm: Tôi đang di chuyển đối tượng của tôi như thế này:

public void moveRight(){ 
    position.x += 1f; 
    update(); 
} 

public void update(){ 

     boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight()); 
} 

Nơi tôi bị kẹt là chức năng chồng chéo của tôi (hàm tôi đã tìm thấy trong SO). Nó hoạt động hầu hết các trường hợp; chưa, ví dụ, nếu đối tượng di chuyển gần một bức tường bên phải và chạm vào nó, hàm trả về true và mọi thứ được thực hiện. Nhưng hãy nói nếu tôi trượt dọc theo tường và di chuyển trực tiếp xuống và không có tường, vật thể dừng lại tại một điểm vì nó phát hiện va chạm giữa phần dưới của vật thể và đỉnh tường (khi không có) và va chạm giữa bên phải của vật thể và bên trái bức tường.

Tôi đang cố gắng tìm một giải pháp khác cho việc này. Tôi chỉ muốn đối tượng của tôi dừng lại ở bất kỳ bức tường nào và có thể di chuyển (hoặc trượt xuống một bức tường) mà không nghi ngờ rằng có thể có một vụ va chạm không có tường gần đó. Tôi cảm thấy rằng tôi rất gần với một giải pháp, nhưng tôi sẽ cần thêm một chút trợ giúp.

CẬP NHẬT

Tôi đã cập nhật chức năng moveright và chức năng cập nhật. @Adrian Shum và @Matthew Mark Miller Tôi đã thực hiện mọi thứ ngay bây giờ với một số nguyên (có nghĩa là thay vì 0.01f, tôi sử dụng 1f).

Vì vậy, các mã sau đây mà tôi sử dụng để di chuyển các đối tượng là như thế này:

if(Gdx.input.isKeyPressed(Keys.RIGHT)){ 

       if(collisionManager.canSpriteNotMoveRight(object)){ 
        object.stopGoingRight(); 
       }else{ 
        object.moveRight(); 
       } 
      } 

Trong lớp collisionManager của tôi, hàm stopGoingRight như sau:

public void stopGoingRight(){ 
    position.x -= 1f; 
    update(); 
} 

Cho đến nay, rất tốt Khi đối tượng va chạm với bức tường, đối tượng dừng lại và bị trả lại. Tốt lắm. Nhưng tôi có một vấn đề khác (điều đó gây khó chịu) mà tôi sẽ cố gắng mô tả những gì tốt nhất có thể. Ví dụ, nếu tôi tiếp tục di chuyển vật thể lên tường, vật thể sẽ dội lại nhiều lần từ bức tường đó; nếu tôi ngừng nhấn phím lên, vật thể đôi khi sẽ bị kẹt trong tường. Vì vậy, những gì xảy ra là khi tôi nhấn phím xuống, nó sẽ đi lên thay vì đi xuống (hoặc nếu tôi nhấn trái, đối tượng sẽ đi bên phải thay vì đi bên trái) vì chức năng chồng chéo được thực thi (vì cả đối tượng lẫn tường) giao nhau).

Có cách nào để tôi giải quyết vấn đề này không? Có vẻ như Libgdx không hoàn toàn phù hợp để xử lý loại phát hiện va chạm này, nhưng tôi chỉ đang đi sâu vào việc xây dựng trò chơi của mình ngay bây giờ.

+0

Hình chữ nhật bạn có thể xoay vòng không? Hay bạn chỉ xoay đầu? –

+0

Có, bạn có thể kiểm soát vòng quay của nó. Về cơ bản, khi bạn di chuyển xuống, lên, sang phải hoặc trái, đối tượng sẽ xoay tương ứng. –

+0

Nhưng 'Hình chữ nhật' sẽ luôn được Axis-Aligned phải không? – Springrbua

Trả lời

4

cuối cùng tôi đã tìm thấy một giải pháp tốt tất cả nhờ vào liên kết sau: On overlap, player gets stuck libgdx Rectangle.

Về cơ bản, tôi phải tạo một chuyển động "giả" để xem đối tượng có va chạm với tường không. Nếu có va chạm, tôi chỉ dừng đối tượng và không thực hiện bước di chuyển mới.

Cảm ơn sự giúp đỡ của mọi người :) !! Nó được đánh giá cao !!

5

Thuật toán va chạm của bạn có vẻ dài dòng nhưng chính xác (Wordy vì min của x, x + chiều rộng luôn luôn là x là chiều rộng phải> = 0 và nghịch đảo là đúng cho max).

Bạn có cho rằng khả năng đó là vấn đề chính xác về dấu chấm động? Ví dụ: nếu bạn thêm 1 vào một số fp, thì sau đó xóa 1 khỏi kết quả, bạn không được đảm bảo quay lại với giá trị ban đầu. Bạn có thể nhiều hơn một chút hoặc ít hơn vì kết quả trung gian có thể không thể đại diện như một phao.

dụ ưa thích của tôi: .1f + 2f> .3f

Các vấn đề liên quan