Академический Документы
Профессиональный Документы
Культура Документы
Letter to Educators
Letter to Educators:
Letter to Educators
To provide feedback on the educational materials, contact
Dexter Chow at dexterchow@garagegames.com or post at
http://www.garagegames.com/community/forums/34. Dexter
Chow is the lead writer and is a former game design instructor
at the Art Institute. He is currently on the advisory committees
of the Art Institute and International Academy of Design and
Technology.
All documentation and educational materials associated with
Torque 3D 1.2 are free to use, modify, and distribute. Educators
are encouraged to use these educational materials for their
own classes.
GarageGames Associates
Become a GarageGames Associate if youre an educator who
wants to:
Assist in the development of curriculum materials.
Get an advanced peek at upcoming education initiatives.
Help steer future game pedagogies and curricula.
You can also direct students to search on the internet for third-
party tutorials and videos about Torque products.
Class 1
Class 1
Introduction to Game
Development: Lecture
1. Introduction to the Course
Teacher and class overview
Class administration
Syllabus review
Teacher and student introductions
What are class expectations?
Introduction to Game
Development: Lecture
3. How will students be graded?
Midterm and Final Tests 25%
Homework and Quizzes 25%
Labs and Final Project 25%
Participation and Presentations 25%
Class Materials:
What is This Class About?
Game Design Level Design
Class 1
Class Materials:
What is This Class About?
Art Scripting and Programming
Class 1
Class Materials:
Introduction Torque 3D
Class 1
Introduction to Game
Development: Conclusion
1. Lab:
Do a one-page description of a favorite game and a
memorable moment in that game
2. Presentation:
Take 5 minutes to describe your game and memorable
moment
Tell the class what you want to accomplish in taking
this class and in future game classes
3. Homework:
Read Lesson 1 and review class materials including
the Class Syllabus
Class 2
Class 2
Class Materials:
Jobs in the Games Industry
Programming and Art
Class 2
Class Materials:
Jobs in the Games Industry
Design
Class 2
Class Materials:
Game and Level Design
Class 2
Class Materials:
3D Technology Resources
Class 2
3. Quiz: Lesson 1
Developing an FPS in a 3D
World: Lecture
1. Basics of World Building in 3D
Cover Terminology while pointing out features of
the editor including scripting, datablocks, spawn
points, geometry and materials
Show characters and talk about collision, animation
and the differences between properties and
datablocks
Show weapon fire and weapon changes, describe
the concept of properties attached to objects
Class 3
Camera Features
Changing Views 1st and 3rd Free and Orbit
Class 3
Defensive Cover
Class 3
Choke Point
Class 3
Sniper Point
Class 3
Add Dumpster
Class 3
Developing an FPS in a 3D
World: Conclusion
1. Lab:
Create a checklist of items for the team to complete the
examples in the lab
Lab work will be verified. For example, the dumpster
must been added on each students computer
2. Quiz: Lesson 2
Documentation: Keyword
Search
Class 4
Datablock Editor
Copy Existing
Data and Set
Data
Properties
Class 4
Shape Editor
Modify Your
Character Model
and Set Nodes
Class 4
Changing Models
Gideon Changing Materials
Class 4
Quiz: Lesson 4
Midterm
1. Lecture (part 1): Recap the first half of the course
Torsion
TorqueScript
TorqueScript is the
name of the scripting
language used by the
Torque game engines.
A scripting language is
like a programming
language, but a
scripting language is
easier to use.
Class 6
Functions
$appName
$appName == FPS
FPS Tutorial;
Tutorial;
Canvas.setWindowTitle(getEngineName()@-@
Canvas.setWindowTitle(getEngineName()@-@ $appName);
$appName);
Variables
Global variable A value that you will want
to access from any script file or any function.
To identify a variable as a global variable, put
a dollar sign ($) in front of the variable name.
Local variable A value that you will want to
access only in the scope of where the variable
was created. To identify a variable as a local
variable, put a percent sign (%) in front of the
variable name.
Class 7
Important Scripting
Standards
The echo() function is one of the logging
functions that you can use to print
information to the console window
Semi-colons in script are the equivalent of a
period in a sentence: they end the
instruction. Every instruction in TorqueScript
must end in a semi-colon
Double slashes tell the game engine to ignore
the text that comes after the slashes on the same
line. This is how you add comments to your code
Class 7
Exec()
The exec() function is used to tell the game engine about
other script files.
exec(core/parseArgs.cs);
Breakpoints
Click in the grey area to the left of the line number to
identify this line as a breakpoint.
Class 7
Stepping
Line 68 is a call to the defaultParseArgs() function.
Press F11 to step into the function.
Class 7
Stepping
The core/parseArgs.cs file opens and the yellow
arrow stops at the first line being executed in the
function definition.
Class 7
Echo()
The echo() function is one of the logging functions
that prints information to the console window.
Class 7
//
// Load
Load the
the functions
functions in
in the
the myScriptingTests.cs
myScriptingTests.cs file.
file.
//
// Remove
Remove this
this script
script later.
later.
exec("./myScriptingTests.cs");
exec("./myScriptingTests.cs");
echo("
echo(" -----
----- myScriptingTests.cs
myScriptingTests.cs file
file was
was
executed!
executed! -----
----- ");
");
Class 7
When the game window appears, press the tilde key (~)
to open the console window, and look for the string that
you passed in the echo() function.
Class 7
function
function testArgs(%myString)
testArgs(%myString)
{{
echo(">>>>>
echo(">>>>> myString
myString == "" SPC
SPC %myString
%myString SPC
SPC
"<<<<<");
"<<<<<");
}}
Class 7
testArgs(Hello);
testArgs(Hello);
Class 7
for
for (%count
(%count =
= 0;
0; %count
%count <
< %myNumber;
%myNumber;
%count++)
%count++)
for
for (%count
(%count =
= %myNumber;
%myNumber; %count
%count >
> 0;
0;
%count--)
%count--)
Class 7
testForLoop(5)
testForLoop(5)
;;
Class 7
Arrays
Arrays are variables that are used to store a set of values
of the same type (number, string, Boolean, and so on). To
access one of the values in the set, you use its index
number.
Class 7
function
function testArray()
testArray()
{{
//
// Create
Create the
the array.
array.
$dummyText[0]
$dummyText[0] == "Lorum";
"Lorum";
$dummyText[1]
$dummyText[1] == "ipsum";
"ipsum";
$dummyText[2]
$dummyText[2] == "dolor";
"dolor";
$dummyText[3]
$dummyText[3] == "sit";
"sit";
$dummyText[4]
$dummyText[4] == "amet";
"amet";
//
// Print
Print out
out the
the array.
array.
for
for (%count
(%count == 0;
0; %count
%count << 5;
5; %count++)
%count++)
{{
Class 7
testArray();
testArray();
Class 7
While Loop
function
function testWhile(%myNumber)
testWhile(%myNumber)
{{
while
while (%myNumber
(%myNumber << 10)
10)
{{
echo("%myNumber
echo("%myNumber ="
=" SPC
SPC %myNumber);
%myNumber);
//
// Remember
Remember to
to make
make whatever
whatever change
change necessary
necessary
//
// to
to update
update the
the counter
counter variable!
variable!
%myNumber++;
%myNumber++;
}}
}}
Class 7
Scripting Part 2:
Conclusion
Lab: Lab: Have the class run through the homework
1.
exercises
Test For Loop, Array, While, Streetlight, etc.
Step through Lesson 3 as a group and set breakpoints,
create/load in scripts, echo data, concatenate data, for loop,
++ to add 1, array, while loop, control statements, nested
loops, if then, getClassName, If Then, Switch and Brightness
Datablocks
A datablock is a set of properties that can be attached to an object.
Datablocks are a convenient way to set the same properties on
multiple objects of the same type. Additionally, datablocks only
contain properties that will not be modified during a game. This
means that the game engine can download datablocks once, before
your game starts, and then never need to download them again,
which saves network bandwidth during gameplay. In contrast,
properties that are expected to change during gameplay are set
directly on objects. Datablocks are like a suitcase that you travel
with, that arrives at your destination before you do.
For more information about datablocks, see Datablock Editor in the
online documentation. You also learned about datablocks in the
character lesson. In this lesson, the triggers datablock object is the
one that contains the callback function you will use.
Class 8
Datablocks
The panels on the right side of the World Editor change to
the Datablock Library and the Datablock properties
panels.
Class 8
Scripting Part 3:
Conclusion
Lab: Lesson 3 Part 3
1.
Follow the steps in exercise 3 to set up the trigger.
Follow the steps in exercise 4 to change the code
and place a boulder in the trigger.
Follow the steps in exercise 6 to see how you can
use Torsion to fool the game engine into thinking
there is more than one object in the trigger.
Shape Editor
Open the Shape Editor Load Soldier Model
Class 9
Shape Editor
Load Arms Load Weapon
Class 9
Key Terminology
EnvironmentAmbientLight is the lighting
inside of the Shape Editor. The bn_Gun_Root
node is the top node for the Weapon
mountPoint is where the weapon mounts to
the player so that they appear to be holding the
weapon
RetractionPoint is a combination of collision
and force. If the retraction point collides with an
object, it will retract the direction of movement
Muzzlepoint is the area of the muzzle where
the muzzle flash effect will occur
Class 9
Key Terminology
Ejectpoint is the node where the shell
casing will be ejected after firing
MuzzleFlash_LOD300 is the reference
point for a further muzzle flash on the
soldier gun at a specific level of detail
(LOD)
The Eye node is the default camera
placement for the eye in first-person
The Bip001 nodes are the biped nodes
that correspond with the soldiers skeleton
Class 9
Weapon Sounds
Inthe
Datablock
Library, select
the New tab
and scroll down
to SFXProfile
Class 9
Weapon Sounds
Create New Datablock
dialog
Name your new datablock
RyderFireSound
Select
WeaponTemplateFireSo
und in the Copy values
from dropdown
Press Create
Class 9
Weapon Sounds
Create another SFXProfile and name it
RyderReloadSound
Assign
art/sound/weapons/wpn_ryder_reload.wav to the
fileName property
Create a third SFXProfile and name it
RyderSwitchinSound
Use the WeaponTemplateSwitchinSound from
the Copy values from dropdown
Assign
art/sound/weapons/wpn_ryder_switchin.wav for
the sound file
Class 9
Ammunition
In the New tab of the
Datablock Library double-click
on ItemData to make a new
datablock
Name it RyderClip
Select WeaponTemplateAmmo
from the Copy values from
dropdown and press Create
Scroll down to the Render
section and click the browse
button ( ) next to the
shapeFile property
Class 9
Ammunition
Scroll down to the Render
section and click the browse
button ( ) next to the
shapeFile property.
Find
art/shapes/weapons/
Ryder/TP_Ryder.DAE
and click Open . Ensure
you have the file type
set to COLLADA Files
in the file browser.
Class 9
Ammunition
Scroll down to the
Scripting section
Set the category to
AmmoClip by clicking
in the box to the right
of category and typing
in 'AmmoClip'
In the Object section
set the class to
AmmoClip (it is case
sensitive you must use
a capital A and capital
C)
Class 9
Ammunition
Scroll down to the Dynamic
Fields section and set
maxInventory to 10
Click the Add Dynamic Field
button ( ) to add a new field.
Name it pickUpName and
set the value to Ryder clip
Add another field called
count and set the value to 1
Class 9
Ammunition
In the Datablock
Library on the New
tab, find ItemData and
double-click it to make
another new ItemData
datablock
Name it RyderAmmo
Select
WeaponTemplateAm
mo from the Copy
values from dropdown
Class 9
Ammunition
In the Dynamic Fields
section set the
maxInventory Dynamic
Field to 8
Click the Add Dynamic
Field button ( ) to add a
new field
Name it clip and set the
value to RyderClip.
Create a Dynamic Field
called pickUpName and
set the value to Ryder
ammo
Class 9
Weapon
The type of datablock here is
ItemData again since it is an item.
This time, though, instead of an
ammunition item (picking up a clip in
the world, for example), it will be for
the handgun itself.
Weapon
On the New tab of the Datablock
Library, double-click the ItemData
entry to create a new datablock
Name it Ryder
Select WeaponTemplateItem from
the Copy values from dropdown
Scroll down to the Render section
and browse to
art/shapes/weapons/ryder/TP_Ry
der.DAE for the shapeFile property
Make sure that the file type filter is
set to COLLADA Files in the Open
file dialog
Click Open
Class 9
Weapon
Scroll down to the Dynamic Fields
section
Set the description to Ryder
Set image to RyderWeaponImage
Set pickUpName to Ryder pistol
Click the Add Dynamic Field button (
), name the new field PreviewImage,
and set the value to ryder.png
If you pop back into Torsion and peek
at your
art/datablocks/managedDatablock
s.cs file you'll see that it has
continued to keep pace with your work
Class 9
datablock
datablock ItemData(Ryder
ItemData(Ryder :: WeaponTemplateItem)
WeaponTemplateItem)
{{
shapeFile
shapeFile ==
"art/shapes/weapons/Ryder/TP_Ryder.DAE";
"art/shapes/weapons/Ryder/TP_Ryder.DAE";
cameraMaxDist
cameraMaxDist == "0.305344";
"0.305344";
category
category == "Weapon";
"Weapon";
class
class == "Weapon";
"Weapon";
pickUpName
pickUpName == "Ryder
"Ryder pistol";
pistol";
emap
emap == "1";
"1";
image
image == "RyderWeaponImage";
"RyderWeaponImage";
Reticle
Reticle == "crossHair";
"crossHair";
PreviewImage
PreviewImage == "ryder.png";
"ryder.png";
description
description == "Ryder";
"Ryder"; (dont
(dont forget
forget };
}; ))
Class 9
Scroll down to
stateSound and select
RyderSwitchinSound
from the dropdown list
of available
SFXProfiles
Class 9
Scroll to the
stateSound and
stateEmitter properties
Select RyderFireSound
for the stateSound
Select
GunFireSmokeEmitter
for the stateEmitter
property
Class 9
Scroll
down to the
stateSound
property and select
RyderReloadSou
nd from the
dropdown list
Class 9
datablock
datablock ShapeBaseImageData(RyderWeaponImage
ShapeBaseImageData(RyderWeaponImage ::
WeaponTemplateImage)
WeaponTemplateImage)
{{
emap
emap == "1";
"1";
shapeFile
shapeFile ==
"art/shapes/weapons/Ryder/TP_Ryder.DAE";
"art/shapes/weapons/Ryder/TP_Ryder.DAE";
shapeFileFP
shapeFileFP ==
"art/shapes/weapons/Ryder/FP_Ryder.DAE";
"art/shapes/weapons/Ryder/FP_Ryder.DAE";
animateOnServer
animateOnServer == "1";
"1";
projectile
projectile == BulletProjectile;
BulletProjectile;
projectileType
projectileType == Projectile;
Projectile;
lightType
lightType == "WeaponFireLight";
"WeaponFireLight";
lightColor
lightColor == "0.992126
"0.992126 0.992126
0.992126 0.740157
0.740157 1";
1";
ammo
ammo == "RyderAmmo";
"RyderAmmo";
Item
Item == "Ryder";
"Ryder";
Class 9
shellExitDir
shellExitDir == "1
"1 0.3
0.3 1";
1";
shellExitVariance
shellExitVariance == "15";
"15";
shellVelocity
shellVelocity =
= "3";
"3";
shellExitOffset
shellExitOffset =
= "0.15
"0.15 -0.56
-0.56 -0.1";
-0.1";
clip
clip =
= "RyderClip";
"RyderClip";
projectileSpread
projectileSpread == "0.005";
"0.005";
stateSound[5]
stateSound[5] = = "RyderFireSound";
"RyderFireSound";
stateSound[1]
stateSound[1] = =
"RyderSwitchinSound";
"RyderSwitchinSound";
stateSound[9]
stateSound[9] = =
"RyderReloadSound";
"RyderReloadSound";
imageAnimPrefix
imageAnimPrefix = = "Pistol";
"Pistol";
imageAnimPrefixFP
imageAnimPrefixFP = = "Pistol";
"Pistol";
useEyeNode
useEyeNode = = "1";
"1";
};
};
Class 9
Using a Weapon
Datablocks are
controlled by the
server side and are
created at server
start, so you can't
actually test any of
this in the game until
you restart it. Save
the level and then quit
the World Editor
Class 9
In order to get your new weapon set up so that the player can
actually equip and use it you'll need to edit two script files:
art/datablocks/player.cs and scripts/server/gameCore.cs.
You can edit these files in Torsion or another text editor.
//
// Allowable
Allowable Inventory
Inventory Items
Items
Class 9
mainWeapon
mainWeapon == Lurker;
Lurker;
maxInv[Lurker]
maxInv[Lurker] =
= 1;
1;
maxInv[LurkerClip]
maxInv[LurkerClip] =
= 20;
20;
maxInv[LurkerGrenadeLauncher]
maxInv[LurkerGrenadeLauncher] = =
1;
1;
maxInv[LurkerGrenadeAmmo]
maxInv[LurkerGrenadeAmmo] = = 20;
20;
maxInv[DeployableTurret]
maxInv[DeployableTurret] == 5;
5;
maxInv[ProxMine]
maxInv[ProxMine] == 5;
5;
Class 9
maxInv[Ryder]
maxInv[Ryder] == 1;
1;
maxInv[RyderClip]
maxInv[RyderClip] == 10;
10;
State Machine
Class 9
State Machine
The first thing to notice about the way the state system
works is that each action is represented by a number in
square brackets [ ]
These need to stay consistent with the states that you
are creating so that Torque 3D can figure out how you
need the weapon to perform
After the stateName field, each state section has
several stateTransition fields to account for various
conditions. This allows us to design our system to
transition to other states based on these conditions.
Farther down there are several fields that dictate various
effects of the state such as stateEnergyDrain for
things like laser weapons, or stateEjectShell to indicate
that this state should cause the weapon to eject a shell
casing
Class 9
2. Quiz: Lesson 5
Synchronization
Synchronization such as this is built into Torque 3D
games. However, when you start adding custom gameplay
features to your game, you might also need to add custom
synchronization for those features
Client/Server
When multiple players are playing the same mission in a Torque
3D game, each player sees the same game world, but on their
own computer. A change to the game world caused by one
player is sent, as data, to the other players. The part of the
game that passes data between players is called the server
instance. The part of the game that players interact with on
their computers is called the client instance. The server
instance keeps track of the state of the game and updates the
clients on a need-to-know basis
Class 10
Server Exercise
In this example, a welcome message is sent to the
client when the mission begins, and the message is
displayed in the client's game window
View the location of the core script files for the
server instance
In Windows Explorer, with a standard installation it
will be the folder C:\Torque\Torque 3D
1.2\MyProjects\FPSTutorial\game\core\scripts\
server
In Torsion, with the FPSTutorial project open, the path
is FPSTutorial\core\scripts\server
Open the message.cs file
Class 10
Server Exercise
Look for the following messageClient function definition:
function
function clientCmdServerMessage(%msgType,
clientCmdServerMessage(%msgType,
%msgString,
%msgString, %a1,
%a1, %a2,
%a2, %a3,
%a3, %a4,
%a4, %a5,
%a5, %a6,
%a6, %a7,
%a7, %a8,
%a8, %a9,
%a9, %a10)
%a10)
{{
//
// ...(code
...(code removed,
removed, partial
partial example)
example)
}}
Server Exercise
View the location of the non-core script files for the
server instance
In Windows Explorer, with a standard installation it will
be the folder C:\Torque\Torque 3D
1.2\MyProjects\FPSTutorial\game\scripts\server.
In Torsion, with the FPSTutorial project open, the path
is FPSTutorial\scripts\server
Open the gameCore.cs file
Look for the following
GameCore::onClientEnterGame callback function
Class 10
function
function GameCore::onClientEnterGame(%game,
GameCore::onClientEnterGame(%game, %client)
%client)
{{
//
// ...(code
...(code removed
removed to
to save
save space)
space)
//
// Inform
Inform the
the client
client we've
we've joined
joined up
up
messageClient(%client,
messageClient(%client,
'MsgClientJoin',
'MsgClientJoin', '\c2Welcome
'\c2Welcome to
to the
the Torque
Torque demo
demo app
app
%1.',
%1.',
%client.playerName,
%client.playerName,
%client,
%client,
%client.sendGuid,
%client.sendGuid,
%client.team,
%client.team,
%client.isSuperAdmin);
%client.isSuperAdmin);
Class 10
%client.score,
%client.score,
%client.kills,
%client.kills,
%client.deaths,
%client.deaths,
%client.isAiControlled(),
%client.isAiControlled(),
%client.isAdmin,
%client.isAdmin,
Server Exercise
Class 10
Server Exercise
Synchronization Exercise
View the location of the non-core script files for the
server instance.
In Windows Explorer, with a standard installation it
will be the folder C:\Torque\Torque 3D
1.2\MyProjects\FPSTutorial\game\scripts\serve
r. In Torsion, with the FPSTutorial project open, the
path is FPSTutorial\scripts\server.
function
function GameCore::onClientEnterGame(%game,
GameCore::onClientEnterGame(%game,
%client)
%client)
{{
//
// ...(code
...(code removed
removed to
to save
save space)
space)
//
// Inform
Inform the
the client
client we've
we've joined
joined up
up
messageClient(%client,
messageClient(%client,
'MsgClientJoin',
'MsgClientJoin', '\c2Welcome
'\c2Welcome to
to the
the
Torque
Torque demo
demo app
app %1.',
%1.',
Class 10
%client.playerName,
%client.playerName,
%client,
%client,
%client.sendGuid,
%client.sendGuid,
%client.team,
%client.team,
%client.score,
%client.score,
%client.kills,
%client.kills,
%client.deaths,
%client.deaths,
%client.isAiControlled(),
%client.isAiControlled(),
%client.isAdmin,
%client.isAdmin,
%client.isSuperAdmin););
%client.isSuperAdmin););
Class 10
//
// Inform
Inform all
all other
other clients
clients of
of the
the
new
new arrival
arrival
messageAllExcept(%client,
messageAllExcept(%client, -1,
-1,
'MsgClientJoin',
'MsgClientJoin', '%1
'%1 joined
joined the
the game!',
game!',
%client.playerName);
%client.playerName);
}} //
// function
function closing
closing brace
brace
Class 10
Synchronization Exercise
Class 10
Synchronization Exercise
function
function GameCore::onClientEnterGame(%game,
GameCore::onClientEnterGame(%game, %client)
%client)
{{
//
// code
code omitted
omitted in
in example
example
//
// Inform
Inform all
all other
other clients
clients of
of the
the new
new arrival
arrival
messageAllExcept(%client,
messageAllExcept(%client, -1,-1, 'MsgClientJoin',
'MsgClientJoin',
'%1
'%1 joined
joined the
the game!',
game!',
%client.playerName);
%client.playerName);
messageClient(%client,
messageClient(%client, 'MsgClientJoin',
'MsgClientJoin',
'Everyone
'Everyone has
has been
been informed
informed that
that you
you have
have arrived
arrived and
and
they
they will
will be
be
hunting
hunting you
you shortly!');
shortly!');
}} //
// function
function closing
closing brace
brace
Class 10
Synchronization Exercise
Save the file. If your
game is already
running, exit the
game.
To see your new
message, start the
game.
Class 10
//
// ***
*** add
add this
this code
code ***
***
//
// --------------------------------------------------
--------------------------------------------------
if(ClientGroup.getCount()
if(ClientGroup.getCount() >> 1)
1)
{{
//
// --------------------------------------------------
--------------------------------------------------
//
// ***
*** end
end add
add code
code ***
***
//
// --------------------------------------------------
--------------------------------------------------
//
// Inform
Inform all
all other
other clients
clients of
of the
the new
new arrival
arrival
messageAllExcept(%client,
messageAllExcept(%client, -1,
-1, 'MsgClientJoin',
'MsgClientJoin',
'%1
'%1 joined
joined the
the game!',
game!',
%client.playerName);
%client.playerName);
Class 10
//
// ***
*** Add
Add this
this code
code ***
***
//
// and
and tell
tell the
the new
new guy
guy he's
he's in
in trouble!
trouble!
messageClient(%client,
messageClient(%client, 'MsgClientJoin',
'MsgClientJoin',
'Everyone
'Everyone has
has been
been informed
informed that
that you
you have
have arrived
arrived and
and
they
they will
will be
be hunting
hunting you
you shortly!');
shortly!');
//
// --------------------------------------------------
--------------------------------------------------
//
// ***
*** add
add this
this code
code ***
***
//
// --------------------------------------------------
--------------------------------------------------
}} //
// Don't
Don't forget
forget this
this closing
closing bracket.
bracket.
Class 10
Synchronization Exercise
The ClientGroup is a server object that keeps a list of all
the clients that are playing the game. The getCount
method of the ClientGroup object returns the number of
clients in the list. The if statement tests to see if there is
more than one client in the list
Save your file. Now if you play the game alone, you won't
see the message "Everyone has been informed that you
have arrived and they will be hunting you shortly." You will
only see the message if another player joins your game
Testing for the number of players is a common scripting
task. Also, you can obtain any client object by using the
clientGroup.getObject() function. For script examples
that do just that, see the topic "GameConnection Class
Reference" in the Torque 3D Script Manual, and search
for "ClientGroup.getObject"
Class 10
//
// Client
Client instance
instance script
script file:
file: myClientCommands.cs
myClientCommands.cs
//
// Companion
Companion to
to the
the server
server script
script file:
file:
myServerCommands.cs
myServerCommands.cs
//
// ------------------------------------------------
------------------------------------------------
//
// Define
Define aa function
function that
that will
will be
be called
called by
by the
the
//
// client
client
//
// instance
instance (in
(in the
the mission
mission file)
file) to
to set
set up
up
//
// teleporting.
teleporting.
//
// This
This function
function sends
sends aa command
command to
to the
the server
server
//
// instance
instance
//
// to
to start
start teleporting
teleporting the
the player
player in
in this
this client
client
//
// instance.
instance.
//
// -----------------------------------------------
-----------------------------------------------
function
function sendTeleportSignal()
sendTeleportSignal()
{{
Class 10
//
// Set
Set aa variable
variable to
to pass
pass to
to the
the function
function call
call
//
// that
that comes
comes next...
next...
%time
%time == 1000;
1000; //
// in
in milliseconds
milliseconds
//
// Call
Call the
the "TeleportReady"
"TeleportReady" function
function on
on the
the server
server side,
side,
// Pass in your variable, which represents a 1 second
// Pass in your variable, which represents a 1 second
//
// delay.
delay.
commandToServer('TeleportReady',
commandToServer('TeleportReady', %time);
%time);
}}
Class 10
View the location of the script files for the server instance. In
Windows Explorer, with a standard installation it will be the
folder C:\Torque\Torque 3D 1.2\MyProjects\FPS
Tutorial\game\scripts\server. In Torsion, with the
FPSTutorial project open, the path is
FPSTutorial\scripts\server.
Create a file in the server folder, named myServerCommands.cs
function
function serverCmdTeleportReady(%client,
serverCmdTeleportReady(%client, %time)
%time)
{{
schedule(%time,
schedule(%time, 0,
0, "beginTeleport",
"beginTeleport", %client);
%client);
}}
//
// ---------------------------------------------------------
---------------------------------------------------------
//
// Define aa function
Define function that
that is
is called
called after
after aa delay.
delay.
//
// This
This function
function manually
manually changes
changes the
the position
position ofof the
the player
player
//
// on
on the
the server.
server. The
The server
server then
then takes
takes care
care of
of updating
updating
//
// all
all the
the clients
clients with
with the
the new
new position
position of
of the
the player.
player.
//
// ---------------------------------------------------------
---------------------------------------------------------
function
function beginTeleport(%cl)
beginTeleport(%cl)
{{
Class 10
function
function beginTeleport(%cl)
beginTeleport(%cl)
{{
//
// Generate
Generate aa random
random distance
distance byby using
using the
the Torque
Torque 3D
3D
//
// getRandom()
getRandom() function.
function.
%dist
%dist == 55 ++ (getRandom()
(getRandom() ** 5);
5);
//
// Get
Get aa reference
reference to
to this
this client's
client's control
control object
object
by
by
//
// using
using the
the Torque
Torque 3D
3D getControlObject()
getControlObject() function.
function.
//
// The
The control
control object
object is
is the
the player.
player.
%controlObject
%controlObject == %cl.getControlObject();
%cl.getControlObject();
Class 10
//
// Get
Get the
the player's
player's physical
physical position
position and
and height.
height.
%pos
%pos == %controlObject.position;
%controlObject.position;
%height
%height == getWord(%pos,
getWord(%pos, 2);
2);
//
// Add
Add the
the distance
distance to
to the
the value
value already
already in
in the
the
//
// height
height variable.
variable.
%height
%height +=
+= %dist;
%dist;
//
// Set
Set %pos
%pos variable
variable to
to the
the new
new position
position value.
value.
%pos
%pos == setWord(%pos,
setWord(%pos, 2,
2, %height);
%height);
Class 10
//
// In
In the
the object
object that
that represents
represents the
the current
current player,
player,
//
// set
set the
the position
position property
property to
to your
your %pos
%pos value.
value.
//
// It's
It's by
by modifying
modifying the
the position
position property
property of
of the
the
// actual player object that you physically
// actual player object that you physically movemove
//
// the
the player.
player.
%controlObject.position
%controlObject.position == %pos;
%pos;
//
// Send
Send aa message
message to
to the
the client's
client's game
game window
window to
to
// tell them how far they went.
// tell them how far they went.
commandToClient(%cl,
commandToClient(%cl, 'ServerMessage',
'ServerMessage', 'MsgClientJoin',
'MsgClientJoin',
%msgString,
%msgString,
'You
'You were
were teleported!
teleported! Distance:
Distance: %1',
%1', %dist);
%dist);
}}
Class 10
//
// Load
Load the
the scripts
scripts that
that start
start it
it all...
all...
exec("./client/init.cs");
exec("./client/init.cs");
exec("./server/init.cs");
exec("./server/init.cs");
Add the following script after the exec("./server/init.cs"); line. These lines will execute your
script files and load all of the functions into memory.
//
// Add
Add your
your own
own command
command scripts.
scripts.
exec("./client/myClientCommands.cs");
exec("./client/myClientCommands.cs");
exec("./server/myServerCommands.cs");
exec("./server/myServerCommands.cs");
After the level loads, press TAB to switch from first-person view to third-person
view so that you can see all of your character.
Class 10
SendTeleportSignal();
After you press ENTER to confirm the function you typed in,
press tilde (~) to close the console window, quickly you
should see your character teleported into the air, and receive
a message on your screen that tells you how far.
Class 10
function
function TeleportTriggerData::onEnterTrigger(
TeleportTriggerData::onEnterTrigger( %this,
%this, %trigger,
%trigger, %obj
%obj ))
{{
//
// Print
Print this
this string
string to
to the
the console
console window.
window.
echo(
echo( "The
"The player
player has
has walked
walked over
over the
the teleporter
teleporter pad.");
pad.");
//
// Get
Get aa reference
reference to
to the
the client
client (ie,
(ie, this
this player)
player)
//
// from
from the
the %obj
%obj variable.
variable.
%client
%client == %obj.getControllingClient();
%obj.getControllingClient();
//
// If
If there
there is
is none,
none, exit
exit this
this function
function now.
now.
if
if (%client
(%client ==
== 0)
0) return;
return;
//
// Call
Call the
the beginTeleport()
beginTeleport() function
function to
to kick
kick off
off the
the
//
// teleportation
teleportation sequence.
sequence.
beginTeleport(%client);
beginTeleport(%client);
}}
Class 10
function
function TeleportTriggerData::onLeaveTrigger(
TeleportTriggerData::onLeaveTrigger( %this,
%this, %trigger,
%trigger, %obj
%obj ))
{{
//
// Print
Print this
this string
string to
to the
the console
console window.
window.
echo(
echo( "The
"The player
player has
has left
left the
the teleporter
teleporter pad.");
pad.");
}}
//
// ---------------------------------------------------------
---------------------------------------------------------
//
// This function
This function is
is called
called every
every tickPerioMS
tickPerioMS while
while aa player
player
//
// is
is within
within the
the trigger
trigger space.
space.
//
// ---------------------------------------------------------
---------------------------------------------------------
function
function TeleportTriggerData::onTickTrigger(
TeleportTriggerData::onTickTrigger( %this,
%this, %trigger
%trigger ))
{{
//
// Print
Print this
this string
string to
to the
the console
console window.
window.
echo(
echo( "The player is still standing on
"The player is still standing on the
the teleporter
teleporter pad.");
pad.");
}}
Class 10
function
function <datablock
<datablock or
or object
object name>::<callback
name>::<callback function
function name>(%this,
name>(%this, <other
<other
parameters>
parameters> ))
For the trigger you're using, the function declaration looks like
this:
function
function TeleportTriggerData::onEnterTrigger(
TeleportTriggerData::onEnterTrigger( %this,
%this, %trigger,
%trigger, %obj
%obj ))
//
// In
In the
the object
object that
that represents
represents the
the current
current player,
player,
//
// set
set the
the position
position property
property to
to the
the hidden
hidden location.
location.
//
// It's
It's by
by modifying
modifying the
the position
position property
property of
of the
the
//
// actual player object that you physically move
actual player object that you physically move
//
// the
the player.
player.
%controlObject.position
%controlObject.position == "2
"2 -21
-21 18"
18"
Class 10
//
// Send
Send aa message
message to
to the
the client's
client's game
game window
window to
to
//
// tell
tell them
them how
how far
far they
they went.
went.
commandToClient(%cl,
commandToClient(%cl, 'ServerMessage', 'MsgClientJoin',
'ServerMessage', 'MsgClientJoin',
'You
'You were
were teleported
teleported to:
to: Best
Best Sniper
Sniper Position');
Position');
}}
//
// Call
Call the
the beginTeleport()
beginTeleport() function
function to
to kick
kick off
off the
the
//
// teleportation
teleportation sequence.
sequence.
beginTeleport(%client);
beginTeleport(%client);
Class 10
To the following:
//
// Call
Call the
the beginTeleportToHiddenLocation()
beginTeleportToHiddenLocation() function
function
//
// to
to kick
kick off
off the
the teleportation
teleportation sequence
sequence to
to the
the rooftop.
rooftop.
beginTeleportToHiddenLocation(%client);
beginTeleportToHiddenLocation(%client);
Now your new function will be called when the player enters the trigger
space.
Start your game, enter the level, and move your character over the
teleporter pad.
Class 10
2. Quiz: Lesson 6
Multiplayer Experience:
Lecture
1. Lesson 7
Cover the server instance and client instance,
Client/Server architecture, different types of
FPS players
Client/Server, onConnect(), ServerMessage,
Host, Datablocks, Properties, callback function
Customize level by iterative testing and
modifications
Create a fun level with ammo points,
teleporters, and new spawn points
Class 11
Multiplayer Experience
This lesson uses the FPS Tutorial project that you
created in Lesson 1. The template for the FPS Tutorial
project comes with Torque 3D version 1.2.
Multiplayer Experience
Chinatown Sniper, Choke Points, and Kill zones
Class 11
Multiplayer Experience
While dragging with the right mouse button to steer, and using the
W, A, S, D or arrow keys to move, go to the location where you want
to add your first ammunition pickup. A good starting spot is the choke
point at the South West corner of the courtyard.
Class 11
Multiplayer Experience
Open the Object Editor by using one of the following methods:
Press F1.
Or in the Editors menu, click Object Editor.
Or click the Object Editor button.
Class 11
Multiplayer Experience
Double-click the Ammo folder to display the
type of ammunition that you can place in your
scene.
The types of
ammunition that you
see in this folder were
created and added by
the FPS Tutorial level
designers.
Class 11
Multiplayer Experience
Double-click the type of ammunition
that you would like to add to the level.
For this exercise, double-click
LurkerAmmo to add the ammunition
pickup to your scene.
Multiplayer Experience
The gizmo appears in the Object Editor when
you select one of the transformation tools.
Multiplayer Experience
Remember to press ENTER after you type in the name,
using either method.
Multiplayer Experience
Remember to press ENTER after you type in the
name, using either method.
Press F11 to switch from
the World Editor to Play
Game mode. You should
be equipped with the
Lurker gun by default,
but if not, press Q or roll
the mouse wheel until
you equip the Lurker
gun. Fire off a few shots.
Class 11
Multiplayer Experience
In this exercise, you will place ammunition clip
pickups in your scene.
If it is not already
selected, open the
Object Editor by
pressing F1. The Scene
Tree and Inspector
panels appear on the
right.
Multiplayer Experience
Double-click the AmmoClip folder to display the type of
ammunition clips that you can place in your scene.
Multiplayer Experience
If you want to move the ammunition clip pickup,
drag one of the transformation handles.
In the Scene Tree, in the Scene
tab, scroll to the bottom of the
list, and then expand your
AmmoDrops folder. The
LurkerClip that you just added
is considered an Item object,
and is listed last.
Multiplayer Experience
To rename the item, you can select it and change the name
property in the Inspector panel, or you can double-click the
item in the Scene tree, as shown in the following images:
Class 11
Multiplayer Experience
In the Project tab, navigate to the FPS Tutorial\scripts\server
folder, and then double-click the player.cs file to open it for
editing.
Multiplayer Experience
Type Armor::onDisabled into the Find box at the top of the
editor, and then press ENTER.
The Armor::onDisabled
callback function header is
located and highlighted for you.
Class 11
Multiplayer Experience
//
// Toss
Toss current
current mounted
mounted weapon
weapon and
and ammo
ammo if
if any.
any.
//
// First,
First, check
check for
for aa weapon
weapon by
by trying
trying to
to get
get aa weapon.
weapon.
%item
%item == %obj.getMountedImage($WeaponSlot).item;
%obj.getMountedImage($WeaponSlot).item;
//
// If
If the
the %item
%item variable
variable was
was set
set to
to an
an object
object by
by the
the
//
// preceding
preceding line,
line, then
then the
the player
player had
had aa weapon.
weapon.
if
if (isObject(%item))
(isObject(%item))
{{
//
// Check
Check for
for ammo
ammo in
in the
the same
same way
way that
that you
you checked
checked
//
// for
for aa weapon.
weapon.
%amount
%amount == %obj.getInventory(%item.image.ammo);
%obj.getInventory(%item.image.ammo);
Class 11
Multiplayer Experience
//
// If
If the
the %amount
%amount variable
variable was
was set,
set, then
then
there
there is
is
//
// ammo.
ammo.
if(%amount)
if(%amount)
{{
//
// Throw
Throw down
down the
the ammo.
ammo.
%obj.throw(%item.image.ammo,
%obj.throw(%item.image.ammo, %amount);
%amount);
}}
}}
Class 11
Multiplayer Experience
function
function Armor::onDisabled(%this,
Armor::onDisabled(%this, %obj,
%obj, %state)
%state)
{{
//
// Release
Release the
the main
main weapon
weapon trigger
trigger
%obj.setImageTrigger(0,
%obj.setImageTrigger(0, false);
false);
//
// -----------------------------------------------
-----------------------------------------------
//
// add
add this
this code
code
//
// -----------------------------------------------
-----------------------------------------------
//
// Toss
Toss current
current mounted
mounted weapon
weapon and
and ammo
ammo if
if any.
any.
//
// First,
First, check
check for
for aa weapon
weapon by
by trying
trying to
to get
get aa weapon.
weapon.
%item
%item == %obj.getMountedImage($WeaponSlot).item;
%obj.getMountedImage($WeaponSlot).item;
//
// If
If the
the %item
%item variable
variable was
was set
set to
to an
an object
object by
by the
the
//
// preceding
preceding line,
line, then
then the
the player
player had
had aa weapon.
weapon.
if
if (isObject(%item))
(isObject(%item))
{{
Class 11
Multiplayer Experience
//
// Check
Check for
for ammo
ammo in
in the
the same
same way
way that
that you
you checked
checked
//
// for
for aa weapon.
weapon.
%amount
%amount == %obj.getInventory(%item.image.ammo);
%obj.getInventory(%item.image.ammo);
//
// If
If the
the %amount
%amount variable
variable was
was set,
set, then
then there
there is
is
//
// ammo.
ammo.
if(%amount)
if(%amount)
{{
//
// Throw
Throw down
down the
the ammo.
ammo.
%obj.throw(%item.image.ammo,
%obj.throw(%item.image.ammo, %amount);
%amount);
}}
}}
Class 11
Multiplayer Experience
//
// -----------------------------------------------
-----------------------------------------------
//
// end
end add
add code
code
//
// -----------------------------------------------
-----------------------------------------------
%obj.playDeathCry();
%obj.playDeathCry();
%obj.playDeathAnimation();
%obj.playDeathAnimation();
//%obj.setDamageFlash(0.75);
//%obj.setDamageFlash(0.75);
//
// Schedule
Schedule corpse
corpse removal.
removal. Just
Just keeping
keeping the
the place
place clean.
clean.
%obj.schedule($CorpseTimeoutValue
%obj.schedule($CorpseTimeoutValue -- 1000,
1000, "startFade",
"startFade", 1000,
1000,
0,
0, true);
true);
%obj.schedule($CorpseTimeoutValue,
%obj.schedule($CorpseTimeoutValue, "delete");
"delete");
}}
Class 11
Multiplayer Experience
Select your server from the list (1), and then click Join Game (2).
Class 11
Multiplayer Experience
In the second instance of your game, move your
player to the courtyard to find the first player.
Class 11
Multiplayer Experience
The floating weapon is an ammunition pickup that is
created by the script you added to the player.cs file.
Class 11
Multiplayer Experience
Walking over the ammunition pickup will increase your
current ammunition if you have room in your inventory.
Class 11
Multiplayer Experience
To get a list of all of the objects for which you can create
these callback functions, look at the Script Manual topic
for the ShapeBaseData Class, and click the
Inheritance diagram link.
Class 11
Multiplayer Experience
All of the classes that point to ShapeBaseData have
access to the callback functions that are defined in
the ShapeBaseData class.
Class 11
Multiplayer Experience
In this exercise, you will add script that will send a boastful message to
every player when one player gets on a kill streak.
Multiplayer Experience
In the Project tab, navigate to the FPSTutorial\scripts\server
folder, and then double-click the gameCore.cs file to open it for
editing.
Multiplayer Experience
The GameCore::incKills function header is located
and highlighted for you.
Class 11
Multiplayer Experience
Add the following script after the first line inside the function. It's only 6 lines of
code. The rest of the lines are comments to help you understand what's going on.
%client.lastKillCount
%client.lastKillCount +=
+= %kill;
%kill;
//
// The
The %client.lastKillDeathCount
%client.lastKillDeathCount variable
variable contains
contains the
the
//
// number of times this player had died the last time they
number of times this player had died the last time they
//
// killed
killed someone.
someone.
//
// If
If the
the client's
client's last
last death
death count
count is
is less
less than
than the
the
//
// client's
client's current
current death
death count,
count, then
then they
they have
have died
died since
since
//
// the
the last
last time
time they
they killed
killed someone,
someone, and
and they
they aren't
aren't inin
//
// the
the running
running for
for aa kill
kill streak/victory
streak/victory message.
message.
if
if (%client.lastKillDeathCount
(%client.lastKillDeathCount << %client.deaths)
%client.deaths)
Class 11
Multiplayer Experience
{{
//
// This
This player
player isn't
isn't in
in the
the running
running for
for aa kill
kill streak.
streak.
//
// So,
So, reset
reset the
the client's
client's last
last death
death count
count to
to be
be the
the
//
// client's
client's current
current death
death count,
count, in
in preparation
preparation for
for the
the
// next time they kill someone and this function
// next time they kill someone and this function is is
//
// called.
called.
%client.lastKillDeathCount
%client.lastKillDeathCount == %client.deaths;
%client.deaths;
//
// Set
Set their
their lastKillCount
lastKillCount to
to the
the number
number of
of players
players they
they
// just killed.
// just killed.
%client.lastKillCount
%client.lastKillCount == %kill;
%kill;
}}
Class 11
Multiplayer Experience
//
// If
If they
they killed
killed 2+
2+ players
players this
this time,
time, or
or 2+
2+ total
total players
players
//
// last
last time
time and
and this
this time,
time, the
the %client.lastKillCount
%client.lastKillCount will
will
//
// be
be greater
greater than
than or
or equal
equal to
to 2.
2.
if
if (%client.lastKillCount >=
(%client.lastKillCount >= 2) 2)
{{
//
// This
This player
player has
has had
had aa kill
kill streak!
streak! Send
Send the
the victory
victory
// message on the same channel as the killed message.
// message on the same channel as the killed message.
messageAll('MsgClientKilled',
messageAll('MsgClientKilled',
'%1
'%1 is
is on
on aa killing
killing streak!',
streak!',
%client.playerName);
%client.playerName);
}}
Class 11
Multiplayer Experience
function
function GameCore::incKills(%game,
GameCore::incKills(%game, %client,
%client, %kill,
%kill, %dontMessageAll)
%dontMessageAll)
{{
%client.kills
%client.kills +=
+= %kill;
%kill;
//
// Info:
Info:
//
// The
The %client
%client variable
variable is
is pointing
pointing to
to the
the player
player who
who did
did
//
// the killing.
the killing.
//
// The
The %kill
%kill variable
variable contains
contains the
the number
number of
of kills
kills this
this
//
// player
player just made, typically no more than 1 or
just made, typically no more than 1 or 2.
2.
//
// The
The %client.deaths
%client.deaths variable
variable contains
contains the
the number
number ofof times
times
//
// this player has died.
this player has died.
//
// Add
Add %kill
%kill to
to the
the client's
client's lastKillCount.
lastKillCount. This
This is
is not
not the
the
// total kill count. The %client.lastKillCount variable
// total kill count. The %client.lastKillCount variable
//
// keeps
keeps track
track of
of the
the number
number of
of players
players this
this player
player killed
killed
//
// this
this time,
time, and
and the
the last
last time
time they
they killed
killed someone.
someone.
%client.lastKillCount
%client.lastKillCount += += %kill;
%kill;
Class 11
Multiplayer Experience
//
// The
The %client.lastKillDeathCount
%client.lastKillDeathCount variable
variable contains
contains the
the
//
// number
number of
of times
times this
this player
player had
had died
died the
the last
last time
time they
they
//
// killed
killed someone.
someone.
//
// If
If the
the client's
client's last
last death
death count
count is
is less
less than
than the
the
//
// client's
client's current
current death
death count,
count, then
then they
they have
have died
died since
since
//
// the
the last time they killed someone, and they aren't in
last time they killed someone, and they aren't in
//
// the
the running
running for
for aa kill
kill streak/victory
streak/victory message.
message.
if
if (%client.lastKillDeathCount
(%client.lastKillDeathCount << %client.deaths)
%client.deaths)
{{
//
// This
This player
player isn't
isn't in
in the
the running
running for
for aa kill
kill streak.
streak.
//
// So,
So, reset
reset the
the client's
client's last
last death
death count
count to
to be
be the
the
//
// client's current death count, in preparation for the
client's current death count, in preparation for the
//
// next
next time
time they
they kill
kill someone
someone and
and this
this function
function is
is
//
// called.
called.
%client.lastKillDeathCount
%client.lastKillDeathCount == %client.deaths;
%client.deaths;
Class 11
%client.lastKillCount
%client.lastKillCount == %kill;
%kill;
}}
//
// If
If they
they killed
killed 2+2+ players
players this
this time,
time, or
or 2+
2+ total
total players
players
//
// last
last time
time and
and this
this time,
time, the
the %client.lastKillCount
%client.lastKillCount will
will
// be greater than or equal
// be greater than or equal to 2. to 2.
if
if (%client.lastKillCount
(%client.lastKillCount >= >= 2)
2)
{{
//
// This
This player
player has
has had
had aa kill
kill streak!
streak! Send
Send the
the victory
victory
// message on the same channel as the killed
// message on the same channel as the killed message.message.
messageAll('MsgClientKilled',
messageAll('MsgClientKilled',
'%1
'%1 is
is on
on aa killing
killing streak!',
streak!',
%client.playerName);
%client.playerName);
}}
if(
if( !%dontMessageAll
!%dontMessageAll ))
messageAll('MsgClientScoreChanged',
messageAll('MsgClientScoreChanged', "", "", %client.score,
%client.score, %client.kills,
%client.kills,
%client.deaths,
%client.deaths, %client);
%client);
}}
Class 11
Multiplayer Experience
Running the game to see the message:
When the first instance of your game starts, click Multiplayer in the
first menu screen, and then click Host in the second menu screen
Multiplayer Experience
When the second instance of your game starts, click
Multiplayer in the first menu screen, and then click
Join in the second menu screen.
Class 11
Multiplayer Experience
In this exercise, you learned how to add code to an
existing function to display a victory message in a
specific situation.
Class 11
Multiplayer Experience
Class 11
Multiplayer Experience
While dragging with the right mouse button to steer, and using the
W, A, S, D or arrow keys to move, go to the location where you want to
add a new spawn point
In the Scene Tree panel, in the Library tab, select the Level
subtab, and then select the Level folder from the dropdown box
Class 11
Multiplayer Experience
Multiplayer Experience
You can make sure that all new items that you add to your scene will
be put in the PlayerSpawnPoints folder. To do that, right-click the
PlayerSpawnPoints folder, and then click Add New Objects Here.
Class 11
Multiplayer Experience
To place these spawn points quickly, use the
following abbreviated steps:
Multiplayer Experience:
Conclusion
Lab (2 hours):
1.
Teleport player, teleport pad, work on team project
Add Ammo Pickup points, put down 4 more ammo pickup
points in strategically fun places
Put in Deathmatch Victory Conditions and add spawn
points
2. Presentation:
Present (preview) a team level with custom teleporters and
weapon/ammo pickups
Give a preview of the level to get feedback from the class
Have team talk about the game play reasons for design of
the level
Quiz: Lesson 7
Homework: Finish Final Project
Class
12
Class 12
Finals
1. Finish Presentations
2. Lecture: Review course
3. Talk about the game industry, jobs and talk to the
students about the class. What did they get out
of it? What would they change? Did it meet their
expectations? Any recommendations on the
content or execution of the class?
4. Final Test: (2 hours)
Class 13
Copyright Info
Torque 3D 1.2 Educational Materials are provided
free of charge for educational purposes. All or part of
materials are freely distributable and use for any
individual, school, or workshop for learning and
educational purposes.