Mã logic trò chơi là gì?


50

Tôi đang sử dụng C # / XNA và đã được thông báo khá nhiều lần về việc không trộn mã cập nhật với mã rút tiền - và tôi chắc chắn là không! Nhưng bất cứ ai cũng có thể vui lòng mô tả chính xác "mã logic" là gì?

Như đã thấy ở đây: http://bloss.msdn.com/b/shawnhar/archive/2007/07/25/under Hiểu-getime.aspx

[...] Đảm bảo bạn đặt tất cả logic trò chơi của mình vào phương thức Cập nhật (không phải trong Draw!) Và mọi thứ sẽ chạy ở tốc độ không đổi tốt.

Tôi đang hỏi điều này vì tốc độ trò chơi của tôi dao động so với FPS. FPS chậm bằng với các đối tượng chuyển động chậm và ngược lại. Và vâng, tôi đang bao gồm position += speed * (float)gt.ElapsedGameTime.TotalSeconds;mã dự kiến .

Đây có lẽ là một câu hỏi tân binh lớn, nhưng tôi chỉ muốn hoàn toàn rõ ràng về định nghĩa của điều này.


Tôi nghĩ bạn có ý đó position = speed * ...TotalSeconds. Chú ý là =không +=. Nếu +=chỉ cần bạn gõ, thì vị trí của bạn sẽ bay ra khỏi màn hình gần như ngay lập tức.
DrZ214

Tôi có mã trông giống như 'vị trí + = hướng * tốc độ * ... TotalSeconds' và nó hoạt động rất tốt. Tôi có thể đã nhầm lẫn một cái gì đó, nhưng vị trí = tốc độ sẽ chỉ định nó mỗi bản cập nhật. Cách của bạn có thể hoạt động, nhưng tôi có mã của tôi hoạt động như thế này. (Lưu ý rằng hướng được chuẩn hóa)
Shyy Guy

Tôi nghĩ gt.ElapsedGameTime.TotalSecondslà số giây trôi qua từ khi bắt đầu chương trình (trò chơi). Nếu bạn nhân tốc độ của mình với tốc độ đó, thì sau 5 giây chơi, tốc độ của bạn sẽ nhanh hơn 5 lần (trừ trường hợp đặc biệt khi tốc độ được đặt thành 0). Không chắc chắn những gì bạn có thể có sẽ làm cho điều đó không đúng sự thật, nhưng tôi tò mò.
DrZ214

1
Aha, kể từ lần cập nhật cuối cùng. gamedev.stackexchange.com/questions/67968/ từ
Chàng trai nhút nhát

2
Hấp dẫn tôi sẽ không bao giờ đoán được điều đó. Chưa bao giờ có nhu cầu về một thứ như vậy trong vài giây, bởi vì cá nhân tôi sử dụng biến của riêng mình được gọi là iiitôi tăng thủ công mỗi bản cập nhật, vì tôi không muốn nó trong vài giây, tôi muốn các bước hoặc khung. Tôi có thể thấy rằng cách của bạn là một cách hợp lệ của những thứ mã hóa mềm mặc dù.
DrZ214

Câu trả lời:


102

Nó có thay đổi trạng thái của thế giới trò chơi của bạn không? Đó là mã logic.

Liệu nó có hiển thị trạng thái của thế giới trò chơi? Đó là mã kết xuất.


Tôi sẽ lướt qua mã của tôi để chắc chắn 100%. Giải thích tốt, cảm ơn.
Chàng trai nhút nhát

38
Nó có xử lý đầu vào không? Mã điều khiển của nó. Tách điều khiển khỏi logic, để bạn có thể sử dụng cùng logic với các loại điều khiển khác nhau. Ví dụ: FPSInputContoder + CharacterMotor so với AIInputControll + CharacterMotor vs NetworkInputContoder (ví dụ: những người chơi khác trong một phiên bản nhiều người chơi) + CharacterMotor. Động cơ (mã logic) không quan tâm làm thế nào nó nhận được hướng dẫn, chỉ có chúng được cung cấp (loại tách rời này cho phép dễ dàng chuyển từ người chơi sang AI bot (nghĩ rằng người chơi còn lại 4 người chết và nhàn rỗi) và quay lại, Trong số những thứ khác).
Draco18

