2010-11-06 35 views
14

Tôi đang làm việc trên một trò chơi và tôi đã nghĩ ra một vấn đề khá thú vị: những cách thông minh để thu hút các ngôi sao.Những cách khôn ngoan để vẽ một ngôi sao Star

Đó là trò chơi 2D nên hành động có thể cuộn theo hướng X và Y. Ngoài ra, chúng tôi có thể điều chỉnh tỷ lệ để hiển thị nhiều hơn hoặc ít hơn khu vực phát. Tôi cũng thích ngôi sao để có thị sai giả tạo ấn tượng sâu sắc.

Ngay bây giờ tôi đang làm điều này theo cách truyền thống, bằng cách có một mảng lớn các ngôi sao, mỗi ngôi sao được gắn thẻ bởi một yếu tố 'chiều sâu'. Để vẽ, tôi dịch từng ngôi sao theo vị trí máy ảnh nhân với độ sâu, vì vậy một số ngôi sao di chuyển rất nhiều, và một số di chuyển một chút. Điều này tất cả hoạt động tốt, nhưng tất nhiên kể từ khi tôi có một số hữu hạn của các ngôi sao trong mảng của tôi, tôi có vấn đề khi máy ảnh di chuyển quá xa hoặc chúng tôi thu nhỏ quá nhiều. Đây là tất cả sẽ làm việc, nhưng liên quan đến rất nhiều mã và trường hợp đặc biệt.

Điều này xúc phạm cảm giác thanh lịch của tôi. Đã có một cách tốt hơn để đạt được điều này.

Tôi đã xem xét việc tạo các ngôi sao theo cách thủ công, điều này cho phép tôi có số lượng không giới hạn: ví dụ: bằng cách sử dụng một hạt giống cố định và PRNG để xác định tọa độ. Tôi sẽ cần phải chia bầu trời thành gạch, tạo ra hạt giống bằng cách băm các tọa độ ngói, và sau đó vẽ, nói, 100 ngôi sao cho mỗi gạch. Điều này cho phép tôi mở rộng sân sao của mình vô thời hạn theo mọi hướng trong khi vẫn chỉ cần xem xét các gạch có thể nhìn thấy --- nhưng điều này không làm việc với yếu tố 'chiều sâu', vì điều này cho phép các ngôi sao đi lạc bên ngoài ngói của chúng. Tôi có thể chỉ đơn giản là sử dụng nhiều ngôi sao không phải là thị sai không sao bằng cách sử dụng thuật toán này nhưng điều này đánh tôi như gian lận.

Và, tất nhiên, tôi cần phải làm tất cả các khung hình này, vì vậy nó phải nhanh.

Tất cả các bạn đều nghĩ gì?

+3

Hãy thử http://gamedev.stackexchange.com, họ có thể có nhiều trải nghiệm hơn với các sự cố như vậy. –

+0

Tôi thậm chí không biết rằng đã tồn tại; ta. Bất kỳ quản trị viên nào, hãy tự do chuyển câu hỏi ở đó ... –

+0

Bất kỳ giải pháp nào bạn đưa ra, nếu bạn cần thêm hiệu suất chuyển đổi mã của mình để sử dụng số điểm cố định số nguyên thay vì số dấu chấm động. – user499211

Trả lời

1

Vì các ngôi sao trong nền không di chuyển nhanh như ở nền trước, bạn có thể tạo các ô nhiều lớp cho nền và thay thế chúng bằng các lớp một khi bạn có thời gian để làm điều đó . Oh, và làm thế nào về các mẫu lặp lại trong các lớp nền? Điều này có thể cho phép bạn tạo trước tất cả các ô nền - bạn vẫn có thể dịch chuyển chúng theo chiều cao và phủ lên nhiều ô với các khoảng trống ngẫu nhiên hoặc để làm cho nó trông ngẫu nhiên.

2

Có một vài lớp sao.

