logo
MagyarEnglish

Programozási alapismeretek | Samu Bence
Tartalomjegyzék
Programozási alapismeretek | Samu Bence
1.óra
2.óra
3.óra
4.óra
Minden oldal

 

MOME, 2010/11 tanév, I. szemeszter

Kurzus neve: Programozási alapismeretek | Kurzuskód: 124-13-03

Oktató: Samu Bence

Időpontok: 2-3. hét - Szerda 8.30-12.50, Péntek: 8.30-18.00 |  Helyszín: B101

Évfolyam: BA II. - kötelező

Kredit: 2

Számonkérés módja: GY/Gyak.

 

This browser does not have a Java Plug-in.
Get the latest Java Plug-in here.

Kurzusleírás:

 

Kurzus témája:
A kurzus célja, hogy bevezesse a hallgatókat a programozott kép, animáció és
interakció területeibe. A végeredmény egy, minden diák munkáját tartalmazó
interaktív, gesztus vezérelt festő szoftver lesz, mely online, vagy installációként is
prezentálható.
 

Feladat:
A kurzus első felében az elméleti alapokat alátámasztó, kisebb feladatokat kell
elkészíteni. Ezután az elsajátított programozási alapelveket a hallgató egy önállóan
elkészített programban alkalmazza.
 

Értékelés szempontjai:
• Órai jelenlét, aktivitás
• Elkészítendő feladat ötletessége, összetettsége.
• Megvalósítás minősége
 

Technika, beadáshoz szükséges formátum:
 

Ajánlott szakirodalom:
• Getting started with Processing (Casy Reas, Ben Fry)
• Processing: A Programming Handbook for Visual Designers and Artists (Casy
Reas, Ben Fry)
• Learnin Processing: A Beginner’s Guide to Programming Images, Animations
and Interaction (Daniel Shiffman)
 

 processing.org/

www.openprocessing.org/

http://www.learningprocessing.com

 


 

1.óra

 

Dinamikus rajrolás WIDTH, HEIGHT beépített változók használatával

 

size(600, 400);

ellipse(width / 2, height / 2, width, height);

line(0, height / 2, width, height / 2);

line(width / 2, 0, width / 2, height);

 


Processing program szerkezete

 

void setup()
{
  // ez a resz egyszer az elejen fut le
  println("beallitaasok"); 
}

void draw()
{
  // ez a resz folyamatosan fut
  // ahogy befelyezodott az utolso muvelet, az elso sorrak kezdi elorol
  println("loop");
}

void mousePressed()
{
   // ez a programresz akkor fut le, ha az eger gombja le lett nyomva
   println("eger lenyomva");
}

void keyPressed()
{
  // ez a programresz akkor fut le, ha egy billentyu le lett nyomva
   println("bill lenyomva");
}

 


Változó típusok

 

int egeszSzam;

float valosSzam;

String szoveg;

char karakter;

boolean ketAllapotu;

 


Példa változók használatára

 

int xPozicio;
int sebesseg;

void setup()
{
  size(600, 400);
  xPozicio = 0; 
  sebesseg = 5;
}


void draw()
{
  // mindig torli a kepernyot
  background(255, 0, 0);   
 
  // kirak ellipszist az adott koordinatakra
  ellipse(xPozicio, height / 2, 50, 50); 
 
  // noveli a valtozo erteket
  xPozicio = xPozicio + 5;
  
  println(sebesseg);
}

void keyPressed()
{
  // megvaltoztatja a valtozo elojelet
  sebesseg = -sebesseg;
}
 


Generatív óra feladat (egyszerű példa)

 

int masodperc;
int perc;
int ora;

void setup()
{
  size(600, 400);
  noFill();
}

void draw()
{
  background(255, 255, 255);

  masodperc = second();
  perc = minute();
  ora = hour();
 
  stroke(255, 0, 0);
  ellipse(masodperc * 10, height / 2, 50, 50);
 
  stroke(0, 255, 0);
  ellipse(perc * 10, height / 2, 100, 100);
 
  stroke(0, 0, 255);
  ellipse(ora * 25, height / 2, 150, 150);    
}
 


 