10
Draco đưa ra một điểm tốt. Có rất nhiều bộ phận khác nhau mà bạn có thể đưa vào mã. Sự phân chia của Nils là những gì tôi cho là sự phân chia nguyên mẫu giữa logic và kết xuất, nhưng có nhiều lớp khác mà bạn sẽ thấy. Lý do thực sự để tách chúng ra thành các lớp là mỗi lớp bao gồm các hành động tương tự đòi hỏi một kiểu mã tương tự với các yêu cầu tương tự. Ví dụ: trong nhiều trò chơi, bạn có thể thoát khỏi logic trò chơi khi hoàn thành 2 hoặc 3 khung hình, nhưng nếu bạn không kết xuất từng khung hình, mắt người dùng sẽ nhanh chóng nhận thấy.
Cort Ammon

Giữ chúng khác biệt sẽ giúp bạn quản lý các yêu cầu của bạn khi chúng bắt đầu trở thành một nguồn gây căng thẳng.
Cort Ammon

6
Và hãy nhớ rằng nếu bạn ném quá nhiều MVC vào nó, nó có thể làm chậm quá trình thu thập dữ liệu, vì vậy hãy luôn cố gắng cân bằng giữa khả năng bảo trì và tối ưu hóa. Nhưng đừng tối ưu hóa quá sớm, trừ khi bạn hoàn toàn chắc chắn những gì bạn đang làm. Và hãy nhớ bạn luôn có thể tái cấu trúc. Và ... Uh, tạo ra nhiều trò chơi và học hỏi từ những sai lầm của bạn.
Maurycy

24

Sự tách biệt của bạn là chính xác nếu:

  • Gọi Draw () nhiều lần liên tiếp mà không có bất kỳ cuộc gọi xen kẽ nào đến Update () sẽ không bao giờ dẫn đến bất kỳ thay đổi rõ ràng nào giữa các cuộc gọi.
  • Gọi Cập nhật () nhiều lần liên tiếp mà không có cuộc gọi xen kẽ với Draw () sẽ giống như chơi trò chơi với màn hình tắt: mọi thứ di chuyển hoàn hảo và nhất quán, bạn không thể nhìn thấy nó.

5
Viết đúng Draw()có thể vẽ các hình ảnh khác nhau khi thời gian trôi qua. Ví dụ, khung của các họa tiết hoạt hình có thể tiếp tục thay đổi. Ngoài ra, các đối tượng có thể tiếp tục di chuyển về phía trước nếu mã kết xuất sử dụng một thủ thuật phổ biến và thêm velocity * time since last update / period of updatevào vị trí có thể nhìn thấy của các đối tượng (trong khi vị trí thực của chúng vẫn không thay đổi).
HolyBlackCat

2
iffnghĩa là if-and-only-if?
BalinKingOfMoria

3
@HolyBlackCat: không thể tranh cãi. Nếu tôi muốn tạm dừng đồ họa thì sao? Điều gì xảy ra nếu các khung hình hoạt hình ảnh hưởng đến trò chơi (hoạt hình tấn công tương ứng với hitbox, v.v.)? Nội suy trực quan vẫn ngụ ý rằng "thời gian" (như trong thời gian đồng bằng của trò chơi) đang trôi qua, nhưng nếu thời gian trôi qua và bạn không Updatenhận được thì còn gì khác không đồng bộ? Đầu vào của người chơi bị bỏ lỡ, các sự kiện mạng không được xử lý, v.v? Trò chơi nên được điều khiển bằng một đồng hồ duy nhất, với các "đánh dấu" cố định cho logic trò chơi hoặc vật lý bắt nguồn từ đồng hồ đó và trạng thái đồ họa xuất phát cũng được điều khiển bởi cùng một đồng hồ đó.
Sean Middleditch

