Processing
Børre Stenseth
Skisser >Spillkort

Kortstokk

Hva

I dette eksempelet skal vi se hvordan vi kan bruke objekter og musebevegelser til å manipulere kort i en kortstokk.

Begreper som du finner i dokumentasjonen til Processing Reference

Object, class, new, this
mousePressed(),  mouseDragged(),  mouseReleased(),  mouseClicked()
random()
Relevante Skisser
spillkort

Kortbildene finnes i mange fritt tilgjengelige versjoner på nettet.

Skisssen ser slik ut:

spillkort

Et kort er definert slik:

_kort.pde
// beskrivelse av et kort
class kort{
  int nr;       // 1..13
  String type;  // spar,kløver,hjerter,ruter
   
  PImage forside;
  boolean visForsiden;
  // hvor er det plassert
  float posX,posY;
   
 // lag kortet (constructor)
 kort(int nr,String type){
    this.nr=nr;
    this.type=type;
    // f.eks.:data/s9.png 
    String filename="data/"+type.charAt(0)+nr+".png";
    forside=loadImage(filename);
    visForsiden=true;
    // et sted må vi legge det
    posX=width/2;
    posY=height/2;
  }
    
  void tegn(){
    if(visForsiden)
      image(forside,posX,posY);
    else
      // bruk global bakside
      image(baksiden,posX,posY);
  }
    
  void vend(){
    visForsiden=!visForsiden;
  }
    
  void plasser(float x,float y){
    posX=x;
    posY=y;
  }
    
  void flytt(int dx,int dy){
    posX=posX+dx;
    posY=posY+dy;
  }
    
  boolean treff(){
    // er museposisjon inne i kort firkanten
    return((mouseX < posX+kB)&&(mouseX > posX) &&
           (mouseY < posY+kH)&&(mouseY > posY));
  }
    
}

og kortene ordnes og manipuleres slik

_spillkort.pde
/*
Spillkort
Bildene er fra en fri kilde på nettet
bildenavn: type og verdi. f.eks s2.png er spar 2 
og bakside: backbv.png
*/
 
// vi vil lage en kortstokk
ArrayList<kort> kortStokk;
 
// alle kort har samme bakside
PImage baksiden;
// alle kort er like store
int kB,kH;
 
// kortet vi drar med musa
kort aktivtKort;
 
void setup(){
  size(600,600);
  
  // gjør klar baksiden og kortstørrelsen
  baksiden=loadImage("data/backbv.png");
  kB=baksiden.width;
  kH=baksiden.height;
  
  // lager ny kortstokk
  kortStokk=new ArrayList<kort>();
  
  // fyll opp med kort
  for(int i=0;i<13;i++){
      kortStokk.add(new kort(i+1,"spar"));
      kortStokk.add(new kort(i+1,"hjerter"));
      kortStokk.add(new kort(i+1,"ruter"));
      kortStokk.add(new kort(i+1,"kløver"));
  }
  
  // spre dem tilfeldig
  for(kort k:kortStokk)
  {
    k.plasser(random(10,width-kB-10),
              random(10,height-kH-10));
  }  
  // ikke noe aktivt kort
  aktivtKort=null;  
}
 
void draw(){
    // grønn filt på bordet
    background(10,200,0);
    // tegner bakfra siden det aktive 
    // kortet ligger først i stokken 
    for(int i=kortStokk.size()-1; i >=0; i--){
      kortStokk.get(i).tegn();
    }
}
  
void mousePressed(){
  // har vi truffet et kort ?
  // leter forfra 
  for( kort k:kortStokk){
      if (k.treff()){
          aktivtKort=k;
          // flytt det forrest
          kortStokk.remove(k);
          kortStokk.add(0,aktivtKort);
          return;
      }
  }
}
 
void mouseDragged(){
  // drar vi egentlig på et kort ?
  if(aktivtKort!=null){
    // ikke flytt utenfor rammene
    if((mouseX < width-10) && (mouseX > 10) 
     &&(mouseY < height-10)&&(mouseY>10))
        aktivtKort.flytt(mouseX-pmouseX,mouseY-pmouseY);
  }
}
 
void mouseReleased(){
  // det var det, ikke noe aktivt kort
  aktivtKort=null;
}
 
void mouseClicked(){
  // enkelt klikk
  // har vi truffet et kort ?
  // leter forfra 
  for( kort k:kortStokk){
      if (k.treff()){
          aktivtKort=k;
          // flytt det forrest
          kortStokk.remove(k);
          kortStokk.add(0,aktivtKort);
          // snu det
          aktivtKort.vend();
          aktivtKort=null;
          return;
      }
  }
}
Skisser >Spillkort