boolean inflight = false; float speed = 20; float hspeed; float vspeed; float voldspeed; float vnewspeed; float angle = 65; float deltaa = 3; float deltas = 2; float angler; float lastangler= 0; float g = 1; float posx = 100; float posy = 5; float groundlevel = 300; PFont font; float targetx, targety,targetw,targeth; float cannonx = 100; boolean targetok = true; void setup() { background(102,255,255); size(800,400); font = createFont("Ariel",15); textFont(font); fill(255,0,250); text("Speed ",330,50); text(int(speed),390,50); text("Angle ",460,50); text(int(angle),500,50); text("Mouse on red arrow to fire. Left or right arrow keys to change speed. Up or down change angle.",10,80); createtarget(); positioncannon(); //positionball(); frameRate(6); } void draw() { if (inflight) { background(102,255,255); //comment this line to see arc fill(255,0,250); text("Speed ",330,50); text(int(speed),390,50); text("Angle ",460,50); text(int(angle),500,50); if (targetok) { drawtarget(); } positioncannon(); advanceball(); } } void positioncannon(){ fill(40,200,0); rect(0,groundlevel,800,100); fill(255,0,0); triangle(700,groundlevel+10,750,groundlevel+50,700,groundlevel+90); angler = -PI*angle/180; pushMatrix(); translate(cannonx,groundlevel); rotate(angler); stroke(0,0,0); fill(240); rect(0,0,100,10); } void positionball() { fill(51,0,102); ellipse(posx,posy,10,10); } void advanceball() { popMatrix(); voldspeed = vnewspeed; vnewspeed = voldspeed + g; vspeed = .5*(voldspeed + vnewspeed); posx = posx + hspeed; posy = posy + vspeed; if (posy>=groundlevel) { inflight = false; } if (hittarget(posx,posy)) { explodetarget(); inflight = false; } else { positionball(); } } void mousePressed() { if (ontriangle()) { angler = -PI*angle/180; hspeed = speed * cos(angler); vnewspeed = speed * sin(angler); voldspeed = vnewspeed; posx = cannonx + 100*cos(angler); posy = groundlevel + 100*sin(angler); inflight = true; targetok = true; } } void createtarget() { targetx = 600; targety = groundlevel-100; targetw = 30; targeth = 100; drawtarget(); } void drawtarget() { fill(250,250,0); rect(targetx,targety,targetw,targeth); } boolean hittarget(float posx,float posy) { if ((posx>targetx)&&(posx<(targetx+targetw))&&(posy>targety)&&(posy<(targety+targeth))){ return true;} else { return false; } } void explodetarget() { targetok = false; fill(102,255,255); noStroke(); rect(targetx,targety,targetw+1,targeth); fill(0,0,0); quad(targetx-50,groundlevel+10,targetx,groundlevel-50,targetx+targetw,groundlevel-60,targetx+targetw+30,groundlevel+5); } boolean ontriangle() { // sloppy test to determine if mouse is over the triangle if ((mouseX>700)&&(mouseX<750)&&(mouseY>(groundlevel+10))&&(mouseY<(groundlevel+90))) {return true;} else { return false;} } void keyPressed() { if (keyCode==UP) { angle +=deltaa; } if (keyCode==DOWN) { angle -=deltaa; } if (keyCode==RIGHT) { speed +=deltas; } if (keyCode==LEFT) { speed -=deltas; } //fill(102,255,255); //noStroke(); //rect(330,30,200,30); background(102,255,255); fill(255,0,250); text("Speed ",330,50); text(int(speed),390,50); text("Angle ",460,50); text(int(angle),500,50); positioncannon(); popMatrix(); drawtarget(); }