Processing – vytváříme jednoduchou hru - Tenis

Autor: Tonda Seiner <seinert(at)seznam.cz>, Téma: Programujeme, Vydáno dne: 02. 02. 2014

tenis_250

Seznámíme se se základními grafickými prvky jako je obdélník a čtverec a pomocí několika podmínek a funkcí vytvoříme jednoduchou hru, aby mělo naše učení i nějaký výsledek. Program je záměrně napsán velice jednoduše, aby i kluci z kroužku pochopily základy, vždyť někteří chodí teprve do třetí třídy ZŠ.



vice_120



Zde máme jednoduchý příklad pohybu míčku po hřišti. V tomto případě se míček odráží od

mantinelů a svislý pohyb ovládáme myší , jedná se pouze o základní ukázku.

int i=0;

int m=0;

void setup(){

size(480,280);

}

void draw(){

background(255,255,255); //barva hriste

//micek

fill(237,10,30); //barva mice

ellipse(i,mouseY,30,30);

//sit

fill(10,237,30); //barva site

rect(width/2,0,5,280);

// Pohyb mice

if (i>=(width-15))m=1;

if (m==0)i++;

if (m==1)i--;

if (i<=15)m=0;

}

Nyní přikládám funkční program včetně komentářů, předpokládám že bude vše jasné.

/***************************** PROGRAM TENIS ************************/

// Ukazkový program TENIS

import ddf.minim.*;

Minim minim;

AudioSample kick;

AudioSample snare;

int x=50; //vodorovná osa pohybu míče

int y=50; //svislá osa pohybu míče

int ny=0;

int mx=0; //paměť pohybu míče ve vodorovné ose

int my=0; //paměť pohybu míče ve svislé osa

float p=0; //pozice pálky počítače

int score_l=0; // skore počítače

int score_p=0; // moje skore

boolean hra= false; //paměť běhu hry

boolean Game=false; //paměť ukončení hry při dosažení skore

void setup()

{

size(500,300);

frameRate(100);

y=100;

minim = new Minim(this);

// load BD.wav from the data folder

kick = minim.loadSample( "BD.mp3",512);

if ( kick == null ) println("Nelze otevřít kick!");

// load SD.wav from the data folder

snare = minim.loadSample("SD.wav", 512);

if ( snare == null ) println("Nelze otevřít snare!");

}

void draw(){

//pozadí hřiště

background(255,255,255);

// síť

fill(10,237,30);

rect(width/2,0,5,400);

//tenisák

fill(245,198,44);

ellipse(x,y,30,30);

// moje pálka

fill(10,30,237);

rect(475,mouseY,5,50);

//pohyb pálky počítače

if (y>p)p=p+0.8;

else p=p-0.8;

// pálka počítače

fill(237,10,30);

rect(20,p,5,50);

//zobrazení skore

textSize(40);

text(score_l+":"+ score_p,223,35);

if (hra)

{

Leva_p(); //volání funkce vyhodnocení kontaktu míčku s pálkou počítače

Prava_p(); //volání funkce vyhodnocení kontaktu míčku s mojí pálkou

// vyhodnocení dosažení pravéhu mantinelu

if (x>=495)

{

mx=1;

score_l++;

snare.trigger(); //zvuk

}

//pohyb míčku vpravo

if (mx==0)x=x+5;

//pohyb míčku vlevo

if (mx==1)x=x-5;

// vyhodnocení dosažení levého mantinelu

if (x<=5)

{

mx=0;

score_p++;

snare.trigger(); //zvuk

}

switch (my) //přepínač pohybu míčku ve svislé ose

{

case 0:

y=y;

break;

case 1:

y=y+1;

break;

case 2:

y=y-1;

break;

}

//odraz od spodního okraje hřiště

if (y>=285)my=2;

//odraz od horního okraje hřiště

if (y<=15)my=1;

//výpis skore na obrazovku

if (score_l==9 |score_p==9) // Konec hry

{

Game=true;

hra=false;

}

}

else

{

if (Game==false) //Zobrazí informace po zapnutí nebo ručním ukončení

{

fill(37,68,216);

textSize(40);

text("TENIS ",200,100);

fill(216,148,37);

textSize(25);

text("Start klávesou s nebo S ",100,200);

text("Konec klávesou k nebo K ",100,250);

}

else // Výpis při dosažení skore

{

fill(37,68,216);

textSize(40);

text("KONEC HRY ",150,100);

}

}

}

void keyPressed() // test stisknutí klávesnice

{

if ( key == 's' | key == 'S' ) //start hry

{

hra=true;

Game=false;

score_l=0;

score_p=0;

}

if ( key == 'k' | key == 'K' ) hra=false; //konec hry

}

void Leva_p() //pálka počítače

{

if ((x<=40) & (x>=20))

{

if ((y<=p+33) & (y>=(p+17)))

{ //rovne

mx=0; //paměť pohybu míče ve vodorovné ose

my=0; //paměť pohybu míče ve svislé ose

kick.trigger(); //zvuk pálky

}

if ((y>=p) & (y<(p+17)))

{ // nahoru

mx=0;

my=2;

kick.trigger(); //zvuk pálky

}

if ((y>p+33) & (y<=(p+50)))

{ // dolu

mx=0;

my=1;

kick.trigger(); //zvuk pálky

}

}

}

void Prava_p() //moje pálka

{

if ((x>=460) & (x<=480))

{

if ((y<=mouseY+33) & (y>=(mouseY+17)))

{ // rovne

mx=1; //paměť pohybu míče ve vodorovné ose

my=0; //paměť pohybu míče ve svislé ose

kick.trigger(); //zvuk pálky

}

if ((y>=mouseY) & (y<(mouseY+17)))

{ // nahoru

mx=1;

my=2;

kick.trigger(); //zvuk pálky

}

if ((y>=mouseY+33) & (y<=(mouseY+50)))

{ // dolu

mx=1;

my=1;

kick.trigger(); //zvuk pálky

}

}

}

Záměrně nechávám program opsat případně zkopírovat , aby jste se zamysleli nad řešením jednotlivých úkolů, případně si udělali vlastní vylepšení.

Pro funkci zvuku musíme vytvořit adresář data v adresáři programu a do tohoto adresáře zkopírovat soubory BD.mp3 a SD.wav z adresáře příkladů, které jsou uloženy v adresáři kde máte nainstalován Processing. V mém případě je cesta následující:

c:\processing-2.1\modes\java\libraries\minim\examples\TriggerASample\data\

V opačném případě můžete zakomentovat všechny odkazy na zvuk a pracovat bez zvuku