Làm thế nào để lưu trữ một mức độ shmup?


12

Tôi đang phát triển một shmup 2D (tức là Máy bay chiến đấu ) và tôi đã tự hỏi những cách khác nhau để lưu trữ một cấp độ. Giả sử rằng kẻ thù được xác định trong tệp xml của riêng chúng, bạn sẽ xác định như thế nào khi kẻ thù xuất hiện ở cấp độ?

Nó sẽ được dựa trên thời gian? Cập nhật? Khoảng cách?

Hiện tại tôi làm điều này dựa trên "thời gian cấp độ" (lượng thời gian mà cấp độ đang chạy - tạm dừng không cập nhật thời gian). Dưới đây là một ví dụ (việc xê-ri hóa được thực hiện bởi XNA):

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:level="pekalicious.xanor.XanorContentShared.content.level">
  <Asset Type="level:Level">
    <Enemies>
      <Enemy>
        <EnemyType>data/enemies/smallenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>60</NumberOfSpawns>
        <SpawnOffset>PT0.2S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT20S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/boss1</EnemyType>
        <SpawnTime>PT30S</SpawnTime>
        <NumberOfSpawns>1</NumberOfSpawns>
        <SpawnOffset>PT0S</SpawnOffset>
      </Enemy>
    </Enemies>
  </Asset>
</XnaContent>

Mỗi phần tử Kẻ thù về cơ bản là một làn sóng các loại kẻ thù cụ thể. Loại được xác định trong EnemyType trong khi SpawnTime là "mức thời gian" mà sóng này sẽ xuất hiện. NumberOfSpawns và Spawn Offerset là số lượng kẻ thù sẽ xuất hiện và thời gian giữa mỗi lần sinh sản tương ứng.

Đây có thể là một ý tưởng tốt hoặc có thể có những ý tưởng tốt hơn ngoài kia. Tôi không chắc. Tôi muốn xem một số ý kiến ​​và ý tưởng.

Tôi có hai vấn đề với điều này: sinh ra kẻ thù một cách chính xác và tạo một trình soạn thảo cấp độ. Điều biên tập cấp độ là một vấn đề hoàn toàn khác (mà tôi có thể sẽ đăng trong tương lai: P).

Đối với việc sinh sản một cách chính xác, vấn đề nằm ở chỗ tôi có thời gian cập nhật thay đổi và vì vậy tôi cần đảm bảo rằng tôi không bỏ lỡ sinh sản của kẻ thù vì bù đắp sinh sản quá nhỏ hoặc do quá trình cập nhật mất thêm một chút thời gian . Tôi đã sửa nó cho hầu hết các phần, nhưng dường như vấn đề là cách tôi lưu trữ cấp độ.

Vậy, có ý kiến ​​gì không? Bình luận?

Cảm ơn bạn trước.

Câu trả lời:


4

Một cách để làm điều này là căn cứ vào việc sinh sản không đúng giờ mà dựa trên quãng đường di chuyển ngang (giả sử sidecrolling). Bạn có thể lưu trữ sóng kẻ thù trong hàng đợi với khoảng cách kích hoạt; khi khoảng cách di chuyển của người chơi của bạn lớn hơn khoảng cách kích hoạt của đối tượng ở phía trước hàng đợi, hãy bật nó ra khỏi hàng đợi và sinh ra nó.

Giải pháp này sẽ cho vay nhiều hơn để tích hợp với trình chỉnh sửa mức đồ họa hơn là giải pháp dựa trên thời gian. Việc kết hợp các điểm cụ thể dọc theo nền cuộn của bạn sẽ dễ dàng hơn nhiều khi kẻ thù sinh sản.


4
Và như một phần thưởng nếu bạn thay đổi tốc độ cuộn, trên toàn cầu hoặc cho một phần của cấp độ, nó sẽ giữ kẻ thù sau này ở vị trí sinh sản chính xác của chúng, bởi vì nếu dựa vào thời gian, kẻ thù sẽ sinh ra ở những điểm chính xác.
Tấn

2

Tôi đề nghị bạn nghiên cứu mã của PowerManga làm tài liệu tham khảo. Chúng có hai loại cấp độ: cuộn bên (giống như tyrian) trong đó mọi thứ được định vị ở một khoảng cách cụ thể từ mức bắt đầu và các thứ khác được tạo ngẫu nhiên và các mức "tĩnh" (à la galaga) trong đó một sóng chỉ được phân tích cú pháp sau khi cái trước đã hoàn thành mô hình của nó.

Các mẫu sóng tất nhiên có thể được lên kế hoạch một cách hiệu quả bằng các đường cong bezier liên tiếp (trang wikipedia có một hình ảnh động gọn gàng để giải thích điều đó).

Nếu tôi có thể đủ khả năng nhận xét cuối cùng, tôi sẽ hoàn toàn bỏ XML ở đây để ủng hộ một cái gì đó biểu cảm hơn, dễ bảo trì hơn và hữu ích hơn trong lập trình trò chơi, chẳng hạn như tập lệnh LUA.

HTH.


Tôi đã sử dụng các đường cong bezier để lưu trữ các chuyển động của kẻ thù (cũng được xê-ri hóa trong xml). Tôi chủ yếu sử dụng XML vì cả .NET và XNA đều có hỗ trợ tích hợp cho việc tuần tự hóa / giải tuần tự hóa. Kịch bản LUA nghe có vẻ tốt nhưng nó sẽ đòi hỏi nhiều công việc hơn. Tuy nhiên, tôi luôn có kế hoạch sử dụng nó, vì vậy sau khi tôi hoàn thành một số động cơ cơ bản, tôi chắc chắn sẽ xem xét nó. Finallt, ý tưởng về việc sinh ra một làn sóng sau một lần trước nghe có vẻ thú vị.
pek

2
XML vẫn ổn, miễn là nó được tạo bởi một công cụ và không được chỉnh sửa bằng tay. Mặc dù các ngôn ngữ kịch bản có thể hữu ích cho các trường hợp đặc biệt (ví dụ: trùm), đó là một vấn đề hoàn toàn riêng biệt để xác định các kiểu tấn công tiêu chuẩn, phải không?
bluescrn

0

Xem xét thủ tục tạo ra kẻ thù. Tôi biết nó hoàn toàn khác với câu trả lời bạn muốn và nó gián tiếp giải quyết vấn đề hoàn toàn.

Nếu tôi làm điều này, tôi sẽ gán cho mỗi đơn vị kẻ địch một giá trị "điểm" về mức độ khó của nó, sau đó gán cho một số điểm - 100 điểm có giá trị bằng một trăm kẻ thù 1 điểm, hoặc một kẻ thù 100 điểm, hoặc bất cứ điều gì ở giữa.

Bạn có thể cần phải hạn chế điều này một chút để bạn không có được ông chủ 100 điểm ở cấp độ đầu tiên hoặc bạn có số lượng kẻ thù tối thiểu và có thể bạn muốn thăm dò định kỳ danh sách kẻ thù còn lại và kéo cái tiếp theo trên màn hình.

Bạn có thể tiến thêm một bước bằng cách hình thành: bộ sưu tập các vị trí và điểm, vd. bảy kẻ thù một điểm trong một hàng đơn (hàng hoặc cột), hoặc một điểm năm điểm cách hai điểm 3 điểm.

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.