///+ Prefix linkto basiccode1
//// Lines for set up Psychlops environment
#include <psychlops.h>
using namespace Psychlops;
///- Prefix linkto basiccode1


///+ Main Routine
//// Psychlops runs at the first line of this function psychlops_main().
void psychlops_main() {
    ///+ 0 linkto basiccode3_1a
    ////Prepare global parameters
     const int maxrectnum = 200;
     int rectnum = 100/*ID:rectnumber 25.0 200.0 25.0*/;
     double rectsize = 5.0/*ID:dotsize 1.0 10.0 1.0*/;
     Psychlops::Rectangle rect[maxrectnum];
     double rectcolorR[maxrectnum];
     double rectcolorG[maxrectnum];
     double rectcolorB[maxrectnum];
    ///- 0 linkto basiccode3_1a

	 Canvas window(Canvas::window);

     ///+ 1 linkto basiccode3_1a
     ////Initialize
     for(int i=0; i < rectnum; i++){
         ///+ 1.1 set1
         ////set positions and sizes
         rect[i].set(rectsize, rectsize); //Set a size of rectangles.
         rect[i].centering();
         rect[i].shift((i - 0.5  *rectnum) * rectsize* 1.5/*ID:RectHGap 1.0 3.0 0.5*/,
                           (i-0.5*rectnum) * rectsize * 1.5/*ID:RectVGap 1.0 3.0 0.5*/); //Move Rectangles to initial positions
         ///- 1.1 set1
         ///+ 1.2 set2
         ////set colors
         rectcolorR[i]=random(1.0) * 0.5/*ID:RGain 0.0 1.0 0.5*/; //Set R values. Note that "i" is converted to double-type.
         rectcolorG[i]=random(1.0) * 0.5/*ID:GGain 0.0 1.0 0.5*/; //Set G values. Note that "i" is converted to double-type.
         rectcolorB[i]=random(1.0) * 0.5/*ID:BGain 0.0 1.0 0.5*/; //Set B values. Note that "i" is converted to double-type.
         ///- 1.2 set2
         }
    ///- 1 linkto basiccode3_1a

    ///+ 2 drawing
    ////drawing objects
    ///+ 2.1 linkto basiccode3_2a
    ////Prepare variables for movie control;
    int frame=0;
    int motion_dir=1;
    double Horizontal_shift, Vertical_shift;
    ///- 2.1 linkto basiccode3_2a

    while(!Keyboard::esc.pushed()){
        window.clear(Color::black);
        for(int i=0; i < rectnum; i++){
         ///+ 2.2 loopset1
         ////set positions and sizes

         Horizontal_shift=sin(2 * PI * ((double)frame / 30.0/*ID:Period_HPosition 30 240 30*/))*motion_dir * 100.0/*ID:HSpeed 0.0 100.0 10.0*/; //Calculate horizontal displacement from the center.
         Vertical_shift=sin(2 * PI * ((double)frame / 30.0/*ID:Period_HPosition 30 240 30*/))*motion_dir * 0.0/*ID:VSpeed 0.0 100.0 10.0*/;//Calculate vertical displacement from the center.
         rect[i].resize(rectsize, rectsize); //Resize rectangles.
         rect[i].centering(); //Rectangles are moved to the center...
         rect[i].shift(Horizontal_shift + (i-0.5*rectnum) * rectsize * 1.5/*ID:RectHGap 1.0 3.0 0.5*/,
                       Vertical_shift + (i-0.5*rectnum)  *rectsize * 1.5/*ID:RectVGap 1.0 3.0 0.5*/); //and then move to designated positions
         ///- 2.2 loopset1

         ///+ 2.3 linkto basiccode3_2a
         ////set colors 
         rectcolorR[i]=random(1.0) * 0.5/*ID:RGain 0.0 1.0 0.5*/; //Set R values. Note that "i" is converted to double-type.
         rectcolorG[i]=random(1.0) * 0.5/*ID:GGain 0.0 1.0 0.5*/; //Set G values. Note that "i" is converted to double-type.
         rectcolorB[i]=random(1.0) * 0.5/*ID:BGain 0.0 1.0 0.5*/; //Set B values. Note that "i" is converted to double-type.
         ///- 2.3 linkto basiccode3_2a

         }
		///+ 2.4 linkto basiccode3_1a
        for(int i=0; i < rectnum; i++){
            rect[i].draw(Color(rectcolorR[i], rectcolorG[i], rectcolorB[i])); //draw objects by designated colors.
        }
        window.flip();
       	///- 2.4 linkto basiccode3_1a
        frame++;
    }
    ///- 2 drawing

}
///- Main Routine

./3_2b.xap