Thực hành else/if với việc trao điểm

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Dự án này sẽ sử dụng các câu lệnh điều kiện để tạo một phần sẽ trao hoặc trừ điểm trên bảng điểm tùy thuộc vào màu sắc của phần khi được chạm vào. Nếu là màu xanh, nó sẽ trao cho người chơi một số điểm. Nếu là màu xanh lá, nó sẽ trao cho người chơi nhiều điểm. Cuối cùng, nếu là màu đỏ, nó sẽ trừ điểm.

Thiết lập dự án

Phần trao điểm có thể được thêm vào bất kỳ dự án nào nơi điểm số là quan trọng. Ví dụ, một trò chơi phiêu lưu nơi người chơi thu thập điểm.

Theo dõi điểm số

Để thiết lập dự án này, bạn sẽ cần một bảng điểm để theo dõi điểm số và một phần thay đổi màu sắc. Mã cho bảng điểm sẽ được cung cấp.

  1. Tạo một kịch bản mới trong ServerScriptService có tên là Leaderboard. Sao chép và dán mã dưới đây vào kịch bản.


    -- Trong ServerScriptService, tạo một kịch bản có tên PlayerSetup với nội dung dưới đây.
    local Players = game:GetService("Players")
    local function onPlayerJoin(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    -- Ví dụ về IntValue
    local points = Instance.new("IntValue")
    points.Name = "Points"
    points.Value = 0
    points.Parent = leaderstats
    end
    -- Chạy onPlayerJoin khi sự kiện PlayerAdded được kích hoạt
    Players.PlayerAdded:Connect(onPlayerJoin)

Phần thay đổi màu sắc

Kịch bản sẽ tuần hoàn qua ba màu khác nhau cho phần. Mỗi màu sẽ có một biến để lưu trữ giá trị RGB, một kiểu dữ liệu bao gồm một tập hợp ba số (đỏ, xanh lục, xanh lam) tạo ra màu sắc.

  1. Tạo một phần có tên PointPart với một kịch bản đính kèm có tên PointScript.

  2. Trong PointScript, sử dụng script.Parent để tham chiếu đến phần.


    local pointPart = script.Parent
  3. Tạo các biến để lưu trữ các màu sắc khác nhau. Mỗi biến nên được đặt thành Color3.fromRGB(), mà tạo ra một giá trị màu sắc.

    • Xanh Dương (Một số điểm): (0, 0, 255)
    • Xanh Lá (Nhiều điểm): (0, 255, 0)
    • Đỏ (Mất điểm): (255, 0, 0)

    local pointPart = script.Parent
    -- Màu sắc
    local blue = Color3.fromRGB(0, 0, 255)
    local green = Color3.fromRGB(0, 255, 0)
    local red = Color3.fromRGB(255, 0, 0)
  4. Thêm biến cho một số lượng điểm nhỏ, một số lượng điểm lớn hơn, và một thứ ba để trừ điểm.


    -- Màu sắc
    local blue = Color3.fromRGB(0, 0, 255)
    local green = Color3.fromRGB(0, 255, 0)
    local red = Color3.fromRGB(255, 0, 0)
    -- Giá trị điểm
    local smallPoints = 10
    local largePoints = 50
    local losePoints = 100

Thêm dịch vụ người chơi

Để trao điểm, bạn sẽ cần truy cập thông tin của người chơi được lưu trữ trong Explorer dưới Players, và tách biệt khỏi đối tượng nhân vật. Đây là nơi thông tin như thống kê bảng điểm có thể được tìm thấy.

Bạn có thể làm như vậy bằng cách thêm dịch vụ Players vào kịch bản của bạn. Dịch vụ là các tập hợp thêm các hàm được xây dựng trước bởi các kỹ sư Roblox để giúp bạn tiết kiệm thời gian.

  1. Lấy dịch vụ Players bằng cách gõ:

    local Players = game:GetService("Players")


    -- Giá trị điểm
    local smallPoints = 10
    local largePoints = 50
    local losePoints = 100
    -- Dịch vụ cần thiết
    local Players = game:GetService("Players")

Chức năng và sự kiện

PointsScript sẽ cần hai chức năng. Chức năng đầu tiên sẽ trao và trừ điểm. Chức năng thứ hai sẽ kiểm tra xem một người chơi đã chạm vào phần hay chưa. Những chức năng này sẽ được kết nối với một sự kiện chạm, mà chạy mỗi khi phần đó bị chạm vào.

  1. Tạo một chức năng mới có tên givePoints() và một tham số có tên player. Bên trong, thêm một câu lệnh in để sử dụng cho việc kiểm tra.


    local Players = game:GetService("Players")
    -- Trao hoặc trừ điểm
    local function givePoints(player)
    print("Đang trao điểm cho người chơi")
    end
  2. Dưới đó, tạo một chức năng thứ hai có tên partTouched() với một tham số có tên otherPart.


    -- Trao hoặc trừ điểm
    local function givePoints(player)
    print("Đang trao điểm cho người chơi")
    end
    -- Kiểm tra xem người chơi có chạm vào phần không
    local function partTouched(otherPart)
    end
  3. Bên trong chức năng, sử dụng hàm GetPlayerFromCharacter() để kiểm tra nếu có một người chơi trong biến otherPart.


    -- Kiểm tra xem người chơi có chạm vào phần không
    local function partTouched(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    end
  4. Nếu một người chơi chạm vào phần, nó sẽ được lưu trữ trong biến player. Nếu không, biến sẽ giữ nguyên. Tự làm:

    • Bên trong chức năng, kiểm tra xem người chơi có giá trị hay không. Nếu có, thì gọi givePoints(player).
    • Dưới chức năng, kết nối partTouched() với sự kiện Touched của pointPart.

    -- Kiểm tra xem người chơi có chạm vào phần không
    local function partTouched(otherPart)
    -- Lấy người chơi nếu có người chạm vào phần
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
    givePoints(player)
    end
    end
    pointPart.Touched:Connect(partTouched)
  5. Chạy dự án. Mỗi khi một người chơi chạm vào phần, bạn nên thấy một thông điệp trong cửa sổ Output nói: "Đang trao điểm cho người chơi"

Mẹo Khắc Phục Sự Cố:

  • Kiểm tra rằng "Players" trong game:GetService("Players") được viết hoa và trong dấu ngoặc.
  • partTouched() nên được kết nối với sự kiện Touched của pointPart.

Tạo Màu Sắc Luân Phiên

Để tuần hoàn qua các màu sắc, kịch bản sẽ sử dụng một vòng lặp while mà thay đổi màu của phần mỗi vài giây. Điều kiện cho vòng lặp này sẽ là đúng, vì vậy nó có thể chạy vô hạn.

  1. Ở cuối kịch bản, tạo một vòng lặp while mới nơi điều kiện là đúng, nghĩa là vòng lặp luôn luôn chạy.


    -- Kiểm tra xem người chơi có chạm vào phần không
    local function partTouched(otherPart)
    -- Lấy người chơi nếu có người chạm vào phần
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
    givePoints(player)
    end
    end
    pointPart.Touched:Connect(partTouched)
    -- Luân phiên qua màu sắc
    while true do
    end
  2. Tự làm, lập trình một vòng lặp while true do mà thay đổi pointPart thành các biến màu sắc mà bạn đã tạo. Đừng quên sử dụng task.wait() giữa các màu. Khi hoàn thành, kiểm tra mã của bạn với phiên bản dưới đây.


    -- Luân phiên qua 3 màu, chờ giữa mỗi màu
    while true do
    pointPart.Color = blue
    task.wait(3)
    pointPart.Color = green
    task.wait(2)
    pointPart.Color = red
    task.wait(1)
    end
  3. Kiểm tra chơi và kiểm tra rằng cả ba màu đều luân phiên mà không dừng lại.

Mẹo khắc phục sự cố

Tại thời điểm này, nếu việc luân phiên màu sắc không hoạt động như dự định, hãy thử một trong các cách dưới đây.

  • Kiểm tra rằng vòng lặp while nằm ở cuối kịch bản, dưới sự kiện Touched. Nếu vòng lặp không ở dưới cùng, nó sẽ giữ các phần khác của kịch bản không chạy đúng.
  • Kiểm tra rằng mỗi màu bên trong Color3.fromRGB() được viết chính xác. Phải có ba số từ 0 đến 255 được phân cách bằng dấu phẩy, như (255, 50, 0).

Trao điểm cho người chơi

Người chơi sẽ được trao điểm dựa trên màu sắc hiện tại của phần khi họ chạm vào nó.

Tìm màu sắc hiện tại

Mỗi khi một người chơi chạm vào phần, kịch bản sẽ cần biết màu sắc hiện tại của phần để trao điểm sau này.

  1. Tìm givePoints(). Thay thế thông điệp kiểm tra của bạn bằng một biến cho màu sắc hiện tại của pointPart. Biến này sẽ xác định số điểm mà người chơi nhận được (hoặc mất).


    local function givePoints(player)
    local currentColor = pointPart.Color
    end
  2. Để ảnh hưởng đến điểm của một người chơi, hàm đó cần truy cập vào bảng điểm của người chơi. Tạo một biến để lưu trữ nó.


    local function givePoints(player)
    local currentColor = pointPart.Color
    local playerStats = player:WaitForChild("leaderstats")
    end
  3. Bây giờ thêm một biến để lấy giá trị Points của người chơi, mà là một đứa trẻ trong bảng điểm của họ.


    local function givePoints(player)
    local currentColor = pointPart.Color
    local playerStats = player:WaitForChild("leaderstats")
    local playerPoints = playerStats:WaitForChild("Points")
    end

Trao hoặc trừ điểm

Tiếp theo, bạn sẽ sử dụng if và elseif để trao hoặc trừ điểm tùy thuộc vào màu sắc của phần khi được chạm vào. Nhớ rằng màu xanh trao một số điểm, màu xanh lá trao nhiều điểm và màu đỏ trừ điểm.

  1. Bên trong givePoints(), bên dưới các biến, sử dụng một câu lệnh if để kiểm tra xem màu sắc hiện tại có phải là xanh dương và nếu có thì thêm smallPoints vào giá trị điểm hiện tại của người chơi.


    local function givePoints(player)
    local currentColor = pointPart.Color
    local playerStats = player:WaitForChild("leaderstats")
    local playerPoints = playerStats:WaitForChild("Points")
    if currentColor == blue then
    playerPoints.Value += smallPoints
    end
    end
  2. Để kiểm tra màu xanh lá, thêm một điều kiện else if. Nếu xanh lá, thì thêm biến largePoints vào điểm của người chơi.


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    end
  3. Sử dụng một câu lệnh else để trừ điểm nếu pointsPart không phải là xanh dương và không phải màu xanh lá.


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    else
    playerPoints.Value -= losePoints
    end
  4. Cuối cùng, hủy bỏ phần sau câu lệnh if để script không thể tiếp tục cấp phát điểm.


    if currentColor == blue then
    playerPoints.Value += smallPoints
    elseif currentColor == green then
    playerPoints.Value += largePoints
    else
    playerPoints.Value -= losePoints
    end
    pointPart:Destroy()
  5. Kiểm tra chơi và kiểm tra rằng mỗi màu sắc đều trao điểm như mong đợi. Hãy chắc chắn kiểm tra tất cả ba điều kiện.

Cung cấp phản hồi cho người chơi

PointPart hoạt động, nhưng người chơi có thể không nhận thấy điều gì đã xảy ra trừ khi họ tình cờ nhìn vào bảng điểm của họ. Khắc phục điều đó bằng cách tạo ra các hạt khi PointPart bị hủy.

Việc thêm phản hồi khi người chơi sử dụng một phần, như âm thanh, rung lắc, hoặc các hạt, làm cho các tương tác với các đối tượng trở nên thỏa mãn hơn cho người chơi.

Tạo hiệu ứng hạt

Hiệu ứng hạt sẽ có màu giống như phần khi bị chạm vào. Vì các màu sắc đã được lưu trữ trong các biến, thật dễ dàng để tái sử dụng chúng.

  1. Trong givePoints() ở cuối, tạo một thể hiện ParticleEmitter mới. Đảm bảo tên thể hiện được viết chính xác như đã hiển thị.


    local particle = Instance.new("ParticleEmitter")
    end
  2. ParticleEmitters sử dụng các chuỗi màu để điều khiển thuộc tính Color của chúng. Tạo một ColorSequence mới và truyền vào màu hiện tại của phần.


    -- Hủy bỏ phần
    pointPart:Destroy()
    -- Tạo ra các hạt
    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
  3. Hạt sẽ cần phải được làm cha cho người chơi đã chạm vào nó. Tạo một biến để lấy mô hình nhân vật của người chơi. Sau đó, làm cha cho hạt vào đầu của người chơi.


    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
    local playerCharacter = player.Character
    particle.Parent = playerCharacter:WaitForChild("Head")
  4. Sử dụng task.wait() trong một giây nhanh, sau đó hủy hạt.


    local particle = Instance.new("ParticleEmitter")
    particle.Color = ColorSequence.new(currentColor)
    local playerCharacter = player.Character
    particle.Parent = playerCharacter:WaitForChild("Head")
    task.wait(1)
    particle:Destroy()
  5. Kiểm tra chơi trò chơi và đảm bảo rằng các hạt tạm thời theo chân người chơi sau khi chạm vào mỗi màu sắc.

Mẹo Khắc Phục Sự Cố

Tại thời điểm này, nếu các hạt không hoạt động như mong muốn, hãy thử một trong những cách dưới đây.

  • Đảm bảo khi tạo ra một thể hiện mới rằng ParticleEmitter được viết chính xác như đã hiển thị và bên trong dấu ngoặc.
  • Khi làm cha cho các hạt, hãy đảm bảo sử dụng : giữa playerCharacterWaitForChild() mà không có khoảng trắng giữa.

Hoàn chỉnh PointScript

Một phiên bản hoàn chỉnh của kịch bản có thể được tham khảo bên dưới.


local pointPart = script.Parent
--local storage = game:GetService("ServerStorage")
-- Trao một số điểm
local blue = Color3.fromRGB(0, 0, 255)
-- Trao nhiều điểm
local green = Color3.fromRGB(0, 255, 0)
-- Làm người chơi mất điểm
local red = Color3.fromRGB(255, 0, 0)
-- Điểm trao cho người chơi
local smallPoints = 10
local largePoints = 50
local losePoints = 100
local Players = game:GetService("Players")
local function givePoints(player)
local currentColor = pointPart.Color
local playerStats = player:WaitForChild("leaderstats")
local playerPoints = playerStats:WaitForChild("Points")
-- Trao điểm người chơi dựa trên màu sắc của phần
if currentColor == blue then
playerPoints.Value += smallPoints
elseif currentColor == green then
playerPoints.Value += largePoints
else
playerPoints.Value -= losePoints
end
-- Hủy bỏ phần, chờ một giây, và sau đó hủy bỏ hạt
pointPart:Destroy()
-- Tạo hiệu ứng sparkles và hủy bỏ nó
local playerCharacter = player.Character
local particle = Instance.new("ParticleEmitter")
particle.Color = ColorSequence.new(currentColor)
particle.Parent = playerCharacter:WaitForChild("Head")
task.wait(1)
particle:Destroy()
end
local function partTouched(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
givePoints(player)
end
end
pointPart.Touched:Connect(partTouched)
-- Thay đổi màu sắc của phần dựa trên các biến. Cần nằm ở cuối kịch bản.
while true do
pointPart.Color = blue
task.wait(4)
pointPart.Color = green
task.wait(3)
pointPart.Color = red
task.wait(2)
end
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.