block-crush / báo cáo skin

Tạo skin khối mới:
120 × 120, bảy ảnh, một dòng đăng ký

Kết quả kiểm tra 132 file skin trong game/Content/res và code đọc chúng. Hiện chỉ icon khối được nối vào game. Phần còn lại của cấu hình skin gốc chưa có code dùng.

120×120kích thước mọi icon khối
132 / 132file đúng 120×120 (63 + 68 + 1)
7ảnh mỗi skin (icon1..icon7)
280skin trong TbSkinConfig

1. Icon khối: thành phần duy nhất đang chạy

Icon khối mẫu 120 pixel 120 px120 px
MụcYêu cầu
Kích thước120×120 px, vuông
Định dạngPNG RGBA 8-bit, có kênh alpha
Vùng vẽPhủ kín khung. Bbox alpha của cả 69 file mẫu đo được là (0,0,120,120), không có lề trong suốt
Hình dạngÔ vuông bo góc. Góc ngoài trong suốt (alpha 0)
MàuTô sẵn trong ảnh. Game vẽ nguyên bản, không tint
Hiển thịkCell = 960 / 8 = 120, nên ảnh hiện 1:1 trên lưới 8×8

Ảnh thật trong game, hiển thị đúng 120 px trên nền ô caro (viền cam là khung 120×120)

cube_1_woodskin_1301
_differentMaterials
cube_2_woodskin_1302
_differentMaterials
cube_3_woodskin_1303
_differentMaterials
cube_4_woodskin_1304
_differentMaterials
cube_5_woodskin_1305
_differentMaterials
ic_block.png
(mặc định, skin 1000)
base_ic_collection_block
(nền ô gem Travel)

2. Quy ước tên file

Art/feature/skin_different_materials/skins/
  cube_<k>_woodskin_<suffix>_differentMaterials.png

3. Đăng ký skin để game dùng được

  1. Thêm dòng vào bảng kPoolIcons[] trong game/Source/screens/board/BoardView.cpp (dòng 205-211):
    {4020, 1321, "1234561"},   // {id, suffix, blocks}
  2. Muốn skin được bốc ngẫu nhiên khi thanh x/25 đầy, thêm id vào kSkinPool trong game/core/src/endless_game.cpp:27.
  3. Skin không có trong kPoolIcons sẽ dùng BlockStyle/Default/ic_block.png.
  4. Chỉ muốn đổi giao diện khối mặc định: ghi đè ic_block.png (120×120), không cần sửa code.
Preview skin trên thanh tiến trình đang gắn cứng skin_shared/skins/cube_3_woodskin_004.png (BoardView.cpp:506). Skin mới sẽ không đổi preview này.
Tôi chưa đọc SkinResourceFamilyMap.cs, nên chưa kiểm tra việc skin ngoài pool có phải đăng ký thêm family hay không.

4. Bàn cờ và nền (ảnh dùng chung, không đổi theo skin)

Ảnh (trong Art/)Kích thướcGhi chú
LoadCore/Sprite/SkinStyle/qipannew.png76×1012Khung bàn cờ, vẽ ở kFrameSize = 1002
LoadCore/Sprite/SkinStyle/QiPanxin.png118×118Ô nền của lưới
LoadCore/Sprite/SkinStyle/QiPanxingray.png118×118Biến thể xám
LoadCore/Sprite/SkinStyle/img_bock_white.png115×116
LoadCore/Sprite/SkinStyle/img_bock_white_1.png954×114
LoadCore/Sprite/SkinStyle/img_lx_bg01.png384×1024Nền màn Travel
LoadResShared/Sprite/SkinStyle/QiPanbg_1.png768×2048Nền
LoadResShared/Sprite/SkinStyle/img_muwen.png768×2048Vân gỗ
BlockStyle/Default/base_ic_collection_block.png120×120Nền ô gem Travel (id ≥ 100). Gem vẽ đè ở 0.7 × kCell, tối đa khoảng 84 px

5. Trường cấu hình skin chưa nối vào code port

Mỗi skin trong data_src/config/TbSkinConfig.json có hàng chục trường. Tìm trong game/Source không thấy chỗ nào đọc các trường dưới đây. Kích thước ảnh của nhóm này tôi chưa đo.

NhómTrườngTrạng thái
Màu nềnBGColor, ChessBGColor (hex 6 ký tự, ví dụ BD6D2C)chưa nối
Màu hiệu ứngMatchColor1..8 ([viền, nền, rgba]), BottomBlockEffectColor, ComboEdgeColorColor, StrokeDiffusionPreMatchColorchưa nối
Ảnh phụsuipian1..7, LightningBlock1..7, icon_Big1..6chưa nối
TravelTravelTragetBaseIcon*, TravelTragetCollectIcon*, TopCollectItemBg*chưa nối
Hiệu ứng, âmMatch1..7EffectName, ClearSfxKey, BgmNamechưa nối
KhácSlotStyleIndex, ColorPool, TravelDiffchưa nối
Icon khốiicon1..icon7đang chạy
Muốn các trường trên đổi được theo skin thì phải nối vào code trước.

6. Danh sách kiểm tra khi giao skin

#Kiểm traMức
1Đủ ảnh cho mọi chữ số trong chuỗi blocksbắt buộc
2Mỗi ảnh đúng 120×120, PNG RGBA 8-bitbắt buộc
3Góc trong suốt, thân khối phủ kín khung, không lề thừabắt buộc
4Tên file đúng mẫu mục 2, chữ thường, hậu tố _differentMaterialsbắt buộc
57 loại khối phân biệt được bằng màu trên nền tối và sángnên có
6Dòng mới trong kPoolIcons (và kSkinPool nếu cần bốc ngẫu nhiên)bắt buộc