- Download the template package from itch.io.
- Import it into your GameMaker project (via Tools ➜ Import Local Package or by dragging the
.yympsinto the IDE). - There has been a case where this gives you the error message:
Cannot find function to change GMAudioGroup version from v1 to v0If it does, go to tools ➜ project tool and manually convert it there. - Once imported, change the starting room to
rSetup. It will run the initializing scripts before jumping over torDesktop.
Computer Simulation Template
This is a guide for installing and using the Computer Simulation Template in your own GameMaker projects. Created by Deklaration.
The template mimics a computer desktop environment with draggable windows, resizable folders, scrollbars, and interactive software.
You can purchase the asset from itch.io.
- While the global variable
global.demois set totrue, the demo will be active. Run the game and play with the functions. - There are two folders and a few icons with different features. There is also an icon called
Settingswhere you can adjust the shader. - When you are ready to create your own game, go into the create code in
rInitand switchglobal.demotofalse.
- To create a new icon in your game, copy the
oBase_iconobject and give it your own name. - Assign it a suitable sprite. I use FatalBlend's wonderful icon pack in this template.
- Go to the
Create eventto find thescrCreateIcon()function scrCreateIcon()will be filled with arguments for you to swap out.- This is how it should look:
scrIconCreate(name, nextwindow, 0, 0, folder, global.array) Name: argument0. Give it a string to display below the icon. It could be something like "My Computer" or "Secrets".Nextwindow: argument1. Replace this with the object index of the window you want this icon to open.0: argument2. If you want the window to open somewhere else than on top of the icon, you can change this X value. Swap it toroom_width/2to open it in the middle of the room.0: argument3. This is the same as argument2, but for the Y value. Swap it withroom_height/2to open it in the middle of the room, vertically.folder: argument4. Is this a folder? If the window it opens will contain other icons, swap this totrue. Otherwise, change this tofalseglobal.nameArray: argument5. If this is NOT a folder, you can just swap this to 0. It doesn't need an array. If it IS a folder, you have to change this to a global array that you will setup in a second, in the scriptscrSetupYourFoldersHere. This array will contain the objects the window will create when opened. Give it a readable name, such asglobal.nameArray. For exampleglobal.gameArray- If you want the icon to be placed on the desktop, create it in rDesktops
Creation code - Give the icon these structs:
{newparent : oDesktop,parentwindow : oDesktop, oldparentwindow : oDesktop} - These are given to all icons from their windows, but since the Desktop doesn't have a window - we'll just add them here.
- For example:
instance_create_depth(96,64,global.depth,oFolder_icon,{newparent : oDesktop,parentwindow : oDesktop, oldparentwindow : oDesktop})
- To create a new window in your game, make sure you have an icon. See
Creating an Iconfor more info. - Go into the script
scrSetupYourFoldersHereand follow the instructions. - In
Setup()you will need to create a 2D array for the icons you want to be included in the folder. Use the global variable you used while creating your icon, then add three values to the array for each of your icons. Example:global.games[0] = [oGames_icon,75,120]Begin with 0 and add one for each icon. The first (oGames_icon) value in the array should be the icon you want to create. The second (75) is the X position of the icon within the folder window, and the third (120) is the Y position. - Then, create another array for your folder window. Every folder should be included here. Example:
global.windows[0] = [oFolder_window,global.nameArray]where the first value (oFolder_window) should be the object index of your window. SeeCreating a WindowThe second value (global.nameArray) should be the array you just created. - Add to this array for each folder you create.
- There are examples you can follow inside of the script, to make it easier. But basically, you want it to look something like this:
global.games[0] = [oTyping_icon,55,25]global.games[1] = [oPong_icon,151,25]global.windows[0] = [oGames_window,global.games]
- To create a new window in your game, copy the
oBase_windowobject and rename it. - Now, go to the
Create eventand look at the function there.scrWindowsCreate(icon,folder,resizable)Change the arguments in this function to create your window. icon: argument0. You will display a small icon in the top left of your window. In most cases, this is the same sprite as the icon object that created this window. Such as,sGame_iconfolder: argument1. If this is a folder and will contain other icons, change this totrue, otherwise tofalseresizable: argument2. Should the player be able to resize the window? If so, change this totrue. If you don't want the player to change the window size, change this tofalse.
- This is the part where you can get creative. Every Computer Simulation game is based on software. In Her Story, it's the video bank. In Atomograd, it's the translator software. In After Hours, it's the email. So on, and so on. When the
scrWindowCreatefunction is set, you can build your own software using this window. Add your own sprite and implement whatever functionality you’d like. You can build games within the window. Calculators, chat programs or whatever you feel like! The template includes a game of Pong and a calculator to show you how it works. This is where you make the game your own. - However, there are a few things to keep in mind:
- Make sure to draw the content using the
Draw eventwithin the window. If you're usingDraw End event, there might be some depth issues. - If you add clickable objects in the software, you need to make them compatible with
scrTopInstanceThat way it's not clickable if it's covered by something. Give every clickable object in the softwareoClickParentas its parent.scrTopInstancechecks for each instance ofoClickParentto see which object is closest to the player, and only activates that one. - It is activated by turning the variable
clickedtrue. So, you need to add this variable to the object in itsCreate eventand use it however you'd like. For example: if clicked = true { print_message("Hello world!"); clicked = false; }- Remember to turn
clickedto false again when you're done with it. This can be done either like the example above, or in aEnd step eventSee the Calculator object in the template for a more in-depth example.
- If you want to include a typing software, either for authenticity, puzzles or note taking, this is easily done. Copy
oBase_typing_windowobject and rename it. - Go into the create event to find two functions. Look at
scrWindowsCreate(icon,false,resizable) - Choose the icon you wish to draw in the top left corner of the window as
argument0and if you want the window to be resizable or not inargument2 - Leave
argument1asfalse - Now look at the second function:
scrTypingCreate - First, choose the text you wish to display in the window from the start, as
argument0If you wish to have it empty, change it to"" - And in
argument1choose if you want the window to have scroll bars. Eithertrueorfalse - Go to the
Draw eventand look at the second function there, calledscrTypingDraw() - Choose where you want the text to be drawn in your window. Its origin point is the top left corner of the surface inside the window.
argument0is the X position andargument1is the Y position.argument2is the color of your text. - It's possible to use this window in a puzzle, where the player has to type out a certain word and press enter to continue. Go and take a look at
Key Press - Enterif this sounds interesting. - Right now, it will look for the password
THE PASSWORDor a variant of this password (say "THEPASSWORD"), and then add text to the window. You do not have to use any of this, of course.
- To create a new password protected window in your game, copy the
oBase_password_windowobject and rename it. - Go into the create event to find two functions. Look at
scrWindowsCreate(icon,false,false) - Choose the icon you wish to draw in the top left corner of the window as
argument0 - Leave
argument1andargument2asfalse - Now look at the second function:
scrTypingCreate - First, choose the text you wish to display as the password from the start, as
argument0If you wish to have it empty, change it to"" - And in
argument1choose if you want the window to have scroll bars. This should be left onfalse - Now, there are two variables here you need to take a look at.
nextwindowandpassword - Change
nextwindowto the index of the window you want this to open, if the player enters the correct password. - Then change
passwordto the password you wish the player to enter. Leaveclickedandtypeastrue - Now, look at the
Draw eventHere you can change where you want the players input to be drawn, and the prompt to enter the password. - Finally, look at
Key Press - Enterto see what happens when the player inputs a password. If the password is correct, the new window is created, a happy sound plays and this window is destroyed. - If you wish the game to remember if the player has already entered the correct password, just create a global variable and set it to true. Then add something like
|| global.variable = trueafterif string_pos(password,lowercasetext)to let the player jump right tonextwindow
- Folders and windows are resizable if their
resizablevariable is set totrue. This is done through the window'sCreate event - The window will clamp size and prevent shrinking below a certain size and getting too big. If a folder window gets wider than
image_xscale = 4icons may have issues being placed inside of it - There are three objects that handle resizing.
oResizeWindowBottomoResizeWindowCornerandoResizeWindowSide - They function the same way, but change different values in their parent window. The mouse updates its cursor when hovering over these. You can change this in the
oMouseobject.
- There are two scroll bars, one controlling the x position of surface inside its parent window, and one controlling the y position.
- The player can drag the handle, or roll the mouse wheel while hovering over the bar, to maneuver it.
- A CRT shader is included in the template. Change its settings using the
oShaderSettingsobject, or within the game by opening theSettingsprogram. - Noise: The noise grain. 0.0 - 0.2 is recommended
- Color tint: Change the color tint of the game, using RGB values. Max everything for no tint. Drag everything to 0 to get a fully black screen. This will make the game difficult to see.
- Bending: Change the bending of the screen, to make it look like it's being played on an old CRT monitor. 0.0 - 0.3 is recommended.
- Framesprite: Display a monitor as a frame around the screen. This will also adjust
bend_strength - Scan lines: Lines going over the screen, to mimic a CRT monitor. 0.0 - 0.5 is recommended.
- Frame_thickness: A frame around the screen. This is something I experimented with, and didn't like the result of. But, I kept it in the demo anyway. 0.0 is recommended.
- The game is drawn onto the shader. Feel free to disable this in the
Draw GUIevent, within theoShaderSettingsobject.
- You can find the settings in the
oSettings_iconon the desktop, while in-game. - Background: Change the background from a wallpaper to a flat color.
- Text box: If you want a rectangle around the text under the icons on the desktop.
- Text color: Color of the text of the icons on the desktop.
c_whiteorc_blackThis also changes the color of the text boxes, if you have them activated. - Shader: CRT shader on or off
- Frame counter: Display a frame counter in the top right corner. Using both fps and fps real