H.Text = 'Sorry but this server is going into private mode. No Gayfreaks Allowed. Thats you Scare! Certain people are getting banned.'


Archive

Many scripts want to run little bits of code at frequent intervals. For example, a script might update the behavior of a zombie. It needs to update conditions repeatedly, like checking the location of the nearest player.

Today, ROBLOX’s Chief Scientist, Erik Cassel, discusses proper use of the wait function.

The Problem

A very common way to do this in ROBLOX is with the handy “wait” statement. Here is an example:

There is one problem with this code. Can you see it? The wait function takes an optional argument, which is the time that the script should sleep. If you don’t supply an argument, then the function will typically return in 0.03 seconds. That means the script is looking for an enemy to attack 30 times a second! The findClosestEnemy function isn’t cheap. It probably needs to iterate over all the players and find the closest one. That might be fine if you have one zombie in your game, but what about a hoard of 50 zombies? Do you really want 50 zombies rethinking who they will attack 30 times a second? That amounts to 1,500 enemy updates per second.

This isn’t a contrived example. I’ve been analyzing laggy games. A large fraction of them are laggy because of scripts that suck up all the compute time.

Let’s think about zombies for a minute. Zombies are stupid. Once a zombie finds an enemy, he is unlikely to change his mind and go after a new enemy for a while. Let’s make a tiny change to our script:

We supplied a reasonable wait time of five seconds. Once the zombie spots a player, it will go after him for five seconds before looking to see if anybody else is closer. Now our 50-zombie game does 10 updates per second, rather than 1,500.

I have found games that try to wait for 0.0000001 seconds. That means they try to run complex operations 10 million times per second. We may have fast computers these days, but not that fast! These kinds of games suffer from terrible lag.

If your game is laggy, check your script performance. In ROBLOX Studio, there is a great Script Performance panel. Look down the Activity column. It will tell you what percentage of your overall time that a script is taking up. Anything greater than 3% should set off alarm bells.

Better Resuming from a Wait

Another thing to keep in mind is that wait is not guaranteed to return in precisely the time interval you requested. Let’s say your game fills up with 1,000 zombies. Even our optimized scripts might take up a lot of time in aggregate. In that case, ROBLOX will decide that it can’t run all the scripts fast enough, and it will automatically wait longer than requested. We do this because ROBLOX needs to run other processes, like networking, physics and rendering. By “throttling” the script code, we can try to avoid lag.

Let’s write a script that gradually changes the time of day. If you put this script in a game you will see the sun gradually rising:
The script asks to wait for one quarter of a second. However, let’s say that your game is temporarily running out of CPU time. In that case ROBLOX will decide to make your script wait longer than 0.25 seconds, and the sun will rise slower! Here is the solution to the problem:

As stated in the documentation, the wait function returns the actual elapsed time. With that bit of information, we can adjust the time of day accordingly. If the elapsed time is longer than 0.25 seconds, then we’ll skip the time of day forward proportionally.

Lag is often preventable. I’ve found that many games are laggy because of runaway scripts that spend valuable compute time on unnecessarily frequent computation. If you use wait correctly, you’ll be on the way to lag-free game building.

Recommended
Quit

10 min

In this guide, we’ll expand on screen images and explore how to make them into buttons that can be used for menus, in-game actions, and much more.

Button Types – Text and Image

There are two types of button objects in Roblox that can be used in your game’s UI design: TextButton|TextButtons and ImageButton|ImageButtons.

Text Button

A TextButton is very similar to a TextLabel, except that a player can activate it with a click. Internally, it also shares many of the same visual properties as a text label — font, background color, stroke color, etc.

Image Button

Similarly, an ImageButton is like an interactive version of the ImageLabel object and it uses a custom image that you upload to Roblox. It also shares most of the same properties as its non-button counterpart.

Adding Buttons to a Screen GUI

Let’s add an ImageButton to the screen and flip it between a normal appearance and a more colorful appearance when a player activates it.

  1. In the Explorer window, find the ScreenGui object.
  2. Insert an ImageButton object.

