Thứ tự đúng của các hoạt động trong một vòng lặp trò chơi platformer


7

Tôi đã gặp sự cố với công cụ Mega Man của mình và cấu trúc của vòng lặp trò chơi của tôi đang khiến việc khắc phục rất khó khăn. Với Rush Jet, hoặc bất kỳ nền tảng rơi nào, Mega Man cần phải gắn bó với nền tảng khi nó rơi. Ngay bây giờ, điều tốt nhất tôi có thể làm (mà không cần dùng đến cách giải quyết như các trường lực ma thuật kéo anh ta xuống) để anh ta rơi vào một khung hình duy nhất khi nền tảng bắt đầu rơi xuống. Nhưng ngay cả điều này đòi hỏi nền tảng rơi xuống để kéo anh ta xuống trong quá trình kiểm tra va chạm. Không có thêm bước này, anh liên tục "hốt hoảng" khi ngã xuống khi nền tảng hạ xuống.

Thứ tự của các sự kiện trong vòng lặp trò chơi của tôi đang làm cho điều này xảy ra. Nó như thế này:

  1. Mega Man và Rush Jet đang bay theo chiều ngang trong một thời gian.
  2. Giai đoạn suy nghĩ: Người chơi nhấn xuống - nền tảng quyết định đặt vận tốc của nó xuống dưới.
  3. Giai đoạn hành động: Nền tảng di chuyển xuống, người chơi không có nhận thức về điều này.
  4. Giai đoạn phản ứng: Cả hai không va chạm, do đó không thể kiểm tra "lực liên kết".
  5. Khung tiếp theo, Mega Man rơi xuống. Một khung hình sau đó, trọng lực bắt kịp và anh ta đáp xuống nền tảng một lần nữa, đặt lại vận tốc y của anh ta về 0.

Bạn có thể thấy ở đó thứ tự cơ bản của vòng lặp của tôi:

  1. Giai đoạn suy nghĩ, nơi bạn phân tích các va chạm từ khung trước đó và bất kỳ biến nào khác, để quyết định chuyển đổi trạng thái và các điều chỉnh khác.
  2. Pha hành động - mọi người di chuyển theo vận tốc của họ.
  3. Giai đoạn phản ứng - kiểm tra va chạm, điều chỉnh vị trí để khắc phục chúng. Điều này cũng xử lý các hiệu ứng như di chuyển nền tảng, ví dụ. đẩy người chơi bằng một số tiền. Những thay đổi về vận tốc của anh ta được áp dụng trong khung tiếp theo, trong giai đoạn hành động.

Tôi đã thử sắp xếp lại các bước này và nhiều thay đổi khác, nhưng tất cả đều làm cho mọi thứ trở nên tồi tệ hơn nhiều, với đủ loại lỗi. Nếu tôi cần thực hiện các thay đổi sâu rộng cho động cơ của mình để có được những điều này đúng, tôi muốn biết cách "phù hợp" là gì trước khi lãng phí bất cứ lúc nào.

Tôi biết một giải pháp khả thi sẽ là bước chuyển động để xem ai đang chạm vào nền tảng trong khung trước đó và kéo anh ta sau đó, để họ thực sự di chuyển cùng nhau. Điều đó dường như quá phức tạp, đạt được giữa các thành phần như thế. Mã công cụ của tôi đã cảm thấy phức tạp hơn nhiều so với trò chơi gốc có thể có, cho thấy tôi đang làm gì đó sai.

Vì vậy, có một chuỗi các sự kiện thích hợp? Có một câu hỏi khác ở đây về việc di chuyển mọi thứ cùng với một nền tảng, nhưng điều đó không giải quyết được thứ tự của sự kiện gây ra vấn đề của tôi. Ngoài ra, nếu bất cứ ai thực sự biết cách các trò chơi Mega Man cổ điển đã làm điều đó, rõ ràng đó sẽ là một trợ giúp rất lớn.

Tìm bao nhiêu mã của tôi như bạn muốn tại https://github.com/Tesserex/C--MegaMan-Engine/tree/master/Mega%20Man . CollisionComponent và MovementComponent có thể hữu ích nhất.


1
Tôi không hoàn toàn hiểu, nhưng vì người đàn ông lớn và nền tảng di chuyển cùng nhau, nên có lẽ sẽ không phải là một điều khủng khiếp khi liên kết chuyển động của họ với nhau. (nếu chúng di chuyển cùng nhau như một thực thể, tại sao không lập trình chúng thành một thực thể hoặc ít nhất là ràng buộc chúng theo một cách nào đó?)
Michael Coleman

Cách tôi giải quyết vấn đề 'ngã sau một nền tảng' là không chuyển sang trạng thái rơi cho đến khi người chơi không liên lạc với sàn trong ít nhất hai khung hình. Người chơi ngã; nhưng các hình ảnh động không thay đổi để người chơi không chú ý. Điều này cũng xử lý đi xuống dốc khá tốt.
Blecki

@Blecki - Điều đó có thể hoặc không thể làm việc với tôi - hệ thống của tôi có thể tùy chỉnh, vì vậy nó sẽ là một thay đổi khá chung chung. Dù sao, tôi vẫn quan tâm nếu có ai biết thứ tự vòng lặp trò chơi "chính xác".
Tesserex

Câu trả lời:


2

Tôi biết câu trả lời này không phù hợp với tiêu đề của câu hỏi này, nhưng tôi nghĩ nó có thể giải quyết vấn đề của bạn.

