Your first game
In this guide, we'll walk you through the process of creating a basic game scenario using Upside Engine, a framework for Roblox 2d game development.
Tip
In this guide we are going to use Offset, scale should never be used for a 2D game, as it is problematic on some devices, it is recommended that when building your game you use 1920x1080 resolution in the device emulator as it will adapt to most devices.
Step 1: Setting up the scene¶
The first thing we need to do is to create a scenario for our game. To do this, we'll use the Scene
object, which is a useful tool for creating scenarios quickly and easily.
In your init.client.luau
script, add the following code:
local replicatedStorage = game:GetService("ReplicatedStorage")
local tweenService = game:GetService("TweenService")
local players = game:GetService("Players")
local packages = replicatedStorage.packages
local playerGui = players.LocalPlayer:WaitForChild("PlayerGui")
local upsideEngine = require(packages.UpsideEngine)
local screen = Instance.new("ScreenGui")
screen.Name = "MyGame"
screen.IgnoreGuiInset = true
screen.Parent = playerGui
local scene = upsideEngine.new("Scene")
scene.Instance.Parent = screen
scene:SetName("MyFirstScene") -- We set the scene name
scene:Enable() -- We mark as enabled the scene
Step 2: Creating the floor¶
Now that we have our scene set up, we can create a floor for our game. To do this, we'll use the PhysicalObject object.
local leftFloor = upsideEngine.new("PhysicalObject")
leftFloor.Anchored = true
leftFloor:SetScene(scene)
local lfInstance = leftFloor.Instance
lfInstance.Image = "rbxassetid://12980969571" -- We set the floor texture
lfInstance.Size = UDim2.fromOffset(600, 160) -- We set the size to 600x160 pixels
lfInstance.Position = UDim2.fromOffset(300, 1000) -- We set the position to 300x1000 pixels
local rightFloor = upsideEngine.new("PhysicalObject") -- We create the floor and pass the scene as the parent object
rightFloor.Anchored = true
rightFloor:SetScene(scene)
local rfInstance = rightFloor.Instance
rfInstance.Image = "rbxassetid://12980969571" -- We set the floor texture
rfInstance.Size = UDim2.fromOffset(600, 160) -- We set the size to 600x160 pixels
rfInstance.Position = UDim2.fromOffset(1620, 1000) -- We set the position to 1620x1000 pixels
Step 3: Creating a background¶
Next, let's add a background to our game. This time we'll use another PhysicalObject object, but we'll set it up a little differently.
local background = Instance.new("Frame")
background.BackgroundTransparency = 0 -- We set the background transparency
background.BackgroundColor3 = Color3.fromRGB(27, 62, 82)
background.Size = UDim2.fromScale(1, 1) -- We set the size to the target screen size
background.Position = UDim2.fromOffset(0.5, 0.5) -- We set the position to the center
background.ZIndex = -1
background.Parent = scene.Instance.Parent
Step 4: Adding decoration¶
Next, let's add a the decoration to our game. This time we'll use another PhysicalObject object, but we'll set it up a little differently.
local decoration = upsideEngine.new("PhysicalObject") -- We create the decoration and pass the scene as the parent object
decoration.TrackCollisions = false
decoration:SetScene(scene)
local decInstance = decoration.Instance
decInstance.Image = "rbxassetid://12993235175" -- We set the decoration texture
decInstance.Size = UDim2.fromOffset(1920, 1080) -- We set the size to the target screen size
decInstance.Position = UDim2.fromOffset(960, 540) -- We set the position to the center
decInstance.ZIndex = 0
Step 5: Creating platforms¶
Finally, let's create some interactive platforms for our game, we will create a platform that falls once it detects a collision.
-- Create platform object and set properties
local function createPlatform(x, y)
local position = UDim2.fromOffset(x, y)
local platform = upsideEngine.new("PhysicalObject")
platform:SetScene(scene)
platform.Mass = 0
platform.Anchored = false
local platInstance = platform.Instance
platInstance.Image = "rbxassetid://12979703349"
platInstance.Size = UDim2.fromOffset(250, 80)
platInstance.Position = position
platInstance.ZIndex = 2
-- Create Tween to animate platform to its original position on collision
local info = TweenInfo.new(1)
local goal = { Position = position }
local toOrigin = tweenService:Create(platform.Instance, info, goal)
local falling = false
toOrigin.Completed:Connect(function()
falling = false
end)
-- Listen to the "Collision" event
platform:On("Collision", function(object) -- Create a function to detect when the plaform collides
if not object:IsA("Character") or falling then
return
end
task.wait(1)
falling = true
platform.Mass = 200
task.wait(5)
platform.Mass = 0
platform.Force = Vector2.zero
toOrigin:Play()
end)
end
createPlatform(800, 900)
createPlatform(1120, 900)
for _, scr in script:GetChildren() do
require(scr) --Initializate the secondary scripts
end