Làm thế nào để tạo trò chơi với cuộn?


7

Trong các trò chơi như câu chuyện thành phố hoặc chúng tôi trang trại làm thế nào để họ thực hiện cuộn?

  1. Để thực hiện cuộn bằng UIScrollView, kích thước EAGLView phải lớn hơn. Trong các trò chơi đó, kích thước EAGLView trông giống hơn 1024 * 1024. Nhưng có giới hạn về kích thước khung nhìn trong các thiết bị iphone (trong 3G iphone max là 1024).

  2. Tôi đã chơi những game đó trong iphone 3G, chúng vẫn hoạt động tốt.

  3. Bất kỳ ý tưởng làm thế nào họ thực hiện cơ chế cuộn của họ?

Câu trả lời:


4

Chà, họ không sử dụng cái gì đó như UIScrollView, điều đó là chắc chắn. Bạn sẽ chỉ di chuyển máy ảnh qua một thế giới đứng yên hoặc di chuyển thế giới dưới một máy ảnh đứng yên. Tôi hơi khó tính với GL của mình, nhưng tôi đoán bạn chỉ cần đẩy một ma trận dịch mới trước tất cả bản vẽ của mình.

Đối với phần kéo thực tế, bạn cũng sẽ tự thực hiện điều đó. Nó có thể là một cái gì đó mà bạn kiểm tra xem liệu có một lượng delta chuyển động con trỏ / ngón tay nhất định trong một khoảng thời gian nhất định để xem đó là "kéo" hay "nhấp chuột". Hoặc có thể bạn luôn kéo trừ khi người dùng nhấp vào thành phần UI hoặc đại loại như thế. Nó thực sự phụ thuộc vào thiết kế của cách bạn muốn hệ thống đó hoạt động.


Ngay cả tôi cũng nghĩ rằng họ đang sử dụng bản dịch OpengGL ...
Chandan Shetty SP

Đó chỉ là vấn đề tạo ra nó để bạn không làm một cái kẹp cứng khi bạn đến các nơi trên thế giới. Nếu bạn có thể di chuyển camera xung quanh, bạn có thể tìm ra cách bắt chước độ nảy.
Tetrad

4

Một thanh cuộn khá đơn giản là "khung nhìn ảo" đẩy các ô / đối tượng mới theo hướng bạn đang cuộn.

Ví dụ đơn giản để thấy điều này, là xây dựng một marquee 1 dòng đơn giản (textcroller).

Cho phép mục đích ví dụ nói rằng chúng ta có một dòng có 20 ký tự / chữ cái / ký tự.

Chúng tôi đặt chúng trong một chuỗi / mảng như:

String viewport = "....................";
String text = "Hello World (how original!)";

Bây giờ nếu chúng ta in cái này, chúng ta sẽ chỉ thấy "dấu chấm".

Console.WriteLine(viewport);

Bây giờ để cuộn nó, chúng ta cần làm cho các dấu chấm ở bên trái. Vì vậy, chúng ta có thể đọc văn bản đến.

Để điều này xảy ra, chúng tôi xóa chữ cái đầu tiên từ bên trái và thêm chữ cái tiếp theo được hiển thị từ bên phải.

vì vậy chúng tôi nói:

viewport = viewport.Substring(2);

để lấy chữ cái thứ 2 và chuyển tiếp bằng với phần còn lại của nội dung xem hiện tại.

Bây giờ khung nhìn là 1 char / chữ cái để thu hẹp, vì vậy chúng ta cần thêm char tiếp theo từ thanh cuộn. Do đó, chúng ta cần một biến để kiểm soát vị trí của chúng ta trong cuộn giấy.

// place this outside your scroll loop
int scrollPos =0;

Bây giờ với chỉ số này, chúng ta có thể tìm thấy nhân vật tiếp theo.

char next = text.substring(scrollPos,1);

Sau đó thêm phần này vào khung nhìn.

viewport += next;

Và tăng vị trí của bạn trong cuộn giấy.

scrollPos++;

Bây giờ chúng tôi đã cuộn nội dung 1 char còn lại.

Tiếp tục làm điều này nhiều lần, và nó sẽ trông giống như "Hello World" đang cuộn trên khung nhìn của bạn.

Bây giờ hãy tưởng tượng thủ thuật này theo mọi hướng. Thay vì các ký tự, bạn sử dụng "Gạch" của riêng bạn. Thứ hai, để làm cho nó hoạt động trơn tru, bạn cũng thêm một "cuộn pixel" trong bộ cuộn của bạn hoặc bạn chỉ cần nhiều cuộn của bạn để đơn giản. Sau đó, khi bạn cần tìm ra ô nào sẽ thêm tiếp theo, sau đó chỉ cần chia cuộn giấy hiện tại của bạn với chiều rộng của ô, sau đó bạn biết nếu bạn cần di chuyển nội dung cuộn của chế độ xem theo bất kỳ hướng nào.