Tôi đã xem xét cơ sở mã của bạn và bạn có một thiết kế thành phần tổng hợp để soạn các thực thể trò chơi. Tôi đoán máy bay phản lực có thực thể trò chơi riêng và danh sách các thành phần ("máy bay phản lực" là cái mà tôi sẽ gọi nền tảng di chuyển này, vâng tôi không biết gì về trò chơi mega man). Nếu đây là trường hợp, bạn nên cố gắng vượt qua máy bay phản lực vội vàng một thực thể trò chơi người chơi và thiết lập một loại cầu nào đó (không phải là thuật ngữ tốt nhất để sử dụng).

Đối với "cây cầu" này, tôi sẽ có máy bay phản lực không lấy đầu vào từ bàn phím. Thay vào đó, người chơi sẽ nhận đầu vào và trong hệ thống tin nhắn của bạn (phần dành cho các thành phần trò chơi trong một thực thể), bạn có thể có một thành phần trò chơi khác gắn với máy bay phản lực cũng sẽ chặn tin nhắn chuyển động. Do đó, cả người chơi và nền tảng sẽ được di chuyển cùng nhau. Một khi máy bay phản lực đã biến mất, thành phần trò chơi đóng vai trò là cầu nối giữa máy bay phản lực và người chơi sẽ bị loại bỏ và loại bỏ.

Tôi nghĩ rằng đây là một sự thay thế hợp lý. Chuyển động xảy ra trong vòng lặp trò chơi của bạn và sau đó kiểm tra va chạm xảy ra để đảm bảo máy bay phản lực và người chơi nằm trong giới hạn. Tôi cũng tin rằng việc máy bay vội vàng phụ thuộc vào người chơi theo cách này là hoàn toàn tốt. Đây không phải là giải pháp tuyệt vời nhất, nhưng có lẽ nó sẽ hoạt động.

PS: Tôi thích cơ sở mã của bạn. Mã không phải là tốt nhất, nhưng nó tốt đẹp.


Cảm ơn. Tôi nghĩ đó là một cách tiếp cận mới lạ. Các thực thể trò chơi được xác định bên ngoài và lý do lớn nhất tôi muốn nó hoạt động mà không có mối liên hệ đặc biệt nào giữa chúng là để bất kỳ nền tảng rơi nào khác không cần xử lý đặc biệt tương tự để hoạt động. Nhưng có lẽ tôi có thể sử dụng kiểu tiếp cận này để làm cho các nền tảng như vậy dễ dàng hơn.
Tesserex

Điều duy nhất ràng buộc nền tảng và trình phát là một thành phần thực thể. Do đó, bạn có thể tạo các nền tảng khác và không đính kèm thành phần thực thể này vào trình phát. Bạn để nền tảng mở để mở rộng, điều đó sẽ làm cho nó dễ dàng hơn.
Michael Coleman

Vâng, theo cách mà tôi đã làm cho nó hoạt động cho đến nay, tôi đã sử dụng một hitbox để liên lạc giữa hai người. Vì vậy, có vẻ như hiện tại không có giải pháp đơn giản nào không tạo ra ít nhất một đối tượng nhỏ khác trong mỗi trường hợp.
Tesserex

Vâng, nhưng đối tượng nhỏ đó có thực sự là một vấn đề? Nó chỉ được phân bổ trong một khung hình một lần. Số tiền rất nhỏ theo ý kiến ​​của tôi.
Michael Coleman

Phải, nó hoạt động tốt. Bạn chỉ cần nhớ nó mỗi khi bạn tạo ra một nền tảng như vậy.
Tesserex

0

Được rồi, ở dạng cơ bản nhất, một vòng lặp trò chơi trông như thế này:

while game is running
    act upon user input
    update all game objects
    re-draw everything to the screen

Trong trường hợp của bạn, điều nên xảy ra là:

  1. Vòng lặp bắt đầu.
  2. Bạn cập nhật tất cả các đối tượng dựa trên các lần nhấn phím đã diễn ra. Nền tảng di chuyển xuống.
  3. Sau đó, bạn cập nhật tất cả các vật thể dựa trên vận tốc của chúng, bên trong bước đó phải là kiểm tra va chạm để không đi hết quãng đường hoặc thay đổi vận tốc của chúng về 0 khi chúng va vào tường và đặt chúng vào đúng vị trí.
  4. Bây giờ vẽ tất cả lên màn hình, người dùng chưa bao giờ thấy bất kỳ trạng thái lỗi nào nên mọi thứ đều tuyệt vời; không có sự hốt hoảng bao giờ

Và đó là cách mà hầu hết các trò chơi tôi viết làm cho nó hoạt động.

Cập nhật: Nếu bạn cần thêm thông tin về cách viết một vòng lặp trò chơi tốt thì bây giờ hãy xem thêm hướng dẫn tốt này .


Bài viết đó dường như hoàn toàn về cách làm cho thời gian vòng lặp trò chơi chính xác với tốc độ phần cứng. Nhưng đề nghị của bạn dường như đề nghị đặt hàng của tôi là chính xác. Cách bạn có nó tôi nghĩ vấn đề vẫn sẽ tồn tại. Tôi nghĩ rằng tôi phải làm một số loại phép thuật ràng buộc cả hai với nhau.
Tesserex

@Tesserex: Tôi không hiểu; Nếu bạn thay đổi vị trí của nền tảng trước khi người chơi kiểm tra trọng lực thì anh ta sẽ không di chuyển xuống và kết nối với nền tảng trước khi bước tiếp theo xảy ra? Không nhìn vào mã của bạn, có vẻ như bạn có một vấn đề về hoạt động, do đó, bài viết của tôi.
Robert Massaioli
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.