2010-09-27 37 views
6

Tôi đang tạo trò chơi nền tảng bằng JavaScript sử dụng canvas hoàn toàn dựa trên nền. Phương pháp tốt nhất để lưu trữ các khối vật phẩm trong game (tường, sàn nhà, vật phẩm) là gì? Vấn đề là mỗi ngói có thể bị phá hủy hoặc tạo ra.Cấu trúc dữ liệu cho các cấp trong Trò chơi

Hiện tại tôi có một mảng 2D để tôi có thể nhanh chóng kiểm tra xem một mục có ở vị trí X & Y cụ thể không. Vấn đề với điều này là khi người dùng di chuyển và bản đồ cần cuộn, tôi cần gán lại mọi khối. Và điều gì sẽ xảy ra khi mặt hàng ở số x = 0? Tôi không thể sử dụng chỉ mục tiêu cực.

Tôi muốn tương tự cuộn như được đặt vào một ô xếp cùng một lúc. Ngoài ra tôi có kế hoạch tạo ngẫu nhiên các bản đồ khi người dùng di chuyển và nếu nó chưa được tạo trước đó. Vì vậy, một khi một cái gì đó được tạo ra, nó nên ở lại như vậy mãi mãi.

Một điểm khác tôi nên đề cập là nó cũng sẽ là nhiều người chơi. Vì vậy, chunking màn hình là một ý tưởng tuyệt vời cho đến khi các dữ liệu được lưu trữ trở nên bẩn và cần phải nhận được mới nhất từ ​​cơ sở dữ liệu. Gah Tôi rất mới với tất cả điều này; dường như không thể, bất kỳ trợ giúp nào được đánh giá cao.

+0

Nền tảng của bạn có vô cùng rộng trên trục x không? Tại sao bạn gặp vấn đề với x = 0? Bạn có nên chặn cuộn trái trong trường hợp đó không? –

+1

Xem http://www.youtube.com/watch?v=_RRnyChxijA – Sharun

+0

Đó là vô hạn. Người dùng có thể quay lại trái với cùng một ô. – Louis

Trả lời

4

Vì bạn có các cấp độ vô hạn, tôi đề xuất cấu trúc tương tự như những gì bạn đã có, với một chút tinh chỉnh.

Thay vì lưu trữ mọi thứ trong một mảng lớn và di chuyển nội dung xung quanh bên trong mảng đó mỗi khi người dùng di chuyển (ouch) thay vì lưu 9 khối bản đồ (mỗi kích thước sao cho nó gấp đôi kích thước màn hình) , khi người sử dụng tiếp cận các cạnh của đoạn hiện tại, xử lý các khối được offscreen, di chuyển tất cả các phần còn lại, và tải những cái mới vào khoảng cách.

Hy vọng rằng đó là rõ ràng, nhưng chỉ trong trường hợp, đây là một sơ đồ:

Chunking

Các hình vuông chữ là các khối của bản đồ, và các hình vuông màu đỏ là khung nhìn (tôi vẽ nó hơi quá lớn , hãy nhớ khung nhìn nhỏ hơn các ô vuông màu đen). Khi khung nhìn di chuyển sang phải, bạn dỡ các khối A B và C, di chuyển tất cả các phần còn lại sang bên trái và tải dữ liệu mới vào đúng phần lớn nhất. Kể từ khi một đoạn là hai lần chiều rộng của màn hình, bạn có thời gian phải mất người sử dụng để vượt qua màn hình để tạo/tải mức độ vào những khối. Nếu người dùng di chuyển nhanh trên toàn thế giới, bạn có thể có bộ khối 4x4 để đệm thêm.

Để giải quyết việc trả về các phần bản đồ trước đó.có một vài cách để làm điều đó:

  • Viết ra các khối vào đĩa cứng khi họ không còn được sử dụng (hoặc bất cứ điều gì tương đương sẽ là trong javascript)
  • Mở rộng đoạn của bạn thiết lập vô hạn trong ký ức. Thay vì một mảng các khối có một mảng assosciative mà mất vị trí x/y của đoạn, và trả về đoạn (hoặc null, mà chỉ ra rằng người dùng chưa bao giờ được ở đây trước và bạn cần phải tạo ra nó).
  • procedurally tạo ra mức độ của bạn, đó là phức tạp nhưng có nghĩa rằng một khi một đoạn đi tắt màn hình bạn chỉ có thể vứt bỏ nó, và tự tin bạn có thể tạo một cách chính xác các đoạn tương tự lại sau
1

Có rất nhiều cách để thực hiện việc này.

Nếu chúng không quá lớn, bạn có thể giữ thiết kế ban đầu của mảng 2d và sử dụng biến để lưu trữ vị trí cuộn x/y hiện tại. Điều này có nghĩa là bạn lưu trữ tất cả thông tin bản đồ trong bộ nhớ mọi lúc và chỉ truy cập vào các phần bạn cần hiển thị trên màn hình.

Khi vẽ bạn vạch ra ô nào có thể nhìn thấy ở vị trí cuộn hiện tại x/y, số lượng ô vừa với màn hình với chiều rộng màn hình hiện tại và chỉ vẽ những thứ bạn cần.

Nếu bạn cuộn toàn bộ các ô cùng một lúc, thì nó sẽ khá dễ dàng. Nếu một cuộn tương tự hơn, bạn sẽ cần một số kiểm soát hạt mịn hơn ở nơi bạn bắt đầu vẽ, hoặc bạn có thể gian lận và vẽ toàn bộ tập hợp các ô vào bitmap của bộ nhớ và sau đó ghi nó vào khung vẽ bằng âm bù lại.

1

Tôi đã từng định nghĩa điều này rất trong XML và JSON ... Tôi nghĩ rằng việc tuần tự hóa JSON sẽ nhanh hơn và hiệu quả hơn (chưa kể dễ dàng) để làm việc với JavaScript, đặc biệt là vì JSON cho vay rất tốt với các danh sách độ dài thay đổi như bạn yêu cầu cho các cấp độ "N" trong mỗi trò chơi.

Sử dụng định dạng chuẩn cũng sẽ làm cho nó dễ sử dụng hơn và (lý tưởng) khuyến khích cộng tác nhiều hơn (nếu đó là những gì bạn đang tìm kiếm). Bạn có thể kiểm tra nỗ lực đầu tiên của tôi để tạo ra một Video Game schema for level structure.

Như fileoffset cho biết, có nhiều cách để làm điều đó, nhưng tôi khuyên bạn nên giữ dữ liệu mức (tức là khái niệm) tách biệt với kết xuất của bạn (tức là đối tượng chuyển động, đường dẫn, tốc độ, thời gian, x/y/z co vị trí định vị, v.v ...).

Một lần nữa, khi bài viết nói rằng khu vực đó là thay đổi nhanh nhất và không có thông báo nếu WebGL, SMIL + SVG, Canvas + Javascript, tốt ol 'Flash/Actionscript hoặc một thứ khác sẽ là tuyến đường tốt nhất cho bạn, tùy thuộc vào nhu cầu của bạn và loại trò chơi bạn đang phát triển.

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