Networked Wackadot

A. Setting the number of players

package wackadot;

import fang.*;
import java.awt.Color;
import java.awt.geom.*;

public class Wackadot extends GameLoop
{
    private Sprite dot;
    private Sprite redDot;
    private Sprite blueDot;

    private StringSprite scoreSprite;
    private int score;
    
    public void startGame()
    {
        makeSprites();
        addSprites();
        score=0;
    }
    
    private void makeSprites()
    {
        Ellipse2D.Double circle=new Ellipse2D.Double(0, 0, 1, 1);

        dot=new Sprite(circle);
        dot.setScale(0.1);
        dot.setLocation(0.5, 0.5);
        dot.setColor(Color.RED);

        redDot=new Sprite(circle);
        redDot.setScale(0.1);
        redDot.setLocation(random.nextDouble(),random.nextDouble());
        redDot.setColor(Color.RED);

        blueDot=new Sprite(circle);
        blueDot.setScale(0.1);
        blueDot.setLocation(random.nextDouble(),random.nextDouble());
        blueDot.setColor(Color.BLUE);

        scoreSprite=new StringSprite("Score: "+score);
        scoreSprite.setHeight(0.1);
        scoreSprite.rightJustify();
        scoreSprite.topJustify();
        scoreSprite.setLocation(1, 0);
    }
    
    private void addSprites()
    {
        canvas.addSprite(dot);
        canvas.addSprite(redDot);
        canvas.addSprite(blueDot);
        canvas.addSprite(scoreSprite);
    }

    private void updateScore()
    {
        scoreSprite.setText("Score: "+score);
    }

    public static void main(String[] argv)
    {
        Wackadot dot=new Wackadot();
        dot.players=2;
        dot.runAsApplication();
    }

    private void repositionRandomly(Sprite sprite)
    {
        sprite.setLocation(random.nextDouble(),random.nextDouble());
    }

    private void handleCollisions()
    {
        if(dot.intersects(blueDot) || dot.intersects(redDot))
        {
            long seed=(long)(1000*getTime());
            random.setSeed(seed);
        }
        if(dot.intersects(blueDot))
        {
            repositionRandomly(blueDot);
            if(dot.getColor().equals(Color.BLUE))
            {
                dot.setColor(Color.RED);
                score++;
            }
            else
            {
                score--;
            }
            updateScore();
        }
        if(dot.intersects(redDot))
        {
            repositionRandomly(redDot);
            if(dot.getColor().equals(Color.RED))
            {
                dot.setColor(Color.BLUE);
                score++;
            }
            else
            {
                score--;
            }
            updateScore();
       }
    }

    public void advanceFrame(double timePassed)
    {
        Point2D.Double mouse=getPlayer().getMouse().getLocation();
        dot.setLocation(mouse);
        handleCollisions();
    }
}


B. Tracking the players

package wackadot;

import fang.*;
import java.awt.Color;
import java.awt.geom.*;

public class Wackadot extends GameLoop
{
    private Sprite[] dot;
    private Sprite redDot;
    private Sprite blueDot;

    private StringSprite scoreSprite;
    private int score;
    
    public void startGame()
    {
        makeSprites();
        addSprites();
        score=0;
    }
    
    private void makeSprites()
    {
        Ellipse2D.Double circle=new Ellipse2D.Double(0, 0, 1, 1);

        dot=new Sprite[getNumberOfPlayers()];
        for(int i=0; i<dot.length; i++)
        {
            dot[i]=new Sprite(circle);
            dot[i].setScale(0.1);
            dot[i].setLocation(0.5, 0.5);
            dot[i].setColor(Color.RED);
        }

        redDot=new Sprite(circle);
        redDot.setScale(0.1);
        redDot.setLocation(random.nextDouble(),random.nextDouble());
        redDot.setColor(Color.RED);

        blueDot=new Sprite(circle);
        blueDot.setScale(0.1);
        blueDot.setLocation(random.nextDouble(),random.nextDouble());
        blueDot.setColor(Color.BLUE);

        scoreSprite=new StringSprite("Score: "+score);
        scoreSprite.setHeight(0.1);
        scoreSprite.rightJustify();
        scoreSprite.topJustify();
        scoreSprite.setLocation(1, 0);
    }
    
    private void addSprites()
    {
        canvas.addSprite(dot);
        canvas.addSprite(redDot);
        canvas.addSprite(blueDot);
        canvas.addSprite(scoreSprite);
    }

