added tutorial 01
This commit is contained in:
parent
b1996330df
commit
d2c3194bdb
@ -83,6 +83,11 @@ Group: photon:: {
|
||||
|
||||
} # Group: photon::
|
||||
|
||||
Group: Tutorials {
|
||||
|
||||
File: 01 - Getting Started (no auto-title, /home/james/src/photon/ndoc/tutorials/tutorial01.txt)
|
||||
} # Group: Tutorials
|
||||
|
||||
Group: Index {
|
||||
|
||||
Index: Everything
|
||||
@ -99,3 +104,4 @@ Group: Index {
|
||||
##### Do not change or remove these lines. #####
|
||||
Data: 1(D3333RuEG3lpEG636H93IRutu\38\9oNfG)
|
||||
Data: 1(h3333RuEG3lpEG636H93IRutu\3\fu93Ip`G6)
|
||||
Data: 1(T3333RuEG3lpEG636H93IRutu\3\fu93tNtuH8po6)
|
||||
|
259
ndoc/tutorials/tutorial01.txt
Normal file
259
ndoc/tutorials/tutorial01.txt
Normal file
@ -0,0 +1,259 @@
|
||||
Document: Photon Tutorial 01 - Getting Started
|
||||
|
||||
Group: Introduction
|
||||
|
||||
Topic: Before We Start
|
||||
|
||||
This tutorial serves as an introduction to using Photon with C++. It is written
|
||||
so that those with a moderate amount of C++ experience can follow it and be able
|
||||
to get started with Photon. This tutorial does *NOT* aim to teach
|
||||
C++, Game Programming, or how to use every arcane feature available in Photon.
|
||||
After reading this tutorial, the basic structure of a Photon application should
|
||||
be understood, and by reading the available <Photon Documentation>
|
||||
one should be able to start with Photon without much difficulty.
|
||||
|
||||
In addition to having C++ experience, it is assumed that the reader of this
|
||||
tutorial has already set up Photon and all dependency libraries. For help doing
|
||||
this look at the page <http://photon.sourceforge.net/index.php/getting-photon>.
|
||||
You can also ask for help on the Photon mailing lists (<http://lists.sourceforge.net/lists/listinfo/photon-users>).
|
||||
|
||||
Topic: Getting Started
|
||||
Perhaps the best way to get started it to show what an extremely simple Photon
|
||||
application looks like.
|
||||
|
||||
(code)
|
||||
#include <photon.hpp>
|
||||
using namespace photon;
|
||||
|
||||
class SomeState : public State
|
||||
{
|
||||
public:
|
||||
void render()
|
||||
{
|
||||
// do any rendering in here
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
// do any updating of logic in here
|
||||
}
|
||||
};
|
||||
|
||||
int PhotonMain(const StrVec& args)
|
||||
{
|
||||
Application& app(Application::getInstance());
|
||||
|
||||
app.createDisplay(800,600,32,0,0,false);
|
||||
|
||||
app.setState<SomeState>();
|
||||
app.run();
|
||||
|
||||
return 0;
|
||||
}
|
||||
(end)
|
||||
|
||||
Perhaps you can follow the example above fairly well, if so you
|
||||
probably won't have a tough time picking up Photon as you go. For
|
||||
those who aren't so sure as to what is going on, fear not, by the end of the
|
||||
tutorial everything you see will have been addressed. Even if you don't know
|
||||
what it means, the fact that the above application is all it takes to get
|
||||
an empty window should indicate Photon really isn't too difficult to use.
|
||||
|
||||
The entrypoint function in any Photon application is a function called
|
||||
<PhotonMain>. In order to be as simple to use as possible, Photon
|
||||
takes care of it's own initialization by defining a main() function that
|
||||
does all of the work for you. In other libraries you often would write a main
|
||||
function and fill it with copy & pasted initialization code that doesn't change
|
||||
from one project to the next, when using Photon you simply create a function
|
||||
called <PhotonMain> and everything is taken care of.
|
||||
|
||||
As the entrypoint, <PhotonMain> is generally where you'll create the display and
|
||||
set the initial <State>. The state system will be covered in more detail in a
|
||||
short while.
|
||||
|
||||
One thing you'll notice is that <PhotonMain> takes something called a <StrVec>,
|
||||
which is simply a typedef for std::vector<std::string>. Just like a standard
|
||||
main() function, it also returns an integer return code which is interpreted
|
||||
by the operating system as success or failure.
|
||||
|
||||
Group: Digging In: Application and the State system
|
||||
|
||||
Topic: Application
|
||||
All Photon applications use <Application>. Generally Photon applications will
|
||||
contain code similar to the above example : a display will be created, the state
|
||||
system will be
|
||||
initialized, and finally the run method of <Application> will be called. We
|
||||
will now cover exactly what all of this means.
|
||||
|
||||
The first thing you may notice is that <Application> is declared as a reference
|
||||
and accessed in a funny sort of way. <Application> is a special kind of class
|
||||
known as a singleton due to the fact that in any photon application there can
|
||||
only be one instance. The single instance of Application is
|
||||
created before any of the code you write is executed, so there is no need to
|
||||
ever create it. What this means for you is that you cannot write code like:
|
||||
| Application app;
|
||||
or
|
||||
| Application* appPtr = new Application();
|
||||
|
||||
Instead <Application> must always be used via a reference. A reference can
|
||||
be obtained via Application::getInstance(), which can be called any number of
|
||||
times, always returning the single instance of <Application>. This means that
|
||||
the following two pieces of code produce identical results:
|
||||
|
||||
(code)
|
||||
// Sample 1 : Too Much Typing :(
|
||||
Application::getInstance().createDisplay(800,600,32,0,0,true);
|
||||
Application::getInstance().setState<SomeState>();
|
||||
Application::getInstance().run();
|
||||
(end)
|
||||
|
||||
|
||||
(code)
|
||||
// Sample 2 : Preferred
|
||||
Application& app(Application::getInstance());
|
||||
app.createDisplay(800,600,32,0,0,true);
|
||||
app.setState<SomeState>();
|
||||
app.run();
|
||||
(end)
|
||||
|
||||
<Application> is a fairly important class, it provides the means for managing
|
||||
the display, input, timer, task and state system. For simple 2D applications
|
||||
the only thing that needs to be done to configure the display is a single call
|
||||
to <Application::createDisplay> (width, height, depth, 0, 0, fullscreen, title).
|
||||
The input, timing, and task systems will be addressed in future tutorials, or
|
||||
check them out in <Application's> docs. What about the state system? Well that
|
||||
brings us to our next topic...
|
||||
|
||||
Topic: The State System
|
||||
<States> are probably the most important entities in Photon. A good portion of
|
||||
your application's code with be within classes which derive from <State>. Photon
|
||||
uses the idea that generally a game or application can be derived into a set of
|
||||
states each of which have their own characteristics and behavior. If you've
|
||||
ever written a game before you've likely encountered this concept, it is often
|
||||
solved using a switch statement or something similar. An example of states in
|
||||
a simple game might be a menu state, a play state, and an options screen state.
|
||||
Complex games could define a much larger number of states, and it is certainly
|
||||
possible to only use one state in a photon application.
|
||||
|
||||
Photon's state system is designed to be simple yet powerful, and this tutorial
|
||||
will only cover the basics of using <States>, however with the available
|
||||
documentation it isn't hard to do more advanced things with states, a topic that
|
||||
a future tutorial will cover.
|
||||
|
||||
Creating States:
|
||||
|
||||
<State> is a simple class with a set of virtual functions. In order to define
|
||||
the behavior of a given state in your application, simply derive from <State>
|
||||
overloading as few or as many of <State's> functions as you desire. The only
|
||||
function that must be overloaded is <State::render>, although generally
|
||||
<State::update> will be overloaded as well. <State> also has other functions
|
||||
available allowing for special behavior when a state is paused/resumed or global
|
||||
input handlers for a state.
|
||||
|
||||
The <State::update> method and <State::render> update method are called
|
||||
regularly in the update and render portions of the <Application's> state machine
|
||||
which is the next topic we'll address.
|
||||
|
||||
Running States:
|
||||
|
||||
Once the <Application::run> method is called, it does not return until all
|
||||
<States> exit. Therefore before it is called it is required that at least one
|
||||
<State>-derived class is made active using either <Application::setState> or
|
||||
<Application::pushState>. You'll notice from the <Getting Started> example that
|
||||
these functions both have an odd syntax, they take
|
||||
a template argument which should be the name of the <State>-derived class, but
|
||||
they take no formal parameters. The reason for this is an issue of
|
||||
implementation, and is basically a way of overcoming one of C++'s limitations
|
||||
(namely that types are not first class entities).
|
||||
|
||||
Group: Wrapping Up
|
||||
|
||||
Topic: Review
|
||||
|
||||
Let's take a look at what we've covered in this tutorial. First let's revisit
|
||||
the example from earlier and see what it all meant.
|
||||
|
||||
(code)
|
||||
#include <photon.hpp>
|
||||
using namespace photon;
|
||||
|
||||
// State-derived class used for application
|
||||
class SomeState : public State
|
||||
{
|
||||
public:
|
||||
void render()
|
||||
{
|
||||
// do any rendering in here
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
// do any updating of logic in here
|
||||
}
|
||||
};
|
||||
|
||||
// the Photon entrypoint, present for all Photon applications
|
||||
int PhotonMain(const StrVec& args)
|
||||
{
|
||||
// obtain a reference to the Application singleton
|
||||
Application& app(Application::getInstance());
|
||||
|
||||
// create the display, in this case a 800x600 window with 32 bit depth
|
||||
app.createDisplay(800,600,32,0,0,false);
|
||||
|
||||
// set the application state to SomeState (a State-derived class)
|
||||
app.setState<SomeState>();
|
||||
// run the application until the state quits or an exit request is received
|
||||
app.run();
|
||||
|
||||
// return 0, just like in a normal application
|
||||
return 0;
|
||||
}
|
||||
(end)
|
||||
|
||||
Hopefully you have a better understanding of what's going on now. The other
|
||||
tutorials will start assuming a basic understanding of the structure of a Photon
|
||||
application.
|
||||
|
||||
Topic: Topics Covered
|
||||
|
||||
PhotonMain - The entrypoint for all photon applications. (see <PhotonMain>)
|
||||
Application - Important singleton class used in all Photon applications.
|
||||
(see <Application>)
|
||||
Application::createDisplay - Function used to initialize the display.
|
||||
Application::setState - Function used to set active state.
|
||||
Application::run - Function called to start processing of active state.
|
||||
State - Base class for Photon application states, which are vital to
|
||||
using Photon. (see <State>)
|
||||
|
||||
|
||||
Group: Building a Photon application
|
||||
|
||||
Topic: Compilation
|
||||
Once you know how to write a basic photon application, you'll need to know how
|
||||
to compile it in your compiler/build environment of choice. Since I cannot possibly cover
|
||||
the full range of development environments, I'll speak in general terms and assume
|
||||
you are familiar with the environment you are using. If you need extra help either
|
||||
obtain help from a site related to your environment or ask on the Photon mailing
|
||||
lists.
|
||||
|
||||
Things to do when compiling a photon application:
|
||||
|
||||
- When compiling make sure all includes are in the include path of your compiler.
|
||||
- When linking make sure all libraries are in the library path of your compiler.
|
||||
- Ensure that you link against photon and all dependency libraries (photon,
|
||||
GLFW, OpenAL, OpenGL, GLU, PhysFS, Corona, and Freetype).
|
||||
- If you are using OpenAL, be sure to define PHOTON_USE_OPENAL
|
||||
|
||||
If you are using a command line compiler (like g++) it will resemble
|
||||
|
||||
| g++ -DPHOTON_USE_OPENAL -c -o test.o test.cpp
|
||||
| g++ -o test test.o -lphoton -lglfw -lopenal -lGL -lGLU -lphysfs -lcorona -lfreetype
|
||||
|
||||
If you are using an IDE (like Dev-C++, MS Visual C++, or Code::Blocks) you'll
|
||||
generally only need to specify the libraries you wish to link against. Again,
|
||||
if you need specific help try asking for help on the Photon mailing lists
|
||||
(<http://lists.sourceforge.net/lists/listinfo/photon-users>).
|
||||
|
||||
Written for Photon 0.1.0 by James:
|
||||
$Id: tutorial01.txt,v 1.1 2005/11/14 20:02:39 cozman Exp $
|
Loading…
Reference in New Issue
Block a user