====== Hoạt Ảnh Giao Diện ====== ===== Giới Thiệu ===== **Trước khi đọc bài viết này, vui lòng xem qua [[developer_center:developer_editor:script:ui_event|cách sử dụng API liên quan]] và hiểu các kiến ​​thức**\\ \\ **Sau khi hiểu các kiến ​​thức về tạo ảnh động UI bằng trigger, có thể bạn sẽ nghĩ rằng nó quá rắc rối và phức tạp. Vậy tại sao chúng ta không làm hoạt hình theo kịch bản nhỉ?** ===== Hướng Dẫn ===== **Trong bài viết này, bạn sẽ tìm hiểu cách tạo nhiều loại hoạt ảnh và tìm hiểu về:** \\ \\ - **Cách sử dụng [[developer_center:developer_editor:script:ui_event|Lớp Giao Diện]]**\\ - **Tìm hiểu cách đặt thời gian chờ thông qua tập lệnh**\\ - **Tìm hiểu cách thiết lập các chức năng kết hợp thông qua tập lệnh**\\ - **Hoạt ảnh độ mờ, Hoạt ảnh tuyến tính, Hoạt ảnh xoay, Hoạt ảnh thu phóng, Hoạt ảnh kết hợp** \\ ===== 1. Hoạt Ảnh Độ Mờ ===== **Thành Phẩm** {{ :developer_center:developer_editor:script:ui_opacity_animation_present.webm?600&direct |}} ==== Kịch Bản ==== **Xin vui lòng đọc các ghi chú ​​​​thông qua kịch bản dưới đây** local uiid = [[7258119162206233205]] -- Thay thế bằng ID giao diện UI của bạn local el = [[7258119162206233205_2]] -- Thay thế bằng ID thành phần bạn muốn thực hiện hoạt ảnh function opacity_animation(e, id, el, from, to, t) -- Hàm hoạt ảnh Độ trong suốt local step_alpha = (to - from) / (t / 0.05) -- Thiết lập sự thay đổi độ trong suốt cho mỗi vòng lặp local opacity = from -- Thiết lập độ trong suốt ban đầu for i = 1, t / 0.05 do -- Dựa trên thời gian, thiết lập giá trị vòng lặp opacity = opacity + step_alpha -- Thiết lập giá trị độ trong suốt hiện tại Customui:setAlpha(e, id, el, opacity) -- Sửa đổi độ trong suốt của thành phần Trigger:wait(0.05) -- Đợi 0,05 giây end end function ubc(e) local p = e.eventobjid -- opacity_animation(playerid, UIid, element, giá trị ban đầu, giá trị kết thúc, thời lượng hoạt hình) opacity_animation(p, uiid, el, 100, 0, 0.5) -- hoạt ảnh làm mờ opacity_animation(p, uiid, el, 0, 100, 0.5) -- hoạt ảnh hiển thị end -- Đăng ký một trình nghe để chạy khi bất kỳ nút nào được nhấp bởi bất kỳ người chơi nào ScriptSupportEvent:registerEvent("UI.Button.Click", ubc) ===== 2. Hoạt Ảnh Tuyến Tính ===== **Thành Phẩm** {{ :developer_center:developer_editor:script:ui_linear_animation_present.webm?600&direct |}} ==== Kịch Bản ==== **Xin vui lòng đọc các ghi chú ​​​​thông qua kịch bản dưới đây** local uiid = [[7258119162206233205]] -- Thay thế bằng ID giao diện UI của bạn local el = [[7258119162206233205_2]] -- Thay thế bằng ID của thành phần bạn muốn hoạt hóa function linear_animation(p, id, el, from_x, from_y, to_x, to_y, t) local step_x = (to_x - from_x) / (t / 0.05) -- Tính toán bao nhiêu tọa độ x cần di chuyển trong mỗi vòng lặp local step_y = (to_y - from_y) / (t / 0.05) -- Tính toán bao nhiêu tọa độ y cần di chuyển trong mỗi vòng lặp local x = from_x local y = from_y for i = 1, t / 0.05 do x = x + step_x y = y + step_y Customui:setPosition(p, id, el, x, y) -- Đặt vị trí của thành phần Trigger:wait(0.05) end end function ubc(e) local p = e.eventobjid -- linear_animation(playerid, ID UI, ID thành phần, Tọa độ xuất phát x, Tọa độ xuất phát y, Tọa độ đích x, Tọa độ đích y) linear_animation(p, uiid, el, 150, 190, 600, 300, 1) -- Hoạt ảnh đến tọa độ mới linear_animation(p, uiid, el, 600, 300, 150, 190, 1) -- Hoạt ảnh đến tọa độ ban đầu end -- Đăng ký trình nghe để chạy khi bất kỳ nút nào được nhấp bởi bất kỳ người chơi nào ScriptSupportEvent:registerEvent("UI.Button.Click", ubc) **Xin lưu ý rằng tọa độ điểm bắt đầu (x=150,y=190) phải giống với tọa độ giao diện người dùng** {{ :developer_center:developer_editor:script:ui_linear_animation_explain.png?600&direct |}} ===== 3. Hoạt Ảnh Xoay ===== **Thành Phẩm** {{ :developer_center:developer_editor:script:ui_rotate_animation_present.webm?600&direct |}}\\ ==== Kịch Bản ==== **Xin vui lòng đọc các ghi chú ​​​​thông qua kịch bản dưới đây**\\ local uiid = [[7258119162206233205]] -- Thay thế bằng ID giao diện UI của bạn local el = [[7258119162206233205_2]] -- Thay thế bằng ID của thành phần bạn muốn hoạt hóa function rotate_animation(p, uiid, el, from_angle, to_angle, thời_gian) -- Hàm Hoạt ảnh Xoay local bước_góc = (to_angle - from_angle) / (thời_gian / 0.05) -- Góc xoay mỗi frame local góc = from_angle -- Thiết lập góc ban đầu for i = 1, thời_gian / 0.05 do -- Chạy mỗi frame của hoạt ảnh góc = góc + bước_góc -- Thiết lập góc frame tiếp theo Customui:rotateElement(p, uiid, el, góc) -- Sửa đổi góc quay của thành phần Trigger:wait(0.05) -- Tiếp tục chạy mã sau khi đợi 0,05 giây để xem hoạt ảnh end end function ubc(e) local p = e.eventobjid -- rotate_animation(playerid, ID UI, ID thành phần, Góc bắt đầu, Góc kết thúc, Thời lượng hoạt ảnh) rotate_animation(p, uiid, el, 0, 360, 1) end -- Đăng ký trình nghe để chạy khi bất kỳ nút nào được nhấp bởi bất kỳ người chơi nào ScriptSupportEvent:registerEvent("UI.Button.Click", ubc) **Như bạn có thể thấy, phần tử sẽ xoay 360 độ trong 1 giây. Nhưng để xoay tốt hơn, chúng tôi mong muốn phần tử được căn giữa. Làm thế nào chúng ta có thể thực hiện nó?**\\ ** * Tạo phần tử cha mới** {{ :developer_center:developer_editor:script:ui_rotate_image2.png?600&direct |}}\\ {{ :developer_center:developer_editor:script:ui_rotate_image1.png?600&direct |}}\\ **Chúng tôi tạo một phần tử cha mới có chiều rộng và chiều cao bằng 0 và đặt phần tử gốc làm phần tử tập hợp con.**\\ **Sau đó, chúng ta phải thay thế biến "el" bằng phần tử cha mới.**\\ local el = [[7258119162206233205_3]]--Thay thế id thành phần của bạn muốn tạo hiệu ứng động **Đây là kết quả:**\\ {{ :developer_center:developer_editor:script:ui_rotate_animation_present_2.webm?600&direct |}} ===== 4. Hoạt Ảnh Tỷ Lệ ===== **Thành Phẩm** {{ :developer_center:developer_editor:script:zoom_animation_present.webm?600&direct |}}\\ ==== Kịch Bản ==== **Xin vui lòng đọc các ghi chú ​​​​thông qua kịch bản dưới đây**\\ local uiid = [[7258119162206233205]] -- Thay thế bằng ID của giao diện UI của bạn local el = [[7258119162206233205_2]] -- Thay thế bằng ID của thành phần bạn muốn hoạt hóa function zoom_animation(player, uiid, elementid, from_width, from_height, to_width, to_height, thời_gian) -- Hàm hoạt hình Thu phóng -- player: UID của người chơi -- uiid: ID của đối tượng UI -- elementid: ID của đối tượng thành phần -- from_width: Chiều rộng ban đầu -- from_height: Chiều cao ban đầu -- to_width: Chiều rộng mục tiêu -- to_height: Chiều cao mục tiêu -- time: Thời gian hoạt ảnh local step_width = (to_width - from_width) / (time/ 0.05) -- Tính bước dịch chuyển chiều rộng cho mỗi frame, dựa trên sự khác biệt giữa chiều rộng mục tiêu và chiều rộng ban đầu, chia cho số frame local step_height = (to_height - from_height) / (time / 0.05) -- Tính bước dịch chuyển chiều cao cho mỗi frame, dựa trên sự khác biệt giữa chiều cao mục tiêu và chiều cao ban đầu, chia cho số frame local width= from_width -- Thiết lập chiều rộng ban đầu bằng giá trị chiều rộng ban đầu được cung cấp local height = from_height -- Thiết lập chiều cao ban đầu bằng giá trị chiều cao ban đầu được cung cấp for i = 1, time / 0.05 do -- Chạy mỗi frame của hoạt hình dựa trên thời gian chia cho thời gian mỗi frame (0.05 giây) width = width + step_width -- Tính toán chiều rộng cho frame tiếp theo bằng cách thêm bước rộng vào giá trị chiều rộng hiện tại height = height + step_height -- Tính toán chiều cao cho frame tiếp theo bằng cách thêm bước cao vào giá trị chiều cao hiện tại Customui:setSize(playerid, uiid, elementid, width, height) -- Sửa đổi chiều rộng và chiều cao của thành phần sử dụng hàm Customui:setSize() Trigger:wait(0.05) -- Đợi 0.05 giây trước khi tiếp tục đến frame tiếp theo end end function ubc(e) local p = e.eventobjid zoom_animation(p,uiid,el,120,126,360,376,1) zoom_animation(p,uiid,el,360,376,120,126,1) end -- Đăng ký trình nghe để chạy khi bất kỳ nút nào được nhấp bởi bất kỳ người chơi nào ScriptSupportEvent:registerEvent("UI.Button.Click",ubc) ===== 5. Hợp Ảnh Kết Hợp ===== **Trong phần giải thích về hoạt ảnh kết hợp, định nghĩa về chức năng hoạt ảnh và đăng ký lắng nghe sự kiện sẽ bị bỏ qua.\\ Khi nói đến các bản dịch và xoay đơn giản, chúng có thể không hấp dẫn về mặt trực quan. Đây là nơi hoạt ảnh kết hợp phát huy tác dụng\\ Hãy bắt đầu với một ví dụ rất đơn giản để minh họa một hoạt ảnh tổng hợp cơ bản.**\\ **Thành Phẩm** {{ :developer_center:developer_editor:script:combined_animation_present.webm?600&direct |}}\\ ==== Kịch Bản ==== local function ubc(e) local playerid = e.eventobjid -- Đặt người chơi local uiid = "7258119162206233205" -- Đặt giao diện local el = "7258119162206233205_2" -- Đặt phần tử local o_locat = {x=-60,y=-63,w=120,h=126} -- Vị trí ban đầu của phần tử -- Hoạt Ảnh Tuyến Tính linear_animation(playerid, uiid, el, o_locat.x, o_locat.y, o_locat.x + 200, o_locat.y + 200, 1) -- Hoạt Ảnh Xoay rotate_animation(playerid, uiid, el, 0, 360, 1) -- Hoạt Ảnh Tỷ Lệ zoom_animation(playerid, uiid, el, o_locat.x, o_locat.y, o_locat.x + 200, o_locat.y + 200, 1) -- Hoạt Ảnh Độ Mờ opacity_animation(playerid, uiid, el, 100, 0, 1) end ScriptSupportEvent:registerEvent("UI.Button.Click", ubc) **Trong hàm, nó đặt ID người chơi, ID giao diện người dùng và ID thành phần. Sau đó, nó áp dụng bốn hoạt ảnh khác nhau cho phần tử: hoạt ảnh dịch, xoay, hoạt ảnh tỷ lệ và hoạt ảnh độ mờ. Mỗi hoạt ảnh có chức năng riêng (linear_animation, rotate_animation, zoom_animation, opacity_animation) và các tham số được chuyển đến các chức năng này để xác định hành vi hoạt ảnh cụ thể.**\\ **Việc kết hợp nhiều hoạt ảnh cùng một lúc không được coi là hoạt ảnh kết hợp thực sự. Để phát nhiều hoạt ảnh cùng lúc, chúng ta cần sử dụng hàm đa luồng __threadpool:work()__.\\ Trước khi sử dụng chức năng này, điều quan trọng là phải hiểu khái niệm về luồng và đa luồng.**\\ **Thành Phẩm** {{ :developer_center:developer_editor:script:combined_animation_present1.webm?600&direct |}}\\ ==== Kịch Bản ==== threadpool:work(function() -- Dịch hoạt ảnh vào một luồng linear_animation(playerid, uiid, el, o_locat.x, o_locat.y, o_locat.x + 200, o_locat.y + 200, 1) end) -- Hoạt Ảnh Độ Mờ opacity_animation(playerid, uiid, el, 0, 100, 1) ScriptSupportEvent:registerEvent("UI.Button.Click", ubc) **Trong đoạn mã cập nhật này, một chuỗi mới được tạo cho hoạt ảnh dịch bằng cách sử dụng threadpool:work(). **\\ **Hoạt ảnh dịch được gói bên trong một hàm ẩn danh và được thực thi trong luồng mới. Điều này cho phép hoạt ảnh dịch chạy đồng thời với luồng chính, luồng này tiếp tục thực thi hoạt ảnh độ mờ.**