Tutorial2:NetworkedWackadot:Eclipse
From FANG
Contents |
1. Wackadot is Already Multiplayer!
Every game you write with the FANG Engine is already networked and can be run as multiplayer. The first step in enabling this ability is to change the number of players. Add the code below which is not already there. You already have some of the code below from the previous instructions: new code is shown in bold blue.
| A | Source code | Explanation of Source code |
21 22 23 24 25 26 |
public Wackadot()
{
setNumberOfPlayers(2);
}
|
Line 4: the default number of players is always one. Making the default number of players more than one will allow them to change how many players should connect. The player who establishes the game name is the one who determines how many should connect before the game begins. For all players who connect to an established game name, the number of players field is not used so long as it is more than 1 (when it is one-player, the game does not connect to the server). |
Run the game. You will see a window come up that asks for the game name, number of players, and server name. You don't need to change any of these, just click on 'Connect & Start Game'. It should say 'Waiting for 1 player to join'. Leave this window open and run Wackadot again. You should see a window that comes up like the original one, except that it says 'default' for the name of the game. When you do not specify the name of a game, it gives the game the name 'default'. Click on 'Connect & Start Game'. You should see that both games now show three dots. When the first player clicks on 'Start', the game begins. Notice that the mouse in only one game controls the dot. In the next step, we'll alter the code to make sure all the players get to control their own dot.
When you run the game, it automatically runs a tiny little server on your computer that forwards the input between the games. If you want to play the game between two different computers, you'll need to either make sure they are on the same network or use the FANG Engine server at www.fangengine.org as shown to the right.
Note: the FANG Engine tries to tunnel the network traffic through port 80 to avoid firewall issues. If you are running a server on your own computer (not very common), you won't be able to run networked games that connect to your own computer until you turn off your web server. The easiest way around this is to connect to www.fangengine.org instead of your own computer.
2. Specify the Player Index
The reason the games do not remain consistent is because they use the getMouse2D method with no parameters. When called this way, the player that is returned is the first player. It is also possible to call the method with an integer for the parameter which indicates the player number. We're going to change it so that only the first player can control the dot. All other players will simply be able to observe.
| B | Source code | Explanation of Source code |
142 143 144 145 146 147 148 149 150 151 152 153 |
public void advance()
{
if(timeLeft>0)
{
Location2D mouse=
getMouse2D(0);
dot.setLocation(mouse);
handleCollisions();
}
}
|
Line 148: Notice that the getMouse2D method now has the argument zero. This means that the player returned should be the first player. Absent any arguments, the current player is returned from the getPlayer method. |
Run the game again as instructed in Step 1. Notice how only one player can control the dot and how the two games show the exact same screen. Depending on the speed of your computer, one game may move more smoothly than the other.
3. Control Your Dots
The next step is to give each of the players his or her own dot to control. We're going to make Wackadot work with as many players as you'd like, so we need a structure which is capable of holding as many dot Sprites as there are players. Since the number of players does not change once the game has started, an array is a good structure for holding the dots. Make the following changes shown in bold in the table below.
| C | Source code | Explanation of Source code |
12 13 14 15 16 ... 48 49 50 51 52 53 54 55 56 57 58 59 ... 83 84 ... 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
public class Wackadot extends Game
{
private Sprite[] dot;
private Sprite redDot;
...
private void makeSprites()
{
dot=new Sprite[getNumberOfPlayers()];
for(int i=0; i<dot.length; i++)
{
dot[i]=new OvalSprite(1, 1);
dot[i].setScale(0.1);
dot[i].setLocation(0.5, 0.5);
dot[i].setColor(getColor("red"));
}
...
}
...
private void handleCollisions()
{
/* need to fill in this later */
}
public void advance()
{
if(timeLeft>0)
{
for(int i=0; i<dot.length; i++)
{
Location2D mouse=
getMouse2D(i);
dot[i].setLocation(mouse);
}
handleCollisions();
}
}
...
}
|
Line 14: makes the variable dot an array of Sprites. Originally it was a single Sprite. Only insert the [] between the Sprite and the dot. After adding this line, you will see many errors. These errors will be fixed when you complete this table. Line ...: indicates code left out. Do not copy the ellipses. Line 51: makes the array of dots capable of holding as many Sprites as there are players. You'll need to change the existing code that initialized dot to be like the new line 51 that initializes dot. Also, the lines 54-57 existed in the code, but without the [i] part. You'll need to insert the [i] part and the surrounding for loop. Line 51-58: iterates over the positions in the array initializing each element to be a red dot. Line ...: indicates code left out. Do not copy the ellipses. Line 113: the handleCollisions method needs many modifications. It's better to make many simple modifications and test them individually than to make one complex modification. We'll make the handleCollisions modifications in later steps once we have made sure everything else still works. Therefore, remove most of the lines of handleCollisions and just leave in a single comment. Line ...: indicates code left out. Do not copy the ellipses. Lines 120-125: lets player i control dot i. The variable i will iterate over the player indices. You need to only insert the for loop and change the 0 in getPlayer to i and insert the [i] beside dot. Line ...: indicates code left out. Do not copy the ellipses. |
Now run the game again as two player (as described in Step 1). You should be able to control a red dot in each of the games. Notice as well how collisions are no longer detected. We'll fix this in the next step.
4. Updating the handleCollisions Method
We're going to alter the handleCollisions method in this step. Originally the handleCollisions method only handled collisions for a single player. We're going to instead parameterize the method by the player index. Make the following changes shown in bold below.
| D | Source code | Explanation of Source code |
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
private void handleCollisions()
{
for(int i=0; i<dot.length; i++)
handleCollisions(i);
}
private void handleCollisions(int playerIndex)
{
if(dot[playerIndex].intersects(blueDot))
{
repositionRandomly(blueDot);
if(dot[playerIndex].getColor().equals(getColor("blue")))
{
dot[playerIndex].setColor(getColor("red"));
score++;
}
else
{
score--;
}
updateScore();
}
if(dot[playerIndex].intersects(redDot))
{
repositionRandomly(redDot);
if(dot[playerIndex].getColor().equals(getColor("red")))
{
dot[playerIndex].setColor(getColor("blue"));
score++;
}
else
{
score--;
}
updateScore();
}
}
|
Lines 113-114: handleCollisions now calls the parameterized handleCollisions for each player declared on line 7. This should now be the only code in this method. Lines 117-147: instead of checking for collision with the single dot in the one player version, this checks for collision with the player indicated by the parameter playerIndex. This should be the only code in this method. Notice that this is the changed code from the code which is commented out in table C. |
Now play the game again two player. Each player should be able to control his or her own dot and the score should be kept. If your computer is fast enough, try running it three or more players.
5. Posting
Posting your game to this wiki or a web is just about as simple as posting a single player game. See this tutorial for instructions on posting your game. The instructions here are for putting up your multiplayer game on a site already running the FANG Engine server. Web servers are usually not configured to also serve as FANG Engine game servers. Contact your instructor if you would like to post your multiplayer games on another site for local information about how to post. If you are an instructor, please contact me at cjenkins at ggc.edu and I can guide you through the process of setting up your own FANG Engine server.
If you have any questions about making this game multiplayer, be sure to take a look at the FAQ. Chances are someone else has had the same difficulty and the solution has been posted.
Good luck making your multiplayer games with the FANG Engine. I'm always interested in posting well commented well designed games that are fun to play. Visit the sample student games for some example networked games.
- This page was last modified on 20 October 2009, at 13:22.
- This page has been accessed 80 times.
- Privacy policy
- About FANG
- Disclaimers
- Powered by MediaWiki!












