====== 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ờ.**