Menu
CoddyTech

הסחרור

שיעור 5 מתוך 18 בקורס משחק Roblox: מגדל אינסופי של Coddy.

בשלב Spinner יש זרוע אדומה שמסתובבת לאורך המעבר. זהו Model, שמתויג ב־Spinner, והציר שלו נמצא במרכזו. סיבוב כל ה־Model מעט בכל פריים גורם לו להסתובב.

RunService.Heartbeat מופעל פעם אחת בכל פריים ומעביר את dt, הזמן בשניות מאז הפריים האחרון (בערך 1/60). סיבוב בזווית speed * dt בכל פריים מצטבר ל־speed בכל שנייה, לא משנה כמה מהר המשחק רץ.

CFrame הוא מיקום בתוספת סיבוב. הכפלה ב־CFrame.Angles מסובבת אותו, והזוויות הן ברדיאנים, לכן יש להמיר מעלות באמצעות math.rad:

spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))

CollectionService:GetTagged("Spinner") מציג את כל הפריטים שנושאים את התג, כולל התבניות ב־ServerStorage, לכן יש לסובב רק את אלה שנמצאים ב־workspace. הזרוע מתויגת ב־Kill, כך שהיא כבר מסיימת חיים. בשיעור הזה כל שלב הוא Spinner.

challenge icon

אתגר

בינוני
  1. בחלק העליון, קבלו את CollectionService ואת RunService באמצעות game:GetService.
  2. חברו את RunService.Heartbeat. בכל פריים, עבור כל Model שמתויג ב-Spinner ונמצא ב-workspace, סובבו אותו באמצעות CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0).

לחצו על Play ותזמנו את הריצה שלכם כדי לעבור ליד הזרוע, או קפצו מעליה. לאחר מכן לחצו על Check.

נסו בעצמכם

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- כל שחקן מקבל Wins בלוח המובילים
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Parent = leaderstats
end)

-- כל דבר עם התג Kill מסיים חיים
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- הפעל את כל המכשולים בשלב לפי התגים שלהם
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- שלב כלשהו, באקראי
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- הצב עותק של מודל בראש המגדל; מחזיר את העותק ואת הגובה החדש של ראש המגדל
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- בנה מגדל אקראי חדש מלמטה למעלה
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
end

buildTower()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Roblox: מגדל אינסופי