2.óra

Péda: random walker

 

float posX, posY, meret;

void setup()
{
  size(600, 400); 
 
  posX = random(width);
  posY = random(height);
  meret = random(5, 20);
}

void draw()
{
  posX += random(-5, 5); 
  posY += random(-5, 5);
 
  ellipse(posX, posY, meret, meret);  
}
 


Feltétel vizsgálat

 

void setup()
{
  size(600, 400);
  background(255, 255, 255);
}

void draw()
{
  if (mousePressed == true)
  {       
    float d = dist(pmouseX, pmouseY, mouseX, mouseY);
    fill(0, 0, 0, 20);
    noStroke();
    ellipse(mouseX, mouseY, d + 15, d + 15);
    fill(255, 255, 255);
    stroke(0);
    ellipse(mouseX, mouseY, d, d);
    line(pmouseX, pmouseY, mouseX, mouseY);
  }
}


Feltétel vizsgálat (összetett feltétel)

 

void setup()
{
  size(600, 400);
}

void draw()
{
  background(255, 255, 255);

  if (mouseX < 200)
  {
    // 0 - 199
    fill(255, 0, 0);
    ellipse(mouseX, mouseY, 50, 50);
  }   
  // ha az egerX nagyobb, mint 199 ES kisebb, mint 401, akkor...
  if (mouseX > 199 && mouseX < 401)
  {
    // 200 - 400
    fill(0, 0, 255);
    ellipse(mouseX, mouseY, 50, 50);
  }

  if (mouseX > 400)
  {
    // 401 - ....
    fill(0, 255, 0);
    ellipse(mouseX, mouseY, 50, 50);
  }
}
 


Egy egyszerű játék, egy összetettebb probléma szemléltetésére

 

float x, y;
float ellensegX, ellensegY;
int pontszam;

PFont font;

void setup ()
{
  size (600, 400);
 
  // kezdoertekek megadasa
  x = random (0, width);
  y = random (0, height);

  ellensegX = random (0, width);
  ellensegY = random (0, height);
  pontszam = 0;
 
  // font betoltese :: Tools->Create Font !!!
  font = loadFont ("Detonator-48.vlw");
  textFont (font);
  textSize (24);
}

void draw ()
{
  background (0, 100, 20);   
 
  // az ellenseg mozgatasa
  ellensegX += random (-2, 2);
  ellensegY += random (-2, 2);
 
  // az ellenseg es a jatekos nem hagyhatja el a kepernyot
  // ha ez tortenne a visszakerulnek az ellenkezo oldalra
 
  if ( x > width)
  {
    x = 0;
  }
  if (x < 0)
  {
    x = width;
  }
  if ( y > height)
  {
    y = 0;
  }
  if (y < 0)
  {
    y = height;
  }
  if ( ellensegX > width)
  {
    ellensegX = 0;
  }
  if (ellensegX < 0)
  {
    ellensegX = width;
  }
  if ( ellensegY > height)
  {
    ellensegY = 0;
  }
  if (ellensegY < 0)
  {
    ellensegY = height;
  }
 
  // pont szerzes, ha a jatekos es az ellenseg
  // kozotti tavolsag kevesebb mint 10 pixel
  // az ellenseg ujraszuletik egy veletlenszeru helyen
  if (dist(x, y, ellensegX, ellensegY) < 10 )
  {
    pontszam += 1;
    ellensegX = random (0, width);
    ellensegY = random (0, height);
  }
 
  // a grafika kirajzolasa
 
  // pontszamok
  fill (255, 255, 255);
  text ("pontszamok: " + pontszam, 10, 20 );

  // jatekos
  noStroke ();
  fill (0, 0, 0);
  ellipse (x, y, 10, 10);

  // ellenseg
  noStroke ();
  fill (255, 0, 0);
  ellipse (ellensegX, ellensegY, 5, 5);
}