Đối với mỗi lớp, sử dụng bộ tạo số ngẫu nhiên (hoặc chỉ một mảng) để tạo khoảng trống giữa một ngôi sao và dấu cách tiếp theo (sự phân biệt poisson, nếu bạn muốn biết về nó). Bạn muốn các ngôi sao khá thưa thớt, vì vậy không gian trống thường sẽ nhiều hơn toàn bộ hàng. Các lớp sau sẽ dày đặc hơn các lớp phía trước, rõ ràng.

Sử dụng tính năng này để tự cung cấp cho bạn một số lát (mỗi) hai màn hình rộng. Di chuyển dấu sao bằng cách theo dõi vị trí ngôi sao "đầu tiên" cho mỗi lớp.

Trình phát sẽ không chú ý đến lát gạch, vì bạn cuộn các ô với các mức khác nhau cho mỗi lớp, đặc biệt nếu bạn sử dụng một vài lớp có kích thước khá thưa thớt.

0

Mỗi khung hình, hiển thị các ngôi sao trên một bitmap/lớp. Chúng chỉ là dấu chấm và vì vậy nó sẽ nhanh hơn so với sử dụng bất kỳ thuật toán nào có nhiều lớp.

Bây giờ bạn cần một mạng lưới 2D vô hạn gồm các ô 3D chứa đầy số lượng sao hữu hạn. Đối với mỗi hộp, bạn có thể xác định một giá trị RANDOM_SEED riêng lẻ, sử dụng tọa độ lưới của nó. Các ngôi sao trong mỗi hộp có thể được tạo ra một cách nhanh chóng.

Nhớ chỉnh sửa phối cảnh khi bạn thu phóng: Mỗi hộp 3D có hình chữ nhật gần (mặt trước) và hình chữ nhật dài. Bạn sẽ thấy nhiều ngôi sao của các hộp lân cận, bất cứ khi nào hình chữ nhật xa hoặc gần hình chữ nhật co lại trong tầm nhìn của bạn.

Hình chữ nhật dài của bạn không được nhỏ hơn một nửa chiều rộng của hình chữ nhật gần, nếu không nó có thể gây phiền toái: Bạn có thể phải quét danh sách các ngôi sao khổng lồ mà phần lớn chúng nằm ngoài giới hạn. Bạn có thể nhận ra các ngôi sao phía sau hình chữ nhật xa thông qua các ô 2D-lưới 3D bổ sung với các kích thước và độ sâu khác.

1

Có điều gì sai khi bao bọc trường sao trong X và Y không? Bởi vì chiều sâu của bạn, khoảng cách bao quanh nên phụ thuộc vào chiều sâu, nhưng bạn có thể làm điều đó. Mỗi ngôi sao ghi tại (x, y, chiều sâu) sẽ xuất hiện ở tất cả các điểm

[x + j * S * chiều sâu, y + k * S * depth]

cho tất cả các số nguyên jk. S là thông số bao quanh. Nếu S là 1 thì sự bao bọc xảy ra ngay lập tức và tất cả các ngôi sao luôn được hiển thị ở đâu đó. Nếu S là kết nối cao hơn không xảy ra ngay lập tức và một số ngôi sao sẽ được hiển thị ngoài màn hình. Có thể bạn sẽ muốn S đủ lớn để đảm bảo không lặp lại ở mức thu phóng tối đa.

0

Tại sao không kết hợp tọa độ của hộp 3D starfield để tạo hạt giống số ngẫu nhiên? Sử dụng "điều chỉnh" toàn cầu nếu bạn muốn sản xuất các vũ trụ khác nhau. Bằng cách đó bạn không cần phải theo dõi các hộp bạn không thể nhìn thấy bởi vì các nội dung được cố định bởi vị trí của chúng.

+1

Câu hỏi nói về việc tạo ra một nền "bầu trời đầy sao" với hiệu ứng thị sai khi khung nhìn di chuyển xung quanh. Không chắc chắn nếu câu trả lời này giải quyết vấn đề đó. – TheCodeArtist

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