nếu bạn cần cuộn các mảng (với dữ liệu khối / khối), bạn có thể thực hiện với các vòng lặp đơn giản.

cuộn trái

for (int pos=0;pos<viewwidth;pos++)
{
    tilemap[pos] = tilemap[pos+1];
}

tilemap[width] = newTile; // from maparray.

Phù

Đó là một lời giải thích dài. Bạn có hiểu quan điểm của tôi ở đây, hoặc bạn cần giải thích thêm?


Cách hay để hiển thị khái niệm khung nhìn / camera, sẽ sử dụng nó trong các giải thích trong tương lai = D
DFectuoso

1
Giải thích hay ... Điều đó có nghĩa là họ đang sửa kích thước của chế độ xem và họ sử dụng các bản dịch để hiển thị cuộn.
Chandan Shetty SP

Tôi đã không phát minh ra điều này. Tôi đã quay ngược thời gian trong 64 ngày cũ (8 bit với ram 64 KB), vì vậy tôi đã học được nó một cách khó khăn. Không có bất kỳ khung nhìn hay GUI ưa thích nào, vì vậy bạn phải phát triển một số cách để cuộn. Nó cũng tương tự đối với Super Mario và nhiều trò chơi tilebided cũ khác. Nhưng nó cũng có thể được sử dụng cho các trò chơi vector 3D. Các "gạch" chỉ là một chút khác nhau. hãy xem cái này 3d.d9.dk/biplane/?test-scler
BerggreenDK

Chỉ cần thay đổi "chế độ xem" trên một trong các nút và bạn có thể thấy "gạch" được thêm vào đường chân trời và nếu bạn thay đổi campos thành phía trước mặt phẳng, bạn cũng có thể thấy chúng bị xóa phía sau mặt phẳng.
BerggreenDK

2

Cuộn không nhất thiết có nghĩa là tải mọi thứ vào bộ nhớ. Cách thông thường để giải quyết vấn đề này là tách nội dung của bạn thành các ô được tải vào bộ nhớ khi cần. Apple có một ví dụ tại http://developer.apple.com/lvern/ios/#samplecode/ScrollViewSuite/Intributiontion/Intro.html để hiển thị hình ảnh lớn.

Trò chơi, tuy nhiên, có xu hướng làm một cái gì đó khác. Ngay cả khi có thể sử dụng kỹ thuật trước đó, việc tải dữ liệu từ đĩa vẫn chậm và có thể làm gián đoạn trải nghiệm trò chơi cho người dùng. Vì lý do này, khu vực để cuộn thường được cắt thành các mảnh mà sau này bạn có thể sử dụng lại, mang lại cảm giác rằng cả thế giới lớn hơn nó có thể thực sự phù hợp với bộ nhớ.

Bạn có thể tìm hiểu thêm về các ô với trình chỉnh sửa bản đồ như Tiled Map Editor và tìm kiếm trên mạng để xem hướng dẫn về cách sử dụng / tích hợp vào trò chơi của bạn. Các trò chơi như Diablo được biết là sử dụng các bản đồ lát gạch được phân chia hợp lý thành các ô lớn hơn được dán lại với nhau tạo ra các bản đồ giả ngẫu nhiên vô nghĩa trên mỗi trò chơi khác nhau.


0

Một cách khác để thực hiện cuộn cho trò chơi 2d là thao tác ma trận chiếu của bạn để phản ánh vị trí của màn hình / máy ảnh trong thế giới trò chơi.

Những gì tôi đã làm là triển khai một lớp camera 2d có vị trí và chiều rộng / chiều cao của khu vực có thể xem được .. Sau đó, trước khi bạn vẽ thế giới trò chơi, bạn thiết lập ma trận chiếu ortho.

ví dụ

float left = camera->X - (camera->Width / 2.0f);
float bottom = camera->Y - (camera->Height / 2.0f);
float right = left + camera->Width;
float top = bottom + camera->Height;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(left, right, bottom, top, -50.0f, 1.0f);

Tôi hi vọng cái này giúp được. Ồ, và bạn sẽ đặt lại ma trận chiếu sang thứ khác nếu bạn muốn vẽ các thành phần UI sau đó, v.v.

Tất nhiên, tất cả những điều này chỉ áp dụng nếu bạn viết trò chơi của mình bằng openGL.


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.