2012-06-17 15 views
5

Tôi hiện đang phát triển trò chơi cho Android và tôi muốn chuyên môn của bạn về một vấn đề mà tôi đang gặp phải.Phát triển trò chơi trên Android: Phát hiện va chạm Không

Bối cảnh:

  1. trò chơi của tôi kết hợp tỷ lệ khung hình chuyển động độc lập, trong đó sẽ đưa vào chiếm giá trị thời gian đồng bằng trước khi thực hiện Velocity cần thiết tính toán.

  2. Trò chơi là nền tảng 2D truyền thống.

Các Vấn đề:

Dưới đây là vấn đề của tôi (giản thể). Hãy giả vờ rằng nhân vật của tôi là một hình vuông đứng trên đỉnh của một nền tảng (với "lực hấp dẫn" là một vận tốc xuống liên tục của characterVelocityDown).

tôi đã xác định việc phát hiện va chạm như sau (giả sử Y điểm trục xuống):

Với characterFootY là y-phối hợp của các cơ sở của nhân vật vuông của tôi, platformSurfaceY là thượng y phối của nền tảng của tôi, và platformBaseY là thấp y phối hợp của nền tảng của tôi:

if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) { 

        //Collision Is True 
        characterFootY = platformSurfaceY; 
        characterVelocityDown = 0; 

       } else{ 
        characterVelocityDown = deltaTime * 6; 

cách tiếp cận này làm việc p hoàn hảo khi trò chơi đang chạy ở tốc độ bình thường; Tuy nhiên, nếu trò chơi chậm lại, deltaTime (đó là thời gian trôi qua giữa khung trước và khung hiện hành) trở nên lớn, và characterFootY + characterVelocityDown vượt quá ranh giới xác định phát hiện va chạm và nhân vật chỉ rơi thẳng qua (như thể dịch chuyển).

Tôi nên tiếp cận vấn đề này như thế nào để ngăn chặn điều này?

Cảm ơn trước sự giúp đỡ của bạn và tôi mong muốn được học hỏi từ bạn!

+0

Nếu bất kỳ ai khác gặp sự cố này, giải pháp có thể cho điều này là giới hạn giá trị deltaTime để khi giá trị vượt quá một giá trị nhất định, bạn chỉ cần đặt giá trị đó bằng giới hạn. Điều này sẽ làm cho gamepeed không nhất quán, nhưng sẽ ổn trong hầu hết các trường hợp. – SeveN

+0

Bạn có cả giá trị trước và sau delta, khi so sánh có thể được thực hiện ở đó không? – cjk

Trả lời

1

Những gì bạn cần làm là chạy vòng lặp vật lý của mình với thời gian delta cố định và lặp lại nó nhiều lần tùy theo dấu hiện tại.

const float PHYSICS_TICK = 1/60.f; // 60 FPS 
void Update(float dt) 
{ 
    m_dt += dt; 
    while(m_dt > PHYSICS_TICK) 
    { 
     UpdatePhysics(PHYSICS_TICK); 
     m_dt -= PHYSICS_TICK; 
    } 
} 

Có ngăn split gia khác nhau sử dụng để xử lý các đánh dấu trái (m_dt)
Caps cho đánh dấu miniumum và đánh dấu tối đa cũng là phải.

+0

Và đối với hầu hết các trò chơi thì tốt nhất/dễ nhất là chỉ sửa bước thời gian cho toàn bộ logic trò chơi (không chỉ vật lý). –

1

Tôi đoán vấn đề ở đây là sự chậm trễ là không thể tránh khỏi. Bạn có thể thử và tối ưu hóa mã nhưng bạn sẽ luôn có người dùng với các thiết bị chậm hoặc các phần bận rộn trong trò chơi của bạn, nơi mất nhiều thời gian hơn bình thường để xử lý tất cả. Thay vì giả sử một đồng bằng phù hợp, giả định ngược lại. Mã theo nhận thức rằng ai đó có thể thử cài đặt nó trên bàn tính.

Về cơ bản, như SeveN nói, làm cho vòng lặp trò chơi của bạn xử lý sự chậm lại. Cách duy nhất thực sự để làm điều này (trong kinh nghiệm hạn chế thừa nhận của tôi) sẽ được đặt một nắp về cách đồng bằng lớn có thể được. Điều này sẽ dẫn đến đồng hồ của bạn không chạy đúng thời gian, nhưng khi bạn nghĩ về nó, đó là cách hầu hết các game xử lý sự chậm lại. Bạn không khởi động StarCraft trên pentium 66 của bạn và chạy ở tốc độ 5 FPS nhưng tốc độ đầy đủ, nó làm chậm và xử lý nó như bình thường, mặc dù ở trình chiếu.

Nếu bạn đã làm một điều như vậy, trong thời gian chậm lại trong trò chơi của bạn, nó sẽ rõ ràng làm chậm ... nhưng các tính toán vẫn nên được phát hiện.

chỉnh sửa: chỉ cần nhận ra bạn là SeveN. Làm tốt.

+0

[Lời tục tĩu không được chào đón tại đây] (http://meta.stackexchange.com/a/22233/142838). – meagar