    private void updateScore()
    {
        scoreSprite.setText("Score: "+score);
    }

    public static void main(String[] argv)
    {
        Wackadot dot=new Wackadot();
        dot.players=2;
        dot.runAsApplication();
    }

    private void repositionRandomly(Sprite sprite)
    {
        sprite.setLocation(random.nextDouble(),random.nextDouble());
    }

    private void handleCollisions()
    {
        Instruction: Delete all code inside the handleCollisions method
          It will look like what is here except for without this instruction.
    }

    public void advanceFrame(double timePassed)
    {
        for(int i=0; i<dot.length; i++)
        {
            Point2D.Double mouse=getPlayer(i).getMouse().getLocation();
            dot[i].setLocation(mouse);
        }
        handleCollisions();
    }
}


C. Preparing for a new way to handle collisions

package wackadot;

import fang.*;
import java.awt.Color;
import java.awt.geom.*;

public class Wackadot extends GameLoop
{
    private Sprite[] dot;
    private Sprite redDot;
    private Sprite blueDot;

    private StringSprite scoreSprite;
    private int score;
    
    public void startGame()
    {
        makeSprites();
        addSprites();
        score=0;
    }
    
    private void makeSprites()
    {
        Ellipse2D.Double circle=new Ellipse2D.Double(0, 0, 1, 1);

        dot=new Sprite[getNumberOfPlayers()];
        for(int i=0; i<dot.length; i++)
        {
            dot[i]=new Sprite(circle);
            dot[i].setScale(0.1);
            dot[i].setLocation(0.5, 0.5);
            dot[i].setColor(Color.RED);
        }

        redDot=new Sprite(circle);
        redDot.setScale(0.1);
        redDot.setLocation(random.nextDouble(),random.nextDouble());
        redDot.setColor(Color.RED);

        blueDot=new Sprite(circle);
        blueDot.setScale(0.1);
        blueDot.setLocation(random.nextDouble(),random.nextDouble());
        blueDot.setColor(Color.BLUE);

        scoreSprite=new StringSprite("Score: "+score);
        scoreSprite.setHeight(0.1);
        scoreSprite.rightJustify();
        scoreSprite.topJustify();
        scoreSprite.setLocation(1, 0);
    }
    
    private void addSprites()
    {
        canvas.addSprite(dot);
        canvas.addSprite(redDot);
        canvas.addSprite(blueDot);
        canvas.addSprite(scoreSprite);
    }

    private void updateScore()
    {
        scoreSprite.setText("Score: "+score);
    }

    public static void main(String[] argv)
    {
        Wackadot dot=new Wackadot();
        dot.players=2;
        dot.runAsApplication();
    }

    private void repositionRandomly(Sprite sprite)
    {
        sprite.setLocation(random.nextDouble(),random.nextDouble());
    }

    private void handleCollisions()
    {
        for(int i=0; i<dot.length; i++)
        {
            handleCollisions(i);
        }
    }
    
    private void handleCollisions(int playerIndex)
    {
        if(dot[playerIndex].intersects(blueDot) ||
           dot[playerIndex].intersects(redDot))
        {
   	    long seed=(long)(1000*getTime());
   	    random.setSeed(seed);
        }
        if(dot[playerIndex].intersects(blueDot))
        {
            repositionRandomly(blueDot);
            if(dot[playerIndex].getColor().equals(Color.BLUE))
            {
                dot[playerIndex].setColor(Color.RED);
                score++;
            }
            else
            {
                score--;
            }
            updateScore();
        } 
        if(dot[playerIndex].intersects(redDot))
        {
            repositionRandomly(redDot);
            if(dot[playerIndex].getColor().equals(Color.RED))
            {
                dot[playerIndex].setColor(Color.BLUE);
                score++;
            }
            else
            {
                score--;
            }
            updateScore();
        }
    }

    public void advanceFrame(double timePassed)
    {
        for(int i=0; i<dot.length; i++)
        {
            Point2D.Double mouse=getPlayer(i).getMouse().getLocation();
            dot[i].setLocation(mouse);
        }
        handleCollisions();
    }
}


D. Running the game: Have one person run Wackadot, enter a name, change the server field to "server.fangengine.org" and hit start. After a second the window should display a message "Waiting for 1 player to join". After it says this, the other person should enter the same game name, the same server name, and then hit start.