PlotterZGames: Fehlende Befehle heute, Daten aus Vectorprogrammen, SVG und keine echte Integration in Processing

Die neueren Plotter wie der benutzte AxiDraw verfügen über ein sehr eingeschränktes Plotter-Command-Repertoir – es gibt de facto fast nur „Line“ und wenige andere Primitive. Vermutlich entfällt sogar eine eingebaute Schrift. Man kann also nicht einfach einen Text schnell setzen. All das was damals in den 60/70er Jahren eingebaut war in Plottern, das prozessiert heute mehrheitlich der Computer. Wie das bei teuren Plottern ist nicht abschätzbar. Es ist also vermutlich in einem gewissen Sinn damals einfacher gewesen einen Plotter als GameDisplay zu brauchen als heute. Hier muss zuerst mal alles extern erstellt werden, was Fonts anbetrifft.

Zusätzlich benutzt natürlich ein Game weitere Grafik. Dazu wird SVG genutzt, es ist ein Vectorformat und wird fast überall unterstützt. Es ist ein menschlich lesbares Format und damit auch gut geeignet für Debugging.

SVG kann sehr einfach in Prozessing dargestellt werden. Dazu gibt es eine Load-Funktion und eine Funktion zum Zeichnen: shape(). Die Idee einfach die Daten benutzen und Linien für den Plotter daraus zu machen.

So einfach ist die Sache dann doch nicht. PShape ist quasi ein Datencontainer für Vectordaten aller Art von 3D bis 3D. Blöderweise wandelt das System beim Laden die SVG Daten nicht um in Processing Java Vector Daten. Dadurch musste sogar im Source-Code von Processing nachgeschaut werden, wie diese Daten abgelegt werden. Sie werden als Parameter-Daten abgelegt. All dies findet weder die Suchemaschine Google (es gibt zu wenig mit diesem Problem) noch die darauf aufbauende integrierte AI heraus.

Am Ende sucht man dann ganz banal im Source-Code von Processing, wie das funktioniert. Und bis man da ist, hat man Stunden bis Tage. GameDev-Lebensrealität.

Anbei der Code für ein Processing-Projekt, das versucht die Daten auszulesen, quasi ein Researchprojekt.


//  getFloatWithUnit(element, "x1", svgWidth),
// https://github.com/processing/processing4/blob/9de5e3643e3d17f604d4d533d07c7bccc70e91fd/core/src/processing/core/PShapeSVG.java#L93

PShape titleSVG;

public void setup() {
  
  // PShapeSVG
  // https://processing.github.io/processing-javadocs/core/processing/core/PShapeSVG.html
  
  titleSVG = loadShape("title_normal.svg"); 
  // titleSVG.rotate(0.2);
  // titleSVG.scale()
  // titleSVG = createShape(RECT, 0, 0, 80, 80);
  
  
  
  
  // layers?
  for (int z=0;z<titleSVG.getChildCount();z++) {
      PShape child =  titleSVG.getChild(z);
      println( z+". layer:"+child+"   " );
      // ok child
          for (int zz=0;zz<child.getChildCount();zz++) {
          PShape childchild = child.getChild(zz);
           
           println( " "+zz+". kind: "+childchild.getKind());
           println( " "+zz+". children "+childchild.getChildCount());
           
           // SVG - lines ins params
           float[] arrF = childchild.getParams();
             if (arrF!=null) {
             println( "   "+zz+". element "+arrF.length);
             for (int r=0;r<arrF.length;r++) {
               println( "   "+zz+". element "+r+".param:  "+arrF[r]);
                 
             }
           }
           
           // type ...
           // works
          /*
           float len  = 100;
            childchild = createShape(); //initialize the PShape object
            childchild.beginShape(); //starts a vertex shape
            childchild.fill(200, 100, 100 );      // blue, HSB
            childchild.vertex( 0, 0 );               //point origin
            childchild.vertex( len  *.4, 0 );          //point(40,0)
            childchild.vertex( len  *.6, len *.6 );    //point(60,60);
            childchild.vertex( 0, len *.4 );         //point(0,40);
            childchild.vertex( 0, 0 );              //last point
            childchild.endShape(CLOSE);             //end shape
          */
              
           // now the vertices ... 
           for (int ct=0;ct<childchild.getVertexCount();ct++) {
             PVector pv = childchild.getVertex(ct);
             println("   "+ct+": "+pv.x+"/"+pv.y);
             
           }
           
        }
       

            
  }
  

  
  size(400,400);

}



public void draw() {
 
 background(255);
 
  line(50,50,50,50);
  fill(0,0,0);
  // shapeMode(CENTER);
  // titleSVG.rotate(10);
  titleSVG.enableStyle();
  shape(titleSVG,50,50);
  
    PShape childA =  titleSVG.getChild("a");
   if (childA!=null) {
     
     shape(childA,10,10);      
  } else {
     println("sorry not found!"); 
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert