Sự cố với Phương thức cập nhật (GameTime) và Tạm dừng thực hiện


7

Tôi có chức năng tạm dừng được triển khai và nó hoạt động chính xác ở chỗ nó làm mờ màn hình trình phát và dừng cập nhật lối chơi.

Vấn đề là GameTime tiếp tục tăng trong khi bị tạm dừng, vì vậy phương pháp của tôi kiểm tra gameTime so với trướcSpawnTime trước khi sinh ra một kẻ thù khác sẽ bị rối và nếu trò chơi bị tạm dừng quá lâu, có thể nhận thấy rằng kẻ thù tiếp theo rút ra quá sớm.

Đây là mã của tôi để cập nhật kẻ thù.

private void UpdateEnemies(GameTime gameTime)
    {
        // Spawn a new enemy every 1.5 seconds
        if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
        {
            previousSpawnTime = gameTime.TotalGameTime;

            // Add an Enemy
            AddEnemy();
        }
...

Tôi cũng có các phương pháp khác phụ thuộc vào gameTime. Tôi đã thử lấy tổng thời gian tạm dừng và trừ đi tổng số thời gian của trò chơi, nhưng dường như tôi không thể làm cho nó hoạt động chính xác nếu đó là cách tôi nên giải quyết vấn đề này.

Nếu bạn cần xem bất kỳ mã nào khác cho tôi biết. Cảm ơn bạn.

Câu trả lời:


8

Thay vì sử TotalGameTimedụng ElapsedGameTimevà tích lũy tổng số bản thân bạn đang chạy trong một số biến. Sau đó, khi bạn tạm dừng trò chơi, tất cả những gì bạn phải làm là ngừng thêm thời gian đã trôi qua vào biến. Đây là một ví dụ:

float spawnTimer = 0.0f;
float timeBetweenSpawns = 1.5f;

private void Update(GameTime gameTime)
{
    // Perform actions that should only happen when the game is not paused
    if(!isPaused)
    {
        // Add time elapsed since previous frame to running timer
        spawnTimer += (float) gameTime.ElapsedGameTime.TotalSeconds;

        // Check if enough time has passed to spawn a new enemy
        if(spawnTimer >= timeBetweenSpawns)
        {
            AddEnemy();

            // Decrement the timer to prepare it for the next spawn
            spawnTimer -= timeBetweenSpawns;
        }
    }

    // Perform any actions that should happen all the time
}

3
Gọi UpdateEnemy với đồng bằng thời gian 0,0 là một tùy chọn đẹp hơn, nó cho phép kẻ thù xử lý các hoạt động ngẫu nhiên hoặc hương vị như gõ chân vào sự nhàm chán, mà không ảnh hưởng đến việc chơi trò chơi. Nếu bạn chỉ đơn giản dừng gọi cập nhật thì bạn sẽ mất các tùy chọn thú vị như thế.
Patrick Hughes

@PatrickHughes Vâng, tôi thích ý tưởng có rất nhiều chàng trai giữa trận chiến đang giậm chân chờ đợi bạn để không bị nghi ngờ.
MichaelHouse

1
@PatrickHughes Cách tôi chọn để chứng minh việc tạm dừng chỉ mang tính minh họa, vì câu hỏi chủ yếu liên quan đến việc quản lý thời gian. Tuy nhiên, tôi vẫn không vượt qua đồng bằng thời gian bằng 0 vì hai lý do: GameTimeđược tính toán và quản lý tự động theo khung, do đó, chuyển qua đồng bằng 0 sẽ yêu cầu tạo một GameTimeđối tượng riêng biệt hoặc thay đổi chữ ký để sử dụng dấu phẩy; và ngay cả với đồng bằng 0, nó vẫn sẽ thực hiện kiểm tra bổ sung và hẹn giờ một cách không cần thiết. Nếu cần, tôi chỉ cần bọc một phần của phương thức trong kiểm tra tạm dừng, để nửa kia có thể tiếp tục cập nhật.
David Gouveia

2
@PatrickHughes Những gì bạn đang mô tả rõ ràng là một khái niệm xem. Khi trò chơi bị tạm dừng, hãy kết xuất các mô hình với hình động "chán-nhàn". Điều này nên được xử lý trong các cuộc gọi Draw của bạn, KHÔNG phải các cuộc gọi Cập nhật của bạn.
Daniel Carlsson

1
@PatrickHughes Có một chút kỳ lạ, đó là lý do tại sao trong tất cả các dự án của tôi, điều đầu tiên tôi làm ở đầu vòng lặp cập nhật của mình là chuyển đổi GameTimeđối tượng thành một float đơn giản và thay vào đó sử dụng giá trị đó. Tôi chưa bao giờ có nhu cầu nhưng điều đó làm cho mọi thứ như thực hiện chuyển động chậm dễ dàng hơn - chỉ cần thay đổi giá trị thời gian trôi qua theo một số hằng số. Đối với việc tạm dừng trò chơi, tôi đoán đó là vấn đề sở thích cá nhân nhiều hơn - tôi thích coi việc tạm dừng như một công tắc bật / tắt thay vì đồng bằng 0, để bỏ qua các tính toán phụ thuộc thời gian, nhưng cả hai đều là giải pháp hoàn toàn hợp lệ :)
David Gouveia
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.