@SeanMiddleditch Tôi đồng ý, hầu như bạn luôn có thể viết Draw()theo cách như vậy để nó luôn vẽ cùng một bức tranh khi được gọi nhiều lần liên tiếp. Người ta nên làm điều đó nếu có thể. Nhưng có những trường hợp khi bạn không biết ở tần số nào Draw()sẽ được gọi. Ví dụ: nếu bạn muốn hỗ trợ đầy đủ (120 FPS thực tế) cho màn hình 120hz mới và bạn bật vsync. What if I want to pause graphics?Sau đó, bạn vượt qua 0 thay vì thời gian delta thực tế đến Draw().
HolyBlackCat

2
@HolyBlackCat: Không có gì tôi nhận được sẽ ngăn cản việc sử dụng kết xuất 120hz. Tôi hoàn toàn không đề xuất tỷ lệ hòa cố định; đó chỉ là nghiệp dư. Cần có một đồng hồ trò chơi toàn cầu có đồng bằng được đo bằng các khung hiển thị đưa vào giá trị tích lũy cho đánh dấu logic trò chơi tỷ lệ cố định. Đó là đồng hồ toàn cầu ổ đĩa đồ họa, bao gồm cả nội suy. Bạn có thể tạm dừng đồ họa bằng cách đặt tỷ lệ đồng hồ thành 0. Bạn có thể có đồng hồ phân cấp, ví dụ: UI vẫn chạy và hoạt ảnh trong khi quá trình nội suy ký tự cũng dừng, rất rất dễ dàng.
Sean Middleditch

7

Vấn đề ở đây là sự tách biệt của những thứ Model không phải là model.

Logic Game là Mô hình như được đề cập trong

Đây là tất cả các mẫu kiến ​​trúc phần mềm khác nhau, có liên quan. Nhưng trong mọi trường hợp, Mô hình giống nhau, đó là logic thực và trạng thái thực.

Đó là khi làm phần mềm kinh doanh đôi khi nó được gọi là logic kinh doanh và được mã hóa một số chính sách của doanh nghiệp. Ví dụ: nếu bạn đang mã hóa thứ gì đó cho ngân hàng, để tính hóa đơn thẻ tín dụng, thì chức năng khiến ai đó không phải trả lãi nếu họ xóa nợ trong vòng chưa đầy 30 ngày, là một phần của logic kinh doanh, nó tồn tại trong mô hình. Nó không ví dụ sống trên một trong các lớp hiển thị. Mã để in một hóa đơn, ví dụ, không chỉnh sửa văn bản dựa trên hành động của họ. Ví dụ này có lẽ nêu bật lý do tại sao bạn có thể muốn tổ chức mã của mình theo cách đó.

Tương tự như vậy đối với logic trò chơi.

Hãy tưởng tượng rằng tại một số thời điểm, trò chơi của bạn đã được chuyển sang một giao diện điều khiển khác. Nó có thể giúp tưởng tượng một cái gì đó thực sự khác với mục tiêu hiện tại của bạn. Ví dụ: nếu bạn đang nhắm mục tiêu một số trò chơi với bộ điều khiển / gamepad, hãy tưởng tượng trò chơi của bạn được chuyển sang máy tính bảng màn hình cảm ứng. Logic trò chơi là một phần của mã không thay đổi khi bạn chuyển nó.

Nếu trò chơi của bạn giống như một trò chơi chiến lược quân sự, hãy tưởng tượng nó được chuyển đổi thành trò chơi cờ phức tạp nhất thế giới. Logic trò chơi là các phần của mã, tương ứng trực tiếp với các dòng trong sách quy tắc. (Không phải tất cả các dòng trong sách quy tắc, không phải là những dòng về di chuyển, nhưng một số.).

Logic trò chơi là thứ không bao giờ thay đổi, bất kể hình thức.

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.