fang wackadot

Download Report

Transcript fang wackadot

Using FangEngine
The FangEngine is created by Brian C. Ladd &
Jam Jenkins
Presentation by Pepper
With much credit to:
Jenkins, Jam & Brian C. Ladd. Introductory
Programming with Simple Games. Mass: Wiley,
2011
Teach Your Program
• Teach your program to play a game without
you having to learn much about how Java
plays a game.
• Basic engine:
– Networked
– Knows about players
– Knows about how games are played
Game Playing Basics
• Define setup
– Create/gather playing components
– Set initial configuration
• Define advance
– Update game state
• Call setup
• While (not game over)
– Show game state
– Get input from user
– Call advance
• Indicate winner (or tie)
* From Jenkins, Jam & Brian C. Ladd. Introductory Programming with Simple Games.
Mass: Wiley, 2011, 28-29
Resources
• Fang Engine main page
http://www.fangengine.org/index.php/Main_Page
• Download jar – fang 2
http://www.fangengine.org/index.php/download
• Install in BlueJ
http://www.fangengine.org/index.php/Tutorials/BlueJ
• Tutorial for creating wackadot (but older fang engine
and more than we are including)
http://www.fangengine.org/index.php/Tutorial:Wackadot
Bring in the Fang Knowledge
• Bring the Fang 2 engine knowledge into our
program so we can call on it.
import fang2.core.*;
import fang2.sprites.*;
import java.awt.*;
import java.awt.geom.*;
Package
• Set up a package so we can export easily
package wackadot;
import fang2.core.*;
import fang2.sprites.*;
import java.awt.*;
import java.awt.geom.*;
Comment
•
•
•
•
•
•
•
/**
* Use mouse to wack dots and move them.
* Score points for wacking dots
*
* @author kris pepper
* @version 1
*/
Inheritance
• Make our class be an extension of the GameLoop class. Now our
Wackadot will know everything GameLoop knows
• We can use the variables GameLoop has plus we can add our own
• We can use the methods GameLoop has
– Plus add our own
– Plus Override GameLoop’s methods if we want to change what they
do. (That is how we will teach Wackadot what we want that is
different from GameLoop.)
•
•
•
•
•
public class Wackadot extends GameLoop
{
// note that GameLoop contains the variable canvas
// it also has a variable called random
}
Main Method
• Add a main method so we can create a wackadot
instance using the blueprint we are writing.
• We can then run the game as an application by
asking our wackadot instance to run itself.
public static void main(String[] args)
{
Wackadot mygame = new Wackadot();
mygame.runAsApplication();
}
Run to see the result
Add a dot to our game
• Make a fang type of variable that knows how to
make a dot
private Sprite dot;
• Create an instance of Sprite to put into the dot
variable
• Ask that Sprite to set itself to the shape, color
and location we want.
private void makeSprites()
{ dot=new OvalSprite(1, 1);
dot.setScale(0.1);
dot.setLocation(0.5, 0.5);
dot.setColor(Color.RED); }
Now Add the Dot to the Canvas
• We have a dot variable filled with a Sprite
• Now add the dot to the canvas
• Override the startGame method to tell it to add a dot
@Override
public void startGame()
{
makeSprites();
addSprites();
}
private void addSprites()
{ canvas.addSprite(dot); }
Run to see the result
Add a mouse event
• Make the Sprite move with Mouse
@Override
public void advanceFrame(double timePassed)
{
Point2D.Double mouse=
getPlayer().getMouse().getLocation();
dot.setLocation(mouse);
}
Run to see the result
2 More Dots – Random Locations
• Make 2 more dots appear
• Add 2 more variables
private Sprite redDot;
private Sprite blueDot;
• Create instances of Sprites to put into those new boxes
inside makeSprites()
redDot=new OvalSprite(1, 1);
redDot.setScale(0.1);
redDot.setLocation( random.nextDouble(),
random.nextDouble()); redDot.setColor(Color.RED);
Repeat for blueDot
Add the 2 dots to the canvas
• Change addSprites to add 2 more dots
private void addSprites() {
canvas.addSprite(dot);
canvas.addSprite(redDot);
canvas.addSprite(blueDot);
Run to see the result
Handle Collisions
• Handle collisions by detecting them and then
repositioning:
private void handleCollisions()
{
if (dot.intersects(blueDot))
{
blueDot.setLocation(
random.nextDouble(),
random.nextDouble());
}
Repeat for redDot
Tell the fang2 engine how to advance
• Fang2 engine wont use your collision handling unless
you tell it
• Tell it to run your method after every move:
@Override
public void advanceFrame(double timePassed)
{
Point2D.Double mouse =
getPlayer().getMouse().getLocation();
dot.setLocation(mouse);
handleCollisions();
}
Run to see the result
Add a Score
• Add a Sprite that knows about text:
Private StringSprite scoreSprite;
• Add a variable to keep track of collisions
private int redScore, blueScore;
• Set the scores to 0 when the game starts
@Override
public void startGame()
{
makeSprites();
addSprites();
redScore = 0;
blueScore = 0;
}
Add the Score Object to the Canvas
• Create the Sprite instance to put into your
scoreSprite inside makeSprite:
scoreSprite=new StringSprite("Red Score: " + redScore +
" Blue Score: "
+ blueScore);
scoreSprite.setHeight(0.08);
scoreSprite.rightJustify();
scoreSprite.topJustify();
scoreSprite.setLocation(1, 0);
• Add the score to your canvas inside addSprite
canvas.addSprite(scoreSprite);
Increase the Score upon a hit
• Upon a hit, increase the score
• Also, reset the scoreSprite to show the new score
private void handleCollisions()
{
if (dot.intersects(blueDot))
{
blueDot.setLocation(
random.nextDouble(),
random.nextDouble());
blueScore++;
scoreSprite.setText("Red Score: " + redScore + " Blue Score: "
+ blueScore);
}
Run to see the result
Your Job
• Add one more Yellow Sprite
• When the Yellow Sprite is hit, reduce one
point from the blue and red scores
• Change the Red Sprite to start in the upper
left corner
• Make any other changes to the game logic you
like. See available methods for fang2 sprites
at:
http://www.fangengine.org/images/docs/api/