Te habrás dado cuenta que el programa ahora mismo está contabilizando puntos de más. Cada vez que la manzana cae sobre Newton, cuando el círculo toca el cuadrado, el contador sube más o menos 5 puntos. Para corregir esto podemos:
Volver a lanzar la manzana en cuanto detecte colisión.
Que deje de contar cuando haya colisión, hasta que se lance una nueva manzana.
Para cualquiera de las dos, utilizaríamos una variable de tipo boolean.
1 int nX=0;//coordenada X de Newton
2 int nY=0;//coordenada Y de Newton
3 float mY=0; //cambiamos el tipo de variable a float
4 int mX=15;//coordenada X de la manzana
5 float mV=0; //la velocidad inicial de caída de la manzana será cero
6 float mA=0.05; //aceleración inicial de la manzana
7 int p=0; //puntos
8 boolean pCount=true;
9
10 void setup() {
11 size(400,400);
12 nY=height-25;
13 }
14
15 void draw(){
16 background(200);
17
18 //Movimiento de la manzana
19 mV=mV+mA; // velocidad de la manzana en función de la aceleración
20 mY=mY+mV;//posición de la manzana en función de la velocidad
21 if (mY>height){
22 mY=15;//si toca el suelo elévala otra vez
23 mX=int(random(10,width-10));
24 mV=0;// para que empiece a caer con velocidad cero
25 pCount=true; //al caer una nueva manzana se pueden contar puntos de nuevo
26 }
27
28 fill(255);
29
30 //Detección de colisión
31 if(mY+10>nY && mY-10<nY+20){//está el círculo a la misma altura que el rectángulo?
32 if(mX+10>nX && mX-10<nX+20){//está el círculo sobre el rectángulo?
33 fill(255,0,0);//cambia el color a rojo
34 if(pCount) {
35 p=p+1; ////sólo añade puntos cuando la variable es true
36 pCount=false; // la variable cambia a false justo después de sumar puntos
37 }
38 }
39 }
40
41 ellipse(mX,mY,20,20);
42 rect(nX, nY,20,20);
43
44 //Mostramos los puntos en pantalla
45 fill(0);
46 text("Puntos: "+p, 2.8*width/4,20); //texto a la derecha de la pantalla
47 }
48
49 void keyPressed(){
50 if(keyCode == RIGHT){
51 nX=nX+3;
52 }
53 if(keyCode == LEFT){
54 nX=nX-3;
55 }
56 //Limita el valor de la coordenada X
57 if(nX<0){
58 nX=0;
59 }
60 if(nX>width-20){//Por la derecha tenemos en cuenta el tamaño del cuadrado
61 nX=width-20;
62 }
63 }
Ahora el programa cuenta un único punto por manzana. Esto es porque sólo añadimos puntos cuando la variable boolean pCount es true y cambia a false justo después de contar el punto. Cuando la manzana es relanzada, pCount vuelve a tener valor true.