vežba, - još jedna igrica

U nastavku je tekst kojim se opisuje kreiranje igrice, korak po korak.

Zadatak je dat u nivoima, svaki sledeći nivo zadatka je u stvari dodatak na ono što je dotad urađeno.

Kreiramo igricu sa sledećim parametrima:

  • sa vrha forme ka dnu silazi sličica (po vašem izboru, a u ovom primeru će biti kapljica vode )
  • ako se klikne na sličicu, dobija se 10 poena, slika nestaje i pojavljuje se negde na vrhu forme i nastavlja da pada
  • postoji taster za zaustavljanje igre (Kraj)
  • postoji taster za dodavanje još jedne slike (do najviše 3 komada u našem primeru)
  • poeni se prikazuju u gornjem levom delu forme

Jedan od načina na koji se to može izvesti:

  • Prvo se kreira novi projekat - Windows Forms ---
  • Na Internetu potražimo sličicu koja će biti naš "glavni karakter" (za ovaj primer koristiću kapljicu vode:
    • smanjiti sličicu da je i širina i visina manje od 100 piksela ... radi uštede memorijskog prostora (Paint3D)
  • Na formu se postavlja PictureBox. Podrazumevani naziv je pictureBox1, i u njega postavljamo sličicu, sa modom za Stretch image - jer je slika drugačijih dimenzija
  • u gornji levi deo forme postavljamo dve labele: u prvoj je tekst: bodovi:, a u drugu ćemo upisivati osvojene bodove, a u početku postavljamo 0.
Na formu postavljamo komponentu Timer:  a prvi postavljeni ima podrazumevano ime timer1. Cilj je da se na tik-tak tajmera, na svaki njegov tik, naš  box sa slikom pomeri malo na dole. To se radi tako što se za tajmerovo ponašanje postavi da je Enabled=true, i interval da je 200 (misli se na milisekunde za tajmer), a u događajima tajmera postoji Tick: dvoklikom na polje pored (ili dvoklikom na tajmer) kreiramo metodu koja se izvršava na svako tik tajmera (timer1_Tick). U toj metodi mi treba da pomeramo naš pictureBox1. Programski kod je dat u nastavku:
private void timer1_Tick(object sender, EventArgs e)
 {
pictureBox1.Top += 10;
if (pictureBox1.Bottom > this.Height)
                pictureBox1.Top = 0;
}
  • Što se bodova tiče, na našoj formi postavljamo javni parametar poena, tipa int (i to pre konstruktora):
public partial class Form1 : Form
    {
        public int poena;
       

podrazumevana vrednost je 0 (u programskom jeziku C#).

  • da bismo mogli da klikom na sliku radimo nešto, napisati metodu koja će da se izvršava svaki put kada se klikne mišem na pictureBox. To možemo raditi tako što 1. kliknemo na sliku i u akcijama potražimo Click (ili dvoklik na samu sliku). Okruženje u kojem radimo u našem slučaju kreira osnovni izgled metode, a naše je samo da obezbedimo potrebne funkcionalnosti. Klikom na sliku treba da se povećaju bodovi, a slika da se pomeri negde na vrh forme:

private void pictureBox1_Click(object sender, EventArgs e)
  {
    poena += 10;
    label2.Text= poena.ToString();
    Random R = new Random();
     var opseg = this.Size - pictureBox1.Size;
     var pozicijax = R.Next(0, opseg.Width);
     pictureBox1.Location = new Point(pozicijax, 0);
}

Komplikacija koju smo uveli je da se na slučajno mesto na vrhu forme postavi naš pictureBox1 - y=0, a x je neki slučajan broj između 0 i dostupne širine forme(umenjene za širinu pictureBox-a).

  • Dugme za završetak igre se radi tako što se postavi na formu jedno dugme (Button) u donji levi deo forme i u metodi za klik na dugme samo se zatvori forma. Metoda koja postoji je Close() i može se samo navesti, mada može i da se naglasi da se misli da se zatvori forma u kojoj ste:
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}

ili

private void button1_Click(object sender, EventArgs e)
 {
 Close();
 }

Sada bi trebalo da naša igra radi.

**************

opciono: Ako želite da sse igrica završi ako na primer dostignete 100 poena, možete dodati metodu za proveru:

        void proveraKraja()
        {
            if (poena >= 100)
            {
                MessageBox.Show("pobeda ....");
                this.Close();
            }
        }

i pozvati je na kraju obrade klika na sliku.

**************

sledeći nivo:

Sledeći nivo je da se kopira pictureBox1, tako da imamo više identičnih sličica, ali im osobinu Visible postavljamo na False - da se ne vide na početku.

Svako naredni picturebox bi na klik trebalo da ima identičnu funkcionalnost kao i prvi pictureBox.

Dodaje se dugme kojim se dodaje sličica po sličica: Button na kojem poše npr "dodaj + 1 (max 5). Klikom na dugme postavlja se parametar Visible na true na sledeći pictureBox.

private void button2_Click(object sender, EventArgs e)
{
if (pictureBox2.Visible == false)
pictureBox2.Show();
else if
(pictureBox3.Visible == false)
pictureBox3.Show();
else if
(pictureBox4.Visible == false)
pictureBox4.Show();
}

Da bi se sledeće sličice kretale kao i prva, potrebno je u metodu timer1_tick dodati programski kod u kojem se sličice pomeraju, ali samo ako su vidljive:

if (pictureBox2.Visible == true)
{ pictureBox2.Top += 10;
  if (pictureBox2.Bottom > this.Height)
          pictureBox2.Top = 0;
 }

 if (pictureBox3.Visible == true)
  { pictureBox3.Top += 10;
   if (pictureBox3.Bottom > this.Height)
            pictureBox3.Top = 0;
  }

U nastavku je C# fajl: Form1.cs i aplikacija koja je napravljena: buba.exe

(P.S. Ovaj primer je rađen u verziji Visual Studio Comunity 2019 )


sledeći nivo: kako se radi kada je kod malo više optimizovan

prvo: jedan Random objekat je dovoljan samo na jednom mestu: na početku, pre konstruktora

drugo: za pomeranje objekata za svaki Tik tajmera može da se koristi

    foreach(Control x in this.Controls)
if(x is PictureBox)
{
x.Top += 10;
if (x.Bottom > this.Height) x.Top = 0;
}
**************************************************************

NOVO GRADIVO: Kastovanje komponente iz programskog koda

Ako kliknete na sliku, treba da se nešto desi sa njom. U našem slučaju treba da se dobiju poeni i da se slika pomeri negde pri vrhu forme. Ako biste za svaku sliku kreirali poseban događaj Click - nije problem ako imate malo slika na formi.

Ali, šta ako na primer imate 150 slika?

Ako pogledate kako izgleda metoda

private void pictureBox1_Click(object sender, EventArgs e)
  {

vidite da postoji kao prvi parametar "object sender" - to je u stvari onaj objekat na koji je kliknuto. ( U našem primeru se klikće na pictureBox.)

E sada, možemo da upotrebimo taj object sender da identifikujemo ko je kliknuo i da se onda kreira programski kod koji se odnosi samo na objekat koji je u stvari uradio taj klik - i da se taj objekat pomeri na neku slučajnu poziciju pri vrhu forme.

// type-kastovanje komponente koja je kliknuta

PictureBox ovaSlika = (PictureBox)sender;
var opseg = this.Size - ovaSlika.Size;
var pozicijax = R.Next(0, opseg.Width);
ovaSlika.Location = new Point(pozicijax, 0);

Sender je objekat koji treba da se tretira kao PictureBox - za to nam služi zagrada ispred - pa se to ubaci u lokalnu promenljivu koju smo nazvali ovaSlika. Dalje se sa tom lokalnom promenljivom radi kao i sa svakim drugim pictureBox-om.

Na ovaj način može da se ista metoda dodeli svim ostalim slikama i da se klikom na sliku dotična (kliknuta) slika pomeri (i dodaju bodovi po potrebi).

******************************

treće - Uz upotrebu prethodne lekcije: za svaki PictureBox se za klik može pozvati ista metoda, korišćenjem sledećeg:

 private void PoeniPlus(object sender, EventArgs e)
{
poeni += 10;
lblPoeni.Text = poeni.ToString();
PictureBox ovaSlika = (PictureBox)sender;
var opseg = this.Size - ovaSlika.Size;
var NovaPozicija = R.Next(0, opseg.Width);
ovaSlika.Location = new Point(NovaPozicija, 0);
}

četvrto: za start i stop se može raditi start i stop tajmera, sa nuliranjem brojača  ....

Pokušajte da sami kreirate ovu igricu.

Zatim izmenite nešto (na primer da umesto kapljica vode silaze pauci ili bubice)


Last modified: Wednesday, 27 March 2024, 10:13 AM