(Not really a) Tutorial: example game
=====================================

A network game for 2 or 3 players (or one player and one virtual player),
moving an UFO and shooting asteroids ("rocks").

The game is located under game/.


Type "make" to compile it.
The master player calls "game_master",
the client players call "game_client".


There are 3 objects:
 - the rocks
 - the ships (UFOs)
 - the shots of the ships


The main programs

(refer to game/src/game_master.c and game/src/game_client.c).
 - create the window
 - start the sound-server
 - show an intro
 - create the 3 objects, which set the network variables
 - (start and) connect to the network-server
 - play the game loop:
   + get the keystrokes, eventually quit the game
   + the master moves the objects and calls vg_nw_sendcommon()
   + the clients get the positions of the objects
   + give out the objects
 - before ending the credits of the player are shown


The rock object:

(refer to game/src/o_rock.c
          game/src/o_rock.h
          game/src/ifo_rock.c
)

It is created by game_master and game_client by calling new_rock(),
passing the number of rocks.
This function creates some network arrays, one element of them for each rock
(with vg_nw_setcommon()).

After connecting, game_master and game_client call set_network()
to set the struct pointers (declared in o_rock.h) to the network variables.

The master's next call move() moves all rocks, checking for overlapping
with other objects, eventually destroying a rock, playing a sound
and set the network variables with the new positions of all rocks.

To check a rock with another object (whether hit by a shot or a ship),
iforock_move() in ifo_rock.c is called. This function checks with
the overlapped() function in each object for bitmap-overlapping
(whether a hit occured). If a hit is found, for both objects the function
set_dead() / set_inactive() / change_direction() is called
and eventually a sound is played. This sound play-information is also set
into a network-variable for the clients play this sound, too.


The clients call getpos() instead of move() to set the
network variables into a the o_rock-struct. If a sound is to be played,
it is played here.

At last the function giveout() is called by game_master and game_client
to draw the rocks onto screen.

The rock object is destroyed by game_master and game_client with free_rock().


The shot object:

(refer to game/src/o_shot.c
          game/src/o_shot.h
          game/src/ifo_shot.c
)

It is nearly used in the same way as the rock object.
A new shot is created by the ships calling activate(), using
the ship's interface function ifoship_shot() in ifo_ship.c.

In the variable "status" every shot stores the ship's number in order to give
this ship a credit, if the shot destroys a rock (ifo_shot.c: inc_credit()).


The ship object:

(refer to game/src/o_ship.c
          game/src/o_ship.h
          game/src/ifo_ship.c
)

It is nearly used in the same way as the rock object.
The network variables are stored with vg_nw_setvar().
The number of ships is passed in set_network(), because it is known
not before the players have connected.

The master's move() function distinguishes between
 - the master's player, who is moved with keystrokes
 - the virtual player, who is moved as a second master's player
 - the client players, who are moved according to the network-sent keystrokes
And it sets again the new network variables and calls vg_nw_senddata().

While pressing the fire-key a sound is played repeatedly,
which is paused, when releasing the key.
The clients play this sound in the function getpos().



[Previous] - [Index] - []