2013-07-03 71 views
6

Tôi đang xây dựng một giao diện điều khiển trò chơi đơn giản, có người chơi di chuyển báo chí khi chìa khóa xuống, và có những kẻ thù trong đó di chuyển tự động, từng loại kẻ thù di chuyển một lần trong miliseconds X .Sử dụng bộ đếm thời gian và trò chơi vòng lặp

Vì tôi hiểu mình nên sử dụng timer, nhưng tôi thực sự không biết cách thực hiện điều đó trong vòng lặp trò chơi (chưa được xây dựng bởi vì tôi không biết cách làm với bộ hẹn giờ. là while loop Tôi nghĩ). trò chơi kết thúc khi kẻ thù 'chạm' người chơi (cùng x và y).

Một điều quan trọng: Tôi không thể bạn thực hiện bài tập này trong Thread, nhưng nếu bạn có các đề xuất khác thay vì sử dụng Timer, bạn được hoan nghênh.

Cảm ơn bạn.

+0

Với trò chơi trên bàn điều khiển, bạn có nghĩa là một ứng dụng đang chạy trên bảng điều khiển trò chơi điện tử hoặc ứng dụng bảng điều khiển thực tế không? (nhắc lệnh vv) –

+0

ứng dụng giao diện điều khiển. – Luis

Trả lời

16

Bạn thường không sử dụng bộ tính giờ thông thường trong trò chơi. Trò chơi có một cơ chế rất khác nhau để xử lý logic của chúng và thời gian trôi qua, chúng thường không hoạt động với bộ hẹn giờ hoặc không theo cách bạn mong đợi:

Trò chơi thường có thứ gọi là vòng lặp trò chơi. Nói chung đó là ba chức năng chính được gọi là một sau khi khác trong một vòng lặp:

while(running) 
{ 
    HandleUserInput(); 
    ChangeWorld(); 
    Render(); 
} 

Bạn nhận được đầu vào người sử dụng, bạn thay đổi các trò chơi thế giới cho phù hợp và bạn vẽ nó lên màn ảnh. Bây giờ, máy tính của bạn nhanh hơn, vòng lặp này chạy nhanh hơn. Đó là tốt cho đồ họa (nghĩ FPS), nhưng xấu cho trò chơi. Hãy tưởng tượng Tetris nơi mọi khung hình di chuyển. Bây giờ tôi sẽ không muốn mua một chiếc máy tính nhanh hơn, trò chơi sẽ trở nên khó khăn hơn theo cách đó.

Vì vậy, để giữ cho tốc độ trò chơi độc lập liên tục về sức mạnh của máy tính, vòng xem xét thời gian trôi qua:

while(running) 
{ 
    var timePassedSinceLastLoop = CalculateTimeDelta(); 

    HandleUserInput(); 
    ChangeWorld(timePassedSinceLastLoop); 
    Render(); 
} 

Bây giờ hãy tưởng tượng một cooldown cho một cái gì đó trong game. Người chơi nhấn "a", một số hành động thú vị đã xảy ra và mặc dù anh ta có thể nhấn "a" một lần nữa, sẽ không có gì xảy ra trong 5 giây tiếp theo. Nhưng trò chơi vẫn chạy và làm tất cả những thứ khác có thể xảy ra trong game. Đây không phải là một bộ đếm thời gian thông thường. Đó là một biến, cho phép gọi nó là ActionCooldown và sau khi người chơi kích hoạt hành động, nó được đặt thành 5 giây. Mỗi khi thế giới thay đổi, timePassed được trừ từ con số đó cho đến khi nó bằng không. Tất cả thời gian, trò chơi đang chạy và xử lý đầu vào và hiển thị. Nhưng chỉ một khi ActionCooldown chạm 0, một lần nhấn "a" sẽ kích hoạt lại hành động đó.

Phương pháp ChangeWorld bao gồm tất cả các thay đổi tự động cho thế giới.Kẻ thù, tên lửa, bất cứ thứ gì di chuyển mà không có sự tương tác của người chơi. Và nó di chuyển dựa trên thời gian. Nếu kẻ thù di chuyển một hình vuông mỗi giây, bạn cần phải làm cho phối hợp của mình là một phao và thêm một phần của một hình vuông mỗi khi vòng lặp được chạy.

Giả sử bạn có 30 khung hình/giây nên vòng lặp của bạn chạy 30 lần mỗi giây. Kẻ thù của bạn bây giờ cần phải di chuyển 1/30 của một hình vuông mỗi vòng lặp. Sau đó, nó sẽ cuối cùng đã di chuyển một hình vuông đầy đủ mỗi giây.

+0

Cảm ơn bạn, nhưng làm cách nào để tính toán thời gian? làm thế nào để tôi biết khi nào một kẻ thù cần phải di chuyển? Tôi đã thử với 'timer' nhưng nó không có vẻ tốt vì nó không chính xác. – Luis

+1

Để bắt đầu thực sự đơn giản, bạn có thể lấy 'DateTime.Now' mỗi vòng lặp và tìm khoảng thời gian giữa chúng. Mỗi kẻ thù có tốc độ và bạn cần phải thêm tốc độ của nó vào vị trí của nó mỗi khung hình. Nếu tốc độ được đo bằng khối trên giây, bạn cần đảm bảo rằng bạn chỉ thêm một phần tốc độ vào vị trí hiện tại vì chỉ một phần nhỏ của giây trôi qua. Tốc độ kẻ thù của bạn là gì, là quyết định thiết kế của bạn. – nvoigt

+1

Tôi biết điều này thực sự cũ, nhưng tôi khuyên bạn nên sử dụng 'DateTime.UtcNow' là' DateTime.Now' là tốn kém. Vì bạn chỉ cần tính toán thời gian đã trôi qua, bạn có thể sử dụng 'UtcNow' mà không thực hiện bất kỳ phép toán bù trừ múi giờ nào để xác định múi giờ mà' DateTime' trả về cần phải có. Bit hiệu quả hơn cho một thứ gì đó dọc theo các dòng này . –

0

Tiền đề chung đằng sau bộ hẹn giờ là lặp lại một số mã mỗi n.

Để tạo việc sử dụng bộ đếm thời gian này:

System.Timers.Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
     // Set the Interval to 1 millisecond. Note: Time is set in Milliseconds 
     aTimer.Interval=1; 
     aTimer.Enabled=true; 

Sau đó, bạn thực hiện phương pháp này:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     //Whatever you need repeated 
    } 

Các ví dụ đầy đủ có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.71).aspx

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