///+ 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 setlocal
    ////Prepare variables for movie control;
    int frame = 0;
    int motion_dir = 1;
    double Horizontal_shift, Vertical_shift;
    ///- 2.1 setlocal

    while(!Keyboard::esc.pushed()){
        window.clear(Color::black);

        if(frame % 30/*ID:Period_Position 30 240 30*/ ==0){ // motion direction will reverse at designated frames.
        	motion_dir *= -1;
        }

        for(int i=0; i < rectnum; i++){
         ///+ 2.2 loopset1
         ////set positions and sizes

         Horizontal_shift=motion_dir * 1.0/*ID:HSpeed 0.0 5.0 1.0*/;
         Vertical_shift=motion_dir * 0.0/*ID:VSpeed 0.0 5.0 1.0*/;

         rect[i].resize(rectsize, rectsize); //Resize rectangles.
         rect[i].shift(Horizontal_shift, Vertical_shift);
         ///- 2.2 loopset1

         ///+ 2.3 loopset2
         ////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 loopset2

         }
		
		///+ 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_2a.xap