// a keyPressed programresz akkor fut le, ha lenyomtunk egy billentyut
// ha a nyilakat nyomtuk le, a jatekos poziciojat
// novelni, vagy csokkenteni kell
void keyPressed ()

  if (keyCode == 37)
    //balra nyil
  {
    x -= 5;
  }
  if (keyCode == 39)
    //jobbra nyil
  {
    x += 5;
  }
  if (keyCode == 38)
    //lefele nyil
  {
    y -= 5;
  }
  if (keyCode == 40)
    //felfele nyil
  {
    y += 5;
  }
}


3.óra

Saját függvények létrehozása:

 

void setup()
{
  size(600, 400); 
}

// parameter nelkult fuggveny
void rajzoljKortKozepre()
{
  fill(128);
  stroke(0);
  ellipse(width / 2.0, height / 2.0, 50, 50);
}

// ket parameteres fuggveny
// a fuggvenyen belul az "kozepX" es "kozepY" valtozokkal
// hivatkozhatunk az atadott parameterekre
// jelen esetben az arc kozeppontjara
void rajzoljFejet(float kozepX, float kozepY)
{
  // fej
  stroke(0, 0, 0);
  fill(#EAC86F);
  ellipse(kozepX, kozepY, 100, 200);  
  // szemek
  fill(0, 0, 0);
  ellipse(kozepX - 10, kozepY - 30, 15, 15);
  ellipse(kozepX + 10, kozepY - 30, 15, random(5, 15));  // tikkelo szem
  // szaj
  fill(255, 0, 0);
  ellipse(kozepX, kozepY + 50, 50, random(4, 9));  // blablabla
  // szembogar
  fill(255, 255, 255);
  ellipse(kozepX - 8, kozepY - 30, 4, 4);
  ellipse(kozepX + 8, kozepY - 30, 2, 2);
}

// "float" vagyis tort szammal visszatero fuggveny
// a "return" kulcsszo utani ertek lesz a fuggveny visszateresi erteke
float celsiusFarenheitben(float celsius)
{
  float farenheit = celsius * 1.8 + 32;
 
  return farenheit;
}
 


 

 

for ciklus

 

for ( valtozó definiálása ; feltétel ameddig a ciklus ismétlődjön ; definiált váltózóval végrehajtott művelet)

{

 

}

 

void setup()
{
  size(600, 400);
}

void draw()
{
 
  background(255, 255, 255);
 
  stroke(0, 0, 0);
 
  for (int x = 0; x < width; x += 2)
  {
    line(x, 0, x, height);
  }
 
  noFill();
  for (int r = 0; r < height; r += 3)
  {
     ellipse(mouseX, mouseY, r, r);
  }
   
  for (int n = 0; n < 100; n += 1)
  {
    line(random(0, width), random(0, height), random(0, width), random(0, height));
  }
 }


Példa for ciklusra:

 

void setup()
{
  size(600, 400);
}

void draw()
{
  background(255, 255, 255);
 
  for (int x = 0; x <= width; x += 15)
  {
    // font vizszintesen
    line(x, 0, mouseX, mouseY);
    // lent vizszintesen
    line(x, height, mouseX, mouseY);
  }

  for (int y = 0; y <= height; y += 15)
  {
    // bal fuggoleges
    line(0, y, mouseX, mouseY);
    // jobb fuggoleges
    line(width, y, mouseX, mouseY);
  }

}
 


Kép és Font betöltése:

 

PFont betukeszlet;

 

PImage kep;

 

void setup()

 

{

 

  size(300, 300);

 

  betukeszlet = loadFont("valameyikFont.vlw");

 

  textFont(betukeszlet);

 

  textSize(12);

 

 

 

  kep = loadImage("egySzepKep.jpg");

 

}

 

void draw()

 

{

 

  fill(255, 255, 255);

 

  image(kep, 0, 0, width, height);  

 

  text("Ez egy szep kep", 10, 10);    

 

}

 


 

4.óra

több funkciós rajprogram

 

int festoMod;

void setup()
{
  size(600, 400);
  background(255, 255, 255);
 
  festoMod = 0;
}

void draw()
{
  if (mousePressed == true)
  {
    if (festoMod == 0)
    {
      fujj(mouseX, mouseY);
    }
    if (festoMod == 1)
    {
      rajzoljEgyArcot(mouseX, mouseY);
    }
  }
}

void fujj(float x, float y)
{
  fill(0);
  noStroke();
 
  for (int n = 0; n < 20; n += 1)
  {
    ellipse(x + random(-10, 10), y + random(-10, 10), 2, 2);
  }
}

void rajzoljEgyArcot(int x, int y)
{
  noFill();
  stroke(0);
  ellipse(x, y, 100, 100);
  ellipse(x - 30, y - 10, 30, 30);
  ellipse(x + 30, y - 10, 30, 30);
  ellipse(x, y + 30, 50, 5);
}

void keyPressed()
{
  if (key == '1')
  {
    festoMod = 0;
  }
  if (key == '2')
  {
    festoMod = 1;
  }
}


Pattogó labda

 

float x, y, vx, vy;

void setup()
{
  size(100, 100);
  x = random(0, width);
  y = random(0, height);
 
  //vx = random(-1, 1);
  //vy = random(-1, 1);
 
  vx = cos( radians(32) );
  vy = sin( radians(32) );
 
}

void draw()
{
  background(255, 255, 255);
 
  x += vx;
  y += vy;
 
  if (x < 0)
  {
    vx = -vx;
  }
  if (x > width)
  {
    vx = -vx;
  }
  if (y < 0)
  {
    vy = -vy;
  }
  if (y > height)
  {
    vy = -vy;
  }
 
  ellipse(x, y, 2, 2);
}


 Tömb használata:

 

tomb valtozo letrehozasa

float[] tomb;

tomb meretenek meghatarozasa

tomb = new float[hanyDarab];

a tomb elemeire a kapcsos zarojelek koze irt indexszammal lehet hivatkozni

tomb[0] = ertek;

tomb[1] = masikErtek;

println( tomb[0] );


Részecske rendszer létrehozása:

 

int db;
// egy elem tulajdonsagai
float[] x, y, meret;
color[] szin;

void setup()
{
  size(500, 500);
 
  db = 1000; // hany darab elem legyen
 
  // tulajdonsagok inicializalasa
  x = new float[db];
  y = new float[db];
  meret = new float[db];
  szin = new color[db];
 
  // kezdoertekek megadasa
  for (int i = 0; i < db; i += 1)
  {
    x[i] = width / 2;
    y[i] = height / 2;
    meret[i] = random(5, 10);   
    szin[i] = color( random(255) , 0, 0, random(10, 30));
  } 
  noStroke();
  background(255, 255, 255);
}

void draw()
{
  for (int i = 0; i < db; i += 1)
  {
    //elem mozgatasa
    x[i] += random(-5, 5);
    y[i] += random(-5, 5);
   
    // elem szine
    fill( szin[i] );
    // elem kirajzolasa
    ellipse(x[i], y[i], meret[i], meret[i]);
  }
 
  //saveFrame("seq#####.tif");
}


Kép színeinek felhasználása, kép alapú effekt

 

PImage kep;

void setup()
{
  kep = loadImage("hatter.jpg");
 
  size(kep.width, kep.height);
 
  background(0, 0, 0);
  noStroke();
}

void draw()
{
  float meret = 2 + mouseX / 10.0;
 
  for (int i = 0; i < 100; i++)
  {
    float x = random(0, width);
    float y = random(0, height);
   
    color szin = kep.get(int(x), int(y));
   
    fill( szin );
   
    ellipse(x, y, meret, meret);
  }
}