This will add an empty image button to the corner of the game view.

Upload Images

For this button, we need to upload two custom images — one for the normal appearance of the button when it’s just sitting on the screen, and a second image for when a player activates it (clicks it with their mouse, taps it when playing on their phone, or activates it with their console controller).

You can use these two menu buttons for testing — simply right-click each one and select Save Image As... to save them to a convenient location on your computer.

This time, instead of uploading an image through the Image property of the button, we’ll use the Game Explorer method. This method is useful when you want to upload more than one image at the same time.

  1. If it’s not already open, click Game Explorer from the View tab.
  1. In the window, right-click on Images and select Add Images.
  1. Find the two images on your computer, select both, and confirm that you’d like to upload them.
  2. When finished uploading, you’ll see both new images ready to use in the game!

Set the Normal Image

Setting the normal appearance for the button can be done through the button object.

  1. In the Explorer window, select the new ImageButton object.
  1. In the Image section of the Properties window, click on the Image property.
  1. In the popup window, click on the ImageButtonNormal image asset.
  1. In the Properties window, set BackgroundTransparency to a value of 1 to make the background transparent.
  1. Move the button slightly away from the corner by setting both PositionXOffset and PositionYOffset to around 30.

Attach a Local Script

The final task is to connect a function to the “activated” event of the button. This function will be used to change the appearance of the button to the brighter activated version. In an actual game, it should also be used to perform an action like opening the game’s main menu.

For this button, we’ll use a LocalScript. This is similar to the Script object which you may be familiar with, but a LocalScript is used to perform actions that only relate to a specific player and things happening on that player’s screen, such as detecting their input on the screen or displaying GUI elements (in contrast, a regular Script is used for things that occur in the overall game world and which affect all parts and players in the game).

  1. In the Explorer window, hover over the ImageButton object, click on the circle ⊕ button, and insert a LocalScript. This will create a new local script and show it.
  1. Delete any existing code, then copy and paste in these new lines:

Test the Button

With the local script in place, we can test the button’s behavior. When the game starts, the button should appear in its normal state. Click the button and its appearance should change to the brighter activated state. Another click should then return it to its normal appearance.

Troubleshooting the Button

If the button doesn't work as you expect, check the following:
  1. In addition to the ImageButtonNormal.png file, make sure you uploaded ImageButtonActivated.png.
  2. Confirm that the names of the uploaded images match the names in the script. If you uploaded image files with different names, you'll need to change the script reference names on lines 6 and 9:
    'rbxgameasset://Images/ImageButtonActivated'
    'rbxgameasset://Images/ImageButtonNormal'
  3. Make sure that your local script is a direct child of the ImageButton object.

How it Works

Let’s explore the code in the local script to understand how the button works.

Roblox Texting Simulator How To Quit Droid Teams

  1. The first line just sets a variable button which tells the script what specific object it’s linked to. In this case it’s linked to the image button, the “parent” of the script.
  1. The second line sets a variable toggled which lets us track the current state (appearance) of the button. Because the button begins in the normal state, we set the variable’s value to false.
  1. The next block is a function that will be run when a player activates the button. Inside is a conditional statement. If the variable toggled is false(the button is off), the Image property of the button will be changed to the brighter activated image and the toggled variable will be set to true (meaning the button is on).

Roblox Texting Simulator How To Quit Droid Teamviewer

The fallback condition (else) will be triggered if the button is in the activated state. This condition resets the button to the normal appearance and sets toggled back to false.

Roblox texting simulator how to quit droid teams
  1. The final line connects the button to the function with an GuiButton/Activated|Activated event. This will make the function run whenever the button is activated.

Although there are several different event types which you can connect to buttons, the GuiButton/Activated|Activated event is the most reliable for basic buttons, providing standard button behavior on all platforms from PC to phone/tablet to console.

Great job! As you can see, creating basic buttons in Roblox can be done with either a TextButton or ImageButton object, and hooking up a local script lets you detect basic button activation as well as swap between two images.

Related Articles

Using Images in GUIs