classdef Rundgang 

  properties
    axes 
    zeilen  = 10; 
    spalten = 12; 
    p = [4 6]; 
    feld = []; 
    imag = []; 
    fig = [16,20]; % Größe der Figuren
    dir = 'r';
    maxX = 10;
    minX = 2;
    maxY = 8;
    minY = 2;
  end

  methods
    function obj = Rundgang(axes)
      obj = data_clear( obj );
      obj.axes = axes;
      obj = data_init(obj);
    end

    function obj = data_init(obj)
      for( m=1 : obj.zeilen )
        for( n=1 : obj.spalten )
           % Feld mit 0 vorbelegen 
           obj.feld(m,n) = 0;
           % leeres Feld in imag eintragen
           obj = leeres_feld( obj, m, n );    
        end
      end
    end

    function obj = data_clear( obj )
      % Datenbasis initialisieren
      obj.p = [4 6];
      obj.dir = 'r';
      obj.feld = []; 
      obj.imag = []; 
    end

    % Funktion zum Zeichnen des Spielfelds
    function obj = draw_field(obj)
      cla(obj.axes);    % Spielfeld loeschen
      % in Doppelschleife alle Felder zeichnen
      for( m=1 : obj.zeilen )
        for( n=1 : obj.spalten )
          obj = leeres_feld( obj, m, n ); 
        end
      end      
      % Figur zeichnen
      obj = zeichne_figur( obj, obj.p(1), obj.p(2) );
      % vor dem image zur Sicherheit nach uint8 wandeln
      obj.imag = uint8( obj.imag );
      image( obj.axes, obj.imag )  % und das Image anzeigen
      % axis image
    end  % von draw_field 


    % Feld an der Position (m,n) mit weiß belegen 
    function obj = leeres_feld( obj, m, n )
      % Zahl der Pixel des Felds holen
      z_w = obj.fig(1);
      s_w = obj.fig(2);
      for( r=1 : z_w )    % alle Pixel von (m,n) mit weiß belegen 
        for( s =1 : s_w ) 
           obj.imag( (m-1)*z_w+r, (n-1)*s_w+s, 1) = uint8( 250 );
           obj.imag( (m-1)*z_w+r, (n-1)*s_w+s, 2) = uint8( 255 );
           obj.imag( (m-1)*z_w+r, (n-1)*s_w+s, 3) = uint8( 255 );
        end
      end
    end  % von leeres_feld

    % Figur zeichnen
    function obj = zeichne_figur( obj, m, n )
      % obj.fig = [16,20];  fest vorgegeben 
      z_w = obj.fig(1);  % Zeilenzahl  = 16
      s_w = obj.fig(2);  % Spaltenzahl = 20  
            
      % Definition der Farben
      kr = 200;  kg = 100;  kb = 0;     % Körper
      fr = 0;    fg = 0;    fb = 255;   % Kleidung 
      bw = 255;                         % weißer Hintergrund 
      
      % RGB jeweils als [16,20]-Feld
      zr = [ bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fr fr fr fr bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kr kr kr bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kr kr kr bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw kr bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fr fr fr fr fr bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fr bw fr fr fr bw fr bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fr fr fr bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fr fr fr bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fr fr fr bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fr bw bw bw fr bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fr bw bw bw fr bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fr fr bw bw bw fr fr bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw ];
         
      zg = [ bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fg fg fg fg bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kg kg kg bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kg kg kg bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw kg bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fg fg fg fg fg bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fg bw fg fg fg bw fg bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fg fg fg bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fg fg fg bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fg fg fg bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fg bw bw bw fg bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fg bw bw bw fg bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fg fg bw bw bw fg fg bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw ];
         
      zb = [ bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fb fb fb fb bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kb kb kb bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw kb kb kb bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw kb bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fb fb fb fb fb bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fb bw fb fb fb bw fb bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fb fb fb bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fb fb fb bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw fb fb fb bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fb bw bw bw fb bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw fb bw bw bw fb bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw fb fb bw bw bw fb fb bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw; ... 
             bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw bw ];
        
      % Farben an obj.imag übertragen 
      for( r =1 : z_w )
        for( s =1 : s_w ) 
          obj.imag( (m-1)*z_w+ r ,(n-1)*s_w+ s, 1) = zr( r,s );
          obj.imag( (m-1)*z_w+ r ,(n-1)*s_w+ s, 2) = zg( r,s );
          obj.imag( (m-1)*z_w+ r ,(n-1)*s_w+ s, 3) = zb( r,s );
        end
      end   
    end  % von zeichne_figur 


     % Reaktion auf Timer - ziehe Figur
    function  obj = laufe( obj )
    % Konsistenz-Check
      akt_x = obj.p(2);  % aktuelles Feld auslesen
      akt_y = obj.p(1);
      next_x = akt_x;  % nächstes Feld mit akt. Feld vorbelegen
      next_y = akt_y;

      % Richtung checken
      if( obj.dir == 'r' )      % geht nach rechts
        if( akt_x <= obj.maxX )
          next_x = akt_x + 1;
        else
          obj.dir = 'd';        % weiter nach unten
        end
      elseif( obj.dir == 'd' )  % geht nach unten 
        if( akt_y <= obj.maxY )
          next_y = akt_y + 1;
        else
          obj.dir = 'l';        % weiter nach links
        end
      elseif( obj.dir == 'l' )  % geht nach links
        if( akt_x > obj.minX )
          next_x = akt_x - 1;
        else
          obj.dir = 'u';        % weiter nach oben
        end
      elseif( obj.dir == 'u' )  % geht nach oben 
        if( akt_y > obj.minY )
          next_y = akt_y - 1;
        else
          obj.dir = 'r';        % weiter nach rechts
        end
      end
      
      % neue Figurdaten merken, damit wird dann gezeichnet
      obj.p = [next_y,next_x];
      obj = draw_field(obj);  % neu zeichnen      
    end  % von ziehe

  end  % von methods

end