Sprite Animation Thực tiễn tốt nhất


18

Tôi muốn hiểu rõ hơn về cách mọi người trong thế giới thực đang xử lý hoạt hình của họ.

Bạn có tải 1 hình ảnh lớn và sau đó vẽ các hình chữ nhật khác nhau dựa trên khung hình động không?

Bạn có tải các tệp hình ảnh X vào một mảng và vẽ mục trong mảng dựa trên khung hình động không?

Làm thế nào để bạn xử lý có chiều dài khác nhau của hình ảnh động cho các họa tiết khác nhau.

Giả sử một nhân vật đi bộ mất 4 - 8 khung hình và sóng trên bãi biển chỉ mất 2 - 3 khung hình. Làm thế nào bạn sẽ xử lý tình huống đó? Xem bên dưới

Dim Waves(1) as Sprite
Dim Char(5) as Sprite

Sub Animate()
     Frame += 1
     Draw Char(Frame)
     Draw Waves(Frame)
     If Frame = 5 Then Frame = 0
End Sub

Rõ ràng là Sóng sẽ kết thúc với một lỗi ngoài giới hạn.

Hoặc bạn có lo lắng về hoạt hình của mình và không quan tâm đến khung hình. Có mỗi sprite biết vòng lặp hoạt hình của riêng mình?

Câu trả lời:


23

Cách tôi đã làm trong quá khứ là bằng cách tách dữ liệu hoạt hình khỏi phát lại hoạt hình . AnimationVề cơ bản, An có thể trở thành một mảng Framesvà một vài thuộc tính mô tả cách hoạt hình sẽ hoạt động (nếu nó lặp, v.v.).

Tôi thường tải một hình ảnh và vẽ các mảnh của nó.

Mỗi Framehình ảnh động về cơ bản là một hình chữ nhật và một khoảng thời gian. Điều này cho phép một số khung hình hiển thị lâu hơn các khung khác, có thể hoặc không thể là thứ bạn muốn. Nếu bạn muốn tất cả các khung trong hoạt hình của bạn hiển thị trong cùng một khoảng thời gian, hãy lưu nó trong Animationđối tượng của bạn .

Bất cứ điều gì cần để chơi một hình ảnh động đều có cái riêng của AnimationPlayernó có thể được chỉ ra Animation. Đối tượng người chơi đảm nhiệm việc phát hoạt hình và cung cấp "khung hiện tại".

Lợi thế cho điều này đối với tôi là tôi có thể có một ví dụ duy nhất Animationmà nhiều đối tượng có thể trỏ đến và chơi các phần khác nhau cùng một lúc. Thật dễ dàng để thay đổi hình ảnh động bằng cách chỉ AnimationPlayervào một Animationđối tượng khác và đặt lại phát lại.

Chỉnh sửa : Đây là một triển khai JavaScript khá cơ bản của hệ thống được mô tả ở trên . Tôi đã ném nó cùng nhau trong vài phút như một cuộc biểu tình . Mã "thực" sẽ có nhiều tính năng hơn. Tuy nhiên, bạn sẽ cần một trình duyệt hiện đại hỗ trợ cả Canvas và URI dữ liệu để nó hoạt động.


1
Những gì ông nói. Ngoài ra, sẽ rất thuận tiện khi có độ lệch x / y cho mỗi khung hình trong một hình động để bạn có thể đóng gói các hình ảnh sprite vào các hộp giới hạn của chúng một cách chặt chẽ nhưng sau đó đặt chúng vào vị trí bạn muốn trong một hình ảnh động. Nó cũng cho phép bạn thực hiện một số nội dung cơ bản như cười đùa chỉ bằng cách sử dụng một hình ảnh duy nhất.
khoan hồng

Vâng, tôi hoàn toàn đồng ý. Trong thực tế, hệ thống hoạt hình tôi đang sử dụng cho phép điều này. Nó giúp dễ dàng hơn nhiều để thay đổi vị trí của bất kỳ khung hình nào mà không cần chỉnh sửa dữ liệu hình ảnh.
Zack The Human

Ví dụ làm việc tốt đẹp, WOW Thumbs up. Muốn giới thiệu nó.
DFectuoso

