Komponenta: Timer i sistemsko vreme

Timer – Ova komponenta predstavlja sat i jedna je od nevizuelnih komponenti (ne vidi se za vreme izvršavanja aplikacije). Koristi se za to da se u zadatim vremenskim intervalima aktivira neki događaj. Komponenta Timer izvršava periodično deo programskog koda, bez obzira na stanje programa.

Timer – klasa koja se koristi kada u određenim intervalima ponavljamo akciju

Šta koristimo:

.Interval

.Enabled

Tick – događaj koji pokreće neku isprogramiranu akciju

Da bi timer bio aktivan podesimo osobinu Enabled na True a osobinu Interval na neki ceo broj milisekundi (npr 1000). Povećanjem ili smanjenjem vrednosti za Interval usporavaćemo ili ubrzavati pojavljivanje izvršavanja isprogramirane akcije tj. ova osobina određuje takt časovnika tj. vremenski interval. Nakon svakog intervala pojavljuje se jedan otkucaj tj. Tick događaj za koji ćemo vezatinašu akciju . Preporučivo je da se podesi naziv metode koja će se izvršavati na svaki događaj Tick na neko ime koje ima smisla  (npr. casovnik_Tick)

Primer jednog jednostavnog zadatka sa upotrebom tajmera možete pogledati na :

https://www.its.edu.rs/programski-jezik-c-15-timer-komponenta/

Sistemsko vreme

Bez prikaza odnosno informacije o vremenu mnoge aplikacije jednostavno ne mogu da se zamisle. Rad sa vremenom koje obuhvata podatke o datumu i vremenu je omogućeno pomoću strukture DateTime koja je deo System prostora imena (namespace). Ova struktura sadrži sistemsko vreme koje se dobija korišćenjem statičkog svojstva Now.

Ako se koriste metode ToShortDateString() i ToLongTimeString() dobija se datum odnosno vreme u obliku stringa. Datum je u formi dan, mesec, godina a vreme u formi sat, minuti i sekunde.

Primer u kojem se vrši prikaz sistemskog vremena možete pogledati na:

https://svetinformatikeiprogramiranja.files.wordpress.com/2013/09/osnoveprogramskogjezikac-2.pdf#page=101


vežba, 29.mart - igrica

Zadatak:

Kreiramo igricu sa sledećim parametrima:

  • sa vrha forme ka dnu silazi sličica (po vašem izboru, a u ovom primeru će 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: https://clipartart.com/images250_/water-icon-clipart-3.png
    • 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 bodovi, 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= Convert.ToString(poena);
    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.

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;
}

treće: 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();
var opseg = this.Size - pictureBox1.Size;
var NovaPozicija = R.Next(0, opseg.Width);
(sender as PictureBox).Location = new Point(NovaPozicija, 0);
}

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

.....

Last modified: Monday, 29 March 2021, 12:30 PM