Lộ trình › Pixel art chuyên sâu › Bài 181/218

Dự án 8: Ô nước chảy 4 frame liền mạch (animated tile)

Vẽ một ô nước pixel 16 × 16 liền mạch bốn cạnh rồi biến nó thành 4 frame bằng Filter Offset – sóng dời đúng 4 px mỗi frame nên frame 4 nối lại frame 1 – trên dải 64 × 16 px, và phát bằng Animated Tile trong Unity 6.

Nâng cao 70 phút ★★★ Vừa Hướng dẫn cho Windows · đổi sang macOS

Photoshop hiển thị tiếng Anh. Từ có gạch chân chấm là thuật ngữ trên giao diện — chạm để xem nghĩa, hoặc tra Từ điển Anh–Việt.

File mẫu để luyện tập

Tải về rồi mở bằng Photoshop: FileTệp›OpenMở (Ctrl+O).

Một màn chơi có sông hồ trông "chết" nếu nước đứng yên. Giải pháp của game pixel là animated tile: ô nước có vài frame lặp lại, và vì mọi ô nước cùng phát một lúc, cả mặt hồ gợn sóng. Có hai điều kiện: mỗi frame phải liền mạch (ghép cạnh nhau không lộ đường nối) và chuỗi frame phải lặp vòng (frame cuối nối mượt về frame đầu). Mẹo của bài: vẽ một frame thật đẹp, rồi để FilterBộ lọc›OtherKhác›OffsetDịch chuyển (bọc vòng) tạo ba frame còn lại – vì dời 4 px × 4 frame = 16 px, đúng một vòng của ô.

Hình mẫu

Bốn frame ô nước 16 × 16 phóng to, sóng dời 4 px mỗi frame; bên dưới frame 1 được lát 8 × 2 ô cho thấy không có đường nối
Bốn frame ô nước 16 × 16 phóng to, sóng dời 4 px mỗi frame; bên dưới frame 1 được lát 8 × 2 ô cho thấy không có đường nối

Thời gian ước tính: khoảng 70 phút. Nhìn hàng lát bên dưới: các gợn sóng chạy liên tục qua mép ô – đó là bằng chứng ô liền mạch.

Chuẩn bị

  • Canvas: hai file. File vẽ water_tile.psd 16 × 16 px và file kết quả 64 × 16 px (4 frame), cả hai RGB Color, Resolution (Độ phân giải) 72. Ô nước kín màu nên không cần nền trong suốt.
  • Công cụ chính: Pencil (Bút chì) Tool 1 px (Shift+B), FilterBộ lọc›OtherKhác›OffsetDịch chuyển (bọc vòng) với tùy chọn Wrap Around, EditChỉnh sửa›Define Pattern để xem lát thử, Paint Bucket (Thùng sơn) Tolerance 0 bỏ Anti-alias (Khử răng cưa).
  • Phóng to không mờ: Image Interpolation Nearest Neighbor (Điểm lân cận), ViewHiển thị›ShowHiện›Pixel GridLưới điểm ảnh, zoom 1600% cho file 16 × 16.
  • Thiết bị: ô 16 × 16 chỉ có 256 pixel – chuột là đủ và chính xác nhất. Bút Wacom, XP-Pen, Huion hay iPad + Apple Pencil giúp vẽ đường sóng cong tự nhiên hơn một chút; tắt lực nhấn và kiểm tra lại từng pixel sau khi vẽ.
  • File mẫu: "Dải 4 ô 16 × 16": chữ thập hồng ở giữa mỗi ô đánh dấu chỗ đường nối sẽ xuất hiện sau khi Offset (Dịch chuyển (bọc vòng)) 8 px – vùng đó phải liền mạch.
MàuMã hexDùng cho
#1a2a5aRãnh sóng sâu (rất ít pixel)
#24448aBóng sóng – mặt sau con sóng
#2f66b0Nước nền (chiếm nhiều nhất)
#4f9ae0Mặt sóng bắt sáng
#bff0ffLấp lánh – 2 đến 4 pixel mỗi frame

Các bước