Một hạn chế quan trọng của loại hoạt hình là hình ảnh không thể được nhìn từ một góc độ khác - đi ra khỏi người xem, đi về phía người xem, v.v ... Hay tôi sai?
Majid fouadpour

@MajidFouladpour Tôi không nghĩ rằng loại hạn chế đó tồn tại khi sử dụng kỹ thuật này. Bạn chỉ cần có các đối tượng AnimationData khác nhau cho mỗi "góc nhìn".
Zack The Human

1

Tôi sẽ có một hình ảnh động biết nó có bao nhiêu khung hình. Những thứ này được lưu trữ ở đâu và tương đối không liên quan ngoại trừ các vấn đề về hiệu năng (như bạn có thể muốn chúng trong cùng một kết cấu). Tôi sẽ không thêm 1 vào framecount bao giờ, tôi sẽ thêm deltaTime * animSpeed ​​và chuyển đổi giá trị đó thành một số nguyên khi hiển thị. Bằng cách này, bạn có thể làm chậm hoặc tăng tốc độ hình ảnh động và độc lập với tốc độ khung hình.

Vì vậy, một sprite sẽ có một hình ảnh động tự cập nhật.


0

Tại sao không chỉ có số lượng khung cho mỗi đối tượng của bạn được lưu trữ? Cá nhân tôi chuyển số lượng khung hình trong hoạt hình cho các đối tượng của mình trong các hàm tạo của chúng, sau đó tôi có một hàm Animate () tiêu chuẩn có số lượng khung hình trong hoạt hình.


0

Nó phụ thuộc vào việc thực hiện. Trong công cụ của tôi, tôi làm hoạt hình trong cả Direct3D và DirectDraw.

Trong DirectDraw tôi tạo một hình ảnh lớn. Tất cả đều được lưu trữ trong bộ nhớ hệ thống, cuối cùng sẽ chuyển xuống khối dữ liệu một chiều.

Ưu điểm:

  • Dễ dàng di chuyển giữa các khung. Thay đổi con trỏ bắt đầu, thêm cao độ (tổng chiều rộng hình ảnh) mỗi y và bạn vàng.

Nhược điểm:

  • Không thể chỉ sao chép một khung hình vào màn hình, bạn phải thực hiện thủ công.

  • Khối ký ức khổng lồ. Khung hối hả xung quanh đến ở một hình phạt.

Trong Direct3D tôi sử dụng kết cấu riêng biệt. Điều này là do tôi không biết về giới hạn kết cấu của thiết bị nên tôi không biết liệu nó có hỗ trợ họa tiết có kích thước của toàn bộ hình ảnh hay không.

Ưu điểm:

  • Bạn có thể sao chép một khung hình thẳng vào màn hình, vì chúng đều là các thực thể riêng biệt.

Nhược điểm:

  • Thiếu liên kết bộ nhớ.

0

Trong các trò chơi của mình , tôi đã cung cấp cho lớp cơ sở Sprite của mình kiến ​​thức về cách tự vẽ và tất cả các yếu tố hoạt hình thừa hưởng kiến ​​thức đó: số lượng và thời lượng của khung hình hoạt hình, vị trí trên màn hình, v.v. Vòng lặp trò chơi chính chỉ lặp đi lặp lại tất cả của các họa tiết, yêu cầu mỗi người tự vẽ khi thấy phù hợp. Có vẻ hoạt động khá tốt và có tính mô-đun hơn để khởi động: nếu bạn thêm một sprite mới có vòng lặp hoạt hình khác (hoặc thậm chí phức tạp hơn: nhiều trạng thái hoạt hình), bạn không phải quay lại và viết lại Animate () thói quen để phù hợp với sự phức tạp bổ sung:

Dim Waves as Sprite
Dim Char as Sprite

Sub Animate()
     Char.update()
     Waves.update()
End Sub

Mỗi khi phương thức update () của sprite được gọi, nó sẽ biết liệu nó có nên vẽ lại cùng một khung như lần trước không, chuyển sang khung tiếp theo trong hình động hiện tại của nó, thay đổi thành hình động mới, v.v.

Điều này có thêm lợi ích là giúp điều chỉnh tốc độ khung hình dễ dàng hơn nhiều để phù hợp với tốc độ kết xuất đồng hồ / nền tảng khác nhau, bởi vì thay đổi duy nhất là tần suất bạn gọi Animate ().

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.