640 likes | 768 Views
Sega 500. State Programming. Jeff “Ezeikeil” Giles jgiles@artschool.com http://gamestudies.cdis.org/~jgiles. State Programming. Over the last day or two, we scraped the surface of states and state programming in UT. So today is a theory day on exactly what states are.
E N D
Sega 500 State Programming Jeff “Ezeikeil” Giles jgiles@artschool.com http://gamestudies.cdis.org/~jgiles
State Programming • Over the last day or two, we scraped the surface of states and state programming in UT. • So today is a theory day on exactly what states are.
…I’m not talking about “denial” What are States?
What are States? • More commonly referred to as Finite-State or State Machine programming. • The State Machine, or more accurately, Finite State Machine (FSM), is a device and a technique that allows simple and accurate design of sequential logic and control functions.
What are States? • The Online computing dictionary defines states as: • An abstract machine consisting of a set of states (including the initial state), a set of input events, a set of output events and a state transition function. The function takes the current state and an input event and returns the new set of output events and the next state.
What are States? • Whether you are designing computer programs, sequential logic circuits or electronic control systems, using State Machine methods you will be able to make your designs more sophisticated than before, and with ease. • The concept behind a Finite State Machine (FSM) is that a machine (or object) can only have a limited (finite) number of states that it can operate in.
What are States? • Consider for example, the basic light switch. It exists in one of 2 states. • Either on or off. • Very commonly, these are represented and planned out in diagrams.
What are States? • A State Transition Diagram or Bubble Diagram depicts the relationship between these states and the events that cause the system to change from one state to the next.
What are States? • We have 2 states, described by the two bubbles ‘Off’ and ‘On’. • The states are joined by lines describing what causes them to change from one state to another. • These ‘causes’ are called events. • Also events depicting what happens when we are already in the up state and we get an ‘up’ event. Similar process when we are in the down state.
What are States? • What the UDN says: • Historically, game programmers have been using the concept of states ever since games evolved past the "pong" phase. States (and what is known as "state machine programming") are a natural way of making complex object behavior manageable.
What are States? • In UnrealScript, you can write functions and code that exist in a particular state. These functions are only called when the actor is in that state. For example, say you're writing a monster script, and you're contemplating how to handle the "SeePlayer" function. When you're wandering around, you want to attack the player you see. When you're already attacking the player, you want to continue on uninterrupted.
What are States? • The easiest way to do this is by defining several states (Wandering and Attacking), and writing a different version of "Touch" in each state.
…Incredible cosmic power!...ity-bity living space. In a nutshell
In a nutshell • A state is simply a section of code that is executed only if the class is in that state. For instance, what are the different states that a weapon could be in? • It could be firing, alt-firing, reloading, or just sitting there looking pretty. Each of these conditions could have their own state defined for them, which would contain code that's only used when the weapon is in that condition.
In a nutshell…Pro’s to states • States provide a simple way to write state-specific functions, so that you can handle the same function in different ways, depending on what the actor is doing.
In a nutshell…Pro’s to states • With a state, you can write special "state code", using the entire regular UnrealScript commands plus several special functions known as "latent functions". A latent function is a function that executes "slowly", and may return after a certain amount of "game time" has passed. This enables you to perform time-based programming.
In a nutshell…Con’s to states? • Debugging can become rather complicated. • E.g. Now that you can have functions (like "Touch") overridden in multiple states as well as in child classes, you have the burden of figuring out exactly which "Touch" function is going to be called in a specific situation.
…mental illness has never been so much fun About creating states
About creating states • State can be defined in one of 2 ways: • Editable: • state() MyState { //... } • non-editable: • state MyState { //... }
About creating states • If a state is editable, that simply means that in UnrealEd, the designer can set the objects current state in the editor. • When the level is loaded, the object will be set to that state.
About creating states • However there are times when you may not want to provide the option to the designer to set the starting state, but the object must start in a specific state. • For example, a auto-gun turret must start in state “searching”.
About creating states • You can achieve this by using the ‘auto’ keyword. • To create an initial, or default state of ‘MyState’ which is active when an Actor is created, you would define it like so: auto state() MyState { //... }
About creating states • State code can be written either within functions, or under labels. • Begin is by far the most common label, and any code written under it is executed as soon as the class enters that state. • Another cool thing about states is that you can use them to override functions within a particular class.
Goto Labels • Generally speaking, using goto’s are considered a major faux-pas in good object oriented programming. • However, in Unreal Scripting, they are a necessity for moving from state to state or between labels.
…post-it notes to the tenth power Goto Labels
Goto Labels • Any state can contain one or more labels followed by UnrealScript code. • All state code begins with a label definition. The label provides a convenient entry point into the state code.
Goto Labels • You can use any label name in state code, but the "Begin" label is special: • ‘Begin’ is the default starting point for code in that state.
Goto Labels • For a good example of using goto labels, look in Bot.uc in state ‘RestFormation’
GotoState Function • The "GotoState" function causes the actor to go to a new state, and optionally continue at a specified label (if you don't specify a label, the default is the "Begin" label). • You can call GotoState from within state code, and it goes to the destination immediately.
GotoState Function • Additionally, you can also call GotoState from within any function in the actor • However, it does not take effect immediately: not until execution returns back to the state code.
…who’s boy are you and who’s your daddy? Inheritance
Inheritance Rules • In UnrealScript, when you subclass an existing class, your new class inherits all of the variables, functions and states from its parent.
Inheritance Rules • From the UDN… • A new Class : • inherits all of the variables from its parent class. • inherits all of its parent class's non-state functions. You can override any of those inherited non-state functions. You can add entirely new non-state functions.
Inheritance Rules • inherits all of its parent class's states, including the functions and labels within those states. You can override any of the inherited state functions, and you can override any of the inherited state labels, you can add new state functions, and you can add new state labels
Inheritance Rules • When you have a function that is implemented globally, in one or more states, and in one or more parent classes, you need to understand *which* version of the function will be called in a given context.
Inheritance Rules • The scoping rules that resolve these complex situations are: • If the object is in a state, and an implementation of the function exists somewhere in that state ( either in the actor's class or in some parent class ), the most-derived state version of the function is called. • Otherwise, the most-derived non-state version of the function is called.
…it’s about time Latent Functions
By basing the flow of your script execution on Latent functions, you are creating animation-driven or time-driven code, which is fairy efficient in UnrealScript. Latent functions in UnrealScript may only be called from code within a state, not from code within a function. Latent Functions
Latent Functions • While an actor is executing a latent function, that actor's state execution doesn't continue until the latent function completes. However, other actors, or the Virtual machine, may call functions within the actor. • The net result is that all UnrealScript functions can be called at any time, even while latent functions are pending.
Latent Functions • UnrealScript acts as if each actor in a level has its own "thread" of execution. • E.g. All UnrealScripts execute in parallel. If there are 100 monsters walking around in a level, all 100 of those monsters' scripts are executing simultaneously AND independently.
Latent Functions • Some examples of latent functions include "Sleep", "FinishAnim", FinishInterpolation and "MoveTo". • Note, latent is also a keyword in UScript & latent functions return this type. • See the Actor class…
…You are indeed powerful…but your not a Jedi yet Advanced state programming
Advanced state programming • One of the cool things about states is that they have the ability to literally ignore specific functions while in a state. • Optionally, a state can use the "ignores" specifier to ignore functions while in a state.
Advanced state programming • This makes it so neither the Fire() or AltFire() function can be executed while the class is in this state. • State MyState • { • Ignores Fire, AltFire; • … • }
Advanced state programming • It is possible for an actor to be in "no state" by using GotoState(‘ ') or GotoState(‘none'). • When an actor is in "no state", only its global (non-state) functions are called.
Advanced state programming • Also, when a state finishes its execution, it will remain in that state unless it is set to another or none.
Advanced state programming • Where ever you use the GotoState command to set an actor’s state, the engine can call two special notification functions, if you have defined them: EndState() and BeginState().
Advanced state programming • These functions provide a convenient place to do any state-specific initialization and cleanup which your state may require • EndState is called in the current state immediately before the new state is begun. • BeginState is called immediately after the new state begins.
Advanced state programming • One can Extend States expand on an existing state in the current class. This is useful, for example, in a situation where you have a group of similar states that have a lot of functionality in common. • More complex inheritance…
Advanced state programming • Note: The references & UDN use expands, however the expands keyword as been deprecated from Unreal Script.