Sáu giai đoạn: tô nền 4 ô, vẽ rãnh sóng tối ở frame 1, thêm mặt sóng sáng, nhân bản và dời 4 px cho frame 2–4, thêm pixel lấp lánh, kiểm tra liền mạch bằng Offset 8 px
Sáu giai đoạn: tô nền 4 ô, vẽ rãnh sóng tối ở frame 1, thêm mặt sóng sáng, nhân bản và dời 4 px cho frame 2–4, thêm pixel lấp lánh, kiểm tra liền mạch bằng Offset 8 px
  1. File vẽ 16 × 16: Ctrl+N 16 × 16 px, tô nền #2f66b0. Zoom 1600%, bật Pixel Grid (Lưới điểm ảnh).
  2. File xem lát: tạo file 128 × 64 px. Quay lại ô nước, EditChỉnh sửa›Define Pattern đặt tên Water; ở file 128 × 64, layer mới, EditChỉnh sửa›FillTô đầy / Độ phủ bên trong Contents Pattern chọn Water. Mỗi lần sửa ô, Define Pattern lại và Fill lại – bạn thấy ngay mặt hồ lớn.
  3. Rãnh sóng tối: trên ô 16 × 16, vẽ 2–3 vệt cong ngắn #24448a dài 3–6 px, nằm ngang hơi uốn như dấu ngã "~". Các vệt so le, không thẳng hàng. Thêm 1–2 pixel #1a2a5a ở chỗ sâu nhất của vệt.
  4. Mặt sóng sáng: ngay trên mỗi vệt tối, vẽ vệt #4f9ae0 ngắn hơn một chút – mặt trước con sóng đón ánh sáng. Sáng luôn nằm trên tối, giống như vạch sáng trên viên gạch.
  5. Làm liền mạch: FilterBộ lọc›OtherKhác›OffsetDịch chuyển (bọc vòng) Horizontal +8, Vertical +8, Wrap Around. Bốn góc cũ giờ gặp nhau ở giữa ô: sửa các vệt bị cắt cụt hoặc dồn cục ở chữ thập giữa, rồi Offset lại −8, −8 để trả về vị trí cũ. Lặp đến khi không còn thấy đường nối trong file xem lát.
  6. Phân bố đều: trong file xem lát, lùi ra 200%: nếu mắt thấy một "hoa văn" lặp đều như giấy dán tường, xóa bớt 1 vệt hoặc làm một vệt dài hơn. Nước tự nhiên có mật độ đều nhưng không có điểm nhấn nổi bật.
  7. Dải 4 frame: tạo file 64 × 16 px, đặt file mẫu lên trên cùng. Kéo ô nước vào ô 1 (Move Tool (Công cụ Di chuyển), giữ Shift để dán đúng góc). Nhân bản layer 3 lần (Ctrl+J) và dời mỗi bản đúng 16 px sang phải.
  8. Dời sóng 4 px mỗi frame: chọn bản ở ô 2, Marquee (Khung chọn) chọn đúng ô 16 × 16 đó, FilterBộ lọc›OtherKhác›OffsetDịch chuyển (bọc vòng) Horizontal +4, Vertical 0, Wrap Around (Offset chỉ áp trong vùng chọn). Ô 3 dời +8, ô 4 dời +12. Ô 5 tưởng tượng sẽ là +16 – trùng ô 1, nên vòng lặp liền mạch.
  9. Cho sóng "sống": dời thuần túy trông như băng chuyền trượt. Ở mỗi frame, đổi 2–3 pixel: một vệt sáng dài thêm 1 px, một vệt ngắn lại, một rãnh tối lệch xuống 1 px. Giữ thay đổi nhỏ để không phá vòng lặp.
  10. Lấp lánh: 2–4 pixel #bff0ff mỗi frame, đặt trên đỉnh vệt sáng nhưng khác chỗ giữa các frame – khi phát, chúng nhấp nháy như nắng trên mặt nước.
  11. Kiểm tra từng frame: mỗi frame phải liền mạch riêng. Sao chép từng ô sang file 16 × 16, Offset 8/8 kiểm tra như bước 5. Thêm kiểm tra vòng lặp: đặt ô 4 cạnh ô 1, mắt phải thấy sóng tiếp tục trôi.
  12. Xem thử chuyển động: WindowCửa sổ›TimelineDòng thời gian › Create Frame Animation, 4 frame mỗi frame bật một layer ô, thời lượng 0,15 giây, Looping Forever. Nếu thấy giật ở chỗ frame 4 → 1, độ dời chưa đúng 4 px.
  13. Đếm màu và xuất: bản sao › Indexed Color: tối đa 6 màu. Ẩn mẫu, FileTệp›Export›Export AsXuất ra (tùy chỉnh) PNG 100% → water_anim.png đúng 64 × 16 px.
  14. Unity 6: Texture Type Sprite (2D and UI), Sprite Mode Multiple, Pixels Per Unit (Số pixel mỗi đơn vị) 16, Filter Mode (Chế độ lọc ảnh) Point (no filter), Compression None; Slice Grid By Cell Size 16 × 16. Với gói 2D Tilemap Extras: Assets›Create›2D›Tiles›Animated Tile, kéo 4 sprite vào danh sách theo thứ tự, Minimum Speed và Maximum Speed đặt 6 (6 frame/giây). Kéo tile vào Tile Palette và tô lên Tilemap Water; thêm Tilemap Collider 2D nếu nước chặn đường.
