Book Image

Torque 3D Game Development Cookbook

By : DAVID WYAND
Book Image

Torque 3D Game Development Cookbook

By: DAVID WYAND

Overview of this book

Torque 3D is a popular game engine that supports you in every step along the way to making your game a reality. Even with all of the power and tools that Torque 3D provides, finishing a high quality 3D game requires time and knowledge."Torque 3D Game Development Cookbook" is a practical guide that takes you through each of the major steps on the journey to creating your game, while learning a few tricks along the way.The recipes in this book start off with learning some of the finer points about TorqueScript. The book then moves on to each of Torque 3D's subsystems and ends with a variety of game play recipes.The various topics covered include activating level-specific game code and scheduling game events, dragging and dropping items between windows to work with an in-game inventory system, and covering the seams between objects with well placed decals. Some of the advanced topics include writing custom shaders and postFX, using zones to improve rendering performance, and enhancing your game's ambience through sound.Once you are done with Torque 3D Game Development Cookbook you'll be on your way to creating amazing 3D games and gain expert knowledge of Torque 3D.
Table of Contents (17 chapters)
Torque 3D Game Development Cookbook
Credits
About the Author
About the Reviewers
www.PacktPub.com
Preface
Index

Executing a method on a SimSet or SimGroup collection


During game play we may want to call the same method on all the SimObject instances that belong to a SimSet or SimGroup collection. Rather than iterate through each SimObject instance in the collection and execute its method, TorqueScript has a handy one-line shortcut that we'll make use of in this recipe.

Getting ready

We will be adding a new TorqueScript function to a project based on the Torque 3D Full template and try it out using the Empty Terrain level. If you haven't already, use the Torque Project Manager (Project Manager.exe) to create a new project from the Full template. It will be found under the My Projects directory. Then start up your favorite script editor, such as Torsion, and let's get going!

How to do it...

We are going to write a TorqueScript function that will demonstrate how to execute a method on all the SimObject instances in a SimGroup collection as follows:

  1. Open the game/scripts/server/game.cs script file and add the following code to the bottom:

    function executeMethodOnGroup1()
    {
       // Create a SimGroup
       new SimGroup(MyGroup);
       
       // Create some script objects with some properties and
       // add each one to our SimGroup.  Give each a class
       // property so they belong to the same subclass and have
       // access to the same method.
       // The ScriptObject class is just a generic SimObject that
       // we can create in TorqueScript.
       %so = new ScriptObject()
                 {
                    class = "MyClass1";
                    internalName = "name1";
                    myValue1 = "abc";
                 };
       MyGroup.add(%so);
    
       %so = new ScriptObject()
                 {
                    class = "MyClass1";
                    internalName = "name2";
                    myValue1 = "123";
                 };
       MyGroup.add(%so);
    
       %so = new ScriptObject()
                 {
                    class = "MyClass1";
                    internalName = "name3";
                    myValue1 = "a1b2";
                 };
       MyGroup.add(%so);
       
       // Execute our method on all SimObjects in the group.
       // This is the same as iterating through the group
       // and calling object.method() on each of them.
       echo("-- Starting callOnChildren()");
       MyGroup.callOnChildren(outputProperties, "myValue1");   
       echo("-- Finished callOnChildren()");
       
       // Clean up the SimGroup and all of the script obejcts
       MyGroup.delete();
    }
    
    // A method for our custom script class
    function MyClass1::outputProperties(%this, %propertyName)
    {
       // Get the script object's SimObject ID
       %id = %this.getId();
       
       // Get the script object's internal name
       %name = %this.internalName;
       
       // Get the value of the passed-in property name
       %value = %this.getFieldValue(%propertyName);
       
       // Print out to the console
       echo("ScriptObject ID:" @ %id 
            @ "  Name:" @ %name @ "  Value:" @ %value);
    }
  2. Start up our game under the My Projects directory and load the Empty Terrain level. Open the console using the tilde (~) key and enter the following at the bottom of the screen:

    executeMethodOnGroup1();
    

    In the console we will see the following output:

    ==>executeFunctionOnGroup1();
    -- Starting callOnChildren()
    ScriptObject ID:4153  Name:name1  Value:abc
    ScriptObject ID:4154  Name:name2  Value:123
    ScriptObject ID:4155  Name:name3  Value:a1b2
    -- Finished callOnChildren()
    

How it works...

The SimGroup and SimSet callOnChildren() methods automatically step through each child SimObject instance and if the requested method is valid on the object, it is called with the passed-in arguments. The callOnChildren() method has the following form:

SimGroup.callOnChildren( method, args… );

Here, the method parameter is the method to be called on each of the SimObject objects in the collection, and the args… parameter is actually a variable number of arguments that will be passed-in to the method. In our previous example we pass-in one argument, which is the name of the property we wish our method to process.

The callOnChildren() method doesn't just process the child SimObject instances that are part of a SimGroup or SimSet collection, it also traverses any child SimGroup or SimSet collection, and executes the method on their SimObject instances.

There's more...

If we want to call a method only on all the SimObject objects that are the immediate children of a SimGroup or SimSet collection and not traverse through the hierarchy of the collection, we can use the callOnChildrenNoRecurse() method. It has the same form as callOnChildren() as follows:

SimGroup.callOnChildrenNoRecurse( method, args… );

We could modify the method call of the SimGroup collection from our previous example and replace it with callOnchildrenNoRecurse() as follows:

MyGroup.callOnChildrenNoRecurse(outputProperties, "myValue1"); 

With our particular example, we end up with the same output to the console, as there are no child SimGroup or SimSet objects that would be skipped by using callOnChildrenNoRecurse().

See also

  • Iterating on objects in a SimSet or SimGroup collection

  • Getting a random object from a SimSet or SimGroup collection

  • Finding an object in a SimSet or SimGroup collection using its internal name