Angry Birds: Find the pigs and execute a shot.
Identify the slingshot and pigs
After configure the environment is time to programming, so let’s start to understand how to identify the slingshot and pigs. To do this, we need a
Vision object, like this:
1 2 BufferedImage screenshot = ActionRobot.doScreenShot(); Vision vision = new Vision(screenshot);
ActionRobot can communicate with Chrome plugin and make a screenshot from Angry Birds game, with this screenshot we create a
Vision object that will be used to analyze the screenshot and find the slingshot:
1 Rectangle sling = vision.findSlingshotMBR();
So, the slingshot is a rectangle like this
java.awt.Rectangle[x=185,y=317,width=17,height=66] with your position on screen.
And we also can find the pigs:
1 List<ABObject> pigs = vision.findPigsMBR();
Each pig is returned in a list of
ab.vision.ABObject, a class that extends
java.awt.Rectangle and contains the type of component (Ground, Hill, Sling, Bird, Pig, Ice, Wood, Stone, etc). When you print a ABObject you have some like this
ab.vision.ABObject[x=537,y=291,width=11,height=10] if you are using
findPigsMBR(), just the rectangle of the component; or you can see some like this
Circ: id:1 type:Pig r: 7,250 at x:543,5 y:294,0, if you are using
findPigsRealShape() with the information of type, angle, etc.
With these informations we know the position of slingshot and the position of pig, so we can try to estimate the trajectory of shoot the bird in direction of the pig.
To execute the shot, we will use
ab.demo.other.Shot class, the constructor receive as parameter the position x and y from slingshot, the positions x and y from release point, a value zero (wait time before launch the bird), and a time that execute the tap in case when the bird have same effect like split into three or increase speed.
1 2 3 4 Shot shot = new Shot(193, 328, -100, 50, 0, 0); ActionRobot aRobot = new ActionRobot(); aRobot.cshoot(shot);
Create a Shot object that inform to start the pull in position
(193, 328), that correspond of slingshot position, and the value
-100 say that need pull back in
x axis and the value
50 say that need to pull down in
y axis. To execute the shot just need to call
cshoot(shot) method from
But, how do I know how many I need to pull back and pull down the slingshot?