Mẹo: Đặt Minimum Speed và Maximum Speed của Animated Tile khác nhau một chút (ví dụ 5 và 7) và bật Start Frame ngẫu nhiên nếu có: mỗi ô nước gợn lệch nhịp nhau, mặt hồ lớn bớt cảm giác "đồng phục".
Lỗi hay gặp: Dời 3 hoặc 5 px mỗi frame. 4 frame × 5 px = 20 px không chia hết cho 16, nên frame 4 không nối về frame 1 và nước "giật" mỗi vòng. Số px dời × số frame phải bằng đúng chiều rộng ô (hoặc bội của nó).

Nâng cao (tùy chọn)

  • Ô mép nước: vẽ thêm ô bờ (nửa trên là cỏ hoặc đá, nửa dưới là nước có viền bọt #bff0ff) cũng 4 frame, bọt chỉ đổi 1–2 pixel mỗi frame.
  • Thác nước: dùng cùng kỹ thuật nhưng Offset theo chiều dọc +4 mỗi frame, vệt sáng dọc thay vì ngang.
  • Dung nham: đổi bảng màu sang đỏ – cam – vàng và giảm tốc độ xuống 3–4 frame/giây cho cảm giác đặc quánh.

Mẹo & trick học nhanh

Offset chỉ trong vùng chọn

Khi có vùng chọn, Filter Offset với Wrap Around chỉ cuộn pixel bên trong vùng đó. Chọn đúng ô 16 × 16 trước khi Offset để không làm lệch các frame bên cạnh.

Nền chiếm phần lớn

Khoảng 60% pixel nên là màu nền #2f66b0. Quá nhiều vệt sáng tối làm mặt nước rối và nhấp nháy khó chịu khi cả màn hình đầy nước.

Pattern để xem lát

EditChỉnh sửa›Define Pattern rồi Fill Pattern lên một file lớn là cách nhanh nhất để thấy ô trông thế nào khi lặp hàng chục lần – đường nối nhỏ nhất cũng lộ ra.

Kiểm tra nhanh

1 Vì sao bài chọn dời sóng đúng 4 px mỗi frame với 4 frame?
2 Filter Offset với Wrap Around giúp gì khi làm ô liền mạch?
3 Trong Unity 6, thành phần nào dùng để phát 4 sprite thành một ô nước động trên Tilemap?

Bài tập: Ô nước (hoặc dung nham) động 4 frame của bạn

Làm trong Photoshop rồi nộp file. Máy chấm kiểm tra các yêu cầu kỹ thuật và chỉ cách sửa từng lỗi; giáo viên chấm thêm phần thẩm mỹ.

Làm bài tập