Library for 3.2'' uLcd Picaso Display4D system Picaso Serial Environment Command Set web: http://www.4dsystems.com.au/product/20/67/Processors_Graphics/PICASO/

Ellipse.cpp

Committer:
adelino
Date:
2015-04-05
Revision:
1:a74e42cf52b2

File content as of revision 1:a74e42cf52b2:

#include "Ellipse.h"

Ellipse::Ellipse(Screen* mScreen,UINT16 _xc,UINT16 _yc,UINT16 _radiusX,UINT16 _radiusY,Color _color):
    Sprite(mScreen,0,_xc-_radiusX,_yc-_radiusY,_radiusX+_radiusX,_radiusY+_radiusY,_color)
{
    myCenterX=_xc;
    myCenterY=_yc;
    myRadiusX=_radiusX;
    myRadiusY=_radiusY;

    myType=OBJ_ELLIPSE;

    myScreen->addWidget((Widget*) this);
}
//----------------------------------------------
void Ellipse::draw(void)
{
    // isVisible ?
    if(myIsVisible==false) {
        return;
    }
    //
    PicasoSerial* ps=0;
    ps=myScreen->getPicasoSerial();

    if(ps!=0) {
        ps->draw_filled_ellipse(myCenterX,myCenterY,myRadiusX,myRadiusY,myColor);
    }
    ps=0;
}
//----------------------------------------------
void Ellipse::update(float delta)
{
    if(myIsUpdateAutomatic)
        elementUpdate();

    float xcnew=myCenterX+mySpeedX*delta;
    float ycnew=myCenterY+mySpeedY*delta;

    this->setNewPosition((INT16)xcnew,(INT16)ycnew,true);

}
//-----------------------------------------------
void Ellipse::setInvisible(bool _state)
{
    // element devient invisible
    if(_state==true) {
        if(myIsVisible==false)
            return;

        myIsVisible=false;

        Color c= myScreen->getColorBkg();

        PicasoSerial* ps=0;
        ps=myScreen->getPicasoSerial();

        if(ps!=0) {
            ps->draw_filled_ellipse(myCenterX,myCenterY,myRadiusX,myRadiusY,c);
        }
        ps=0;
    }

    // element devient visible
    else {
        myIsVisible=true;


        this->draw();
    }
}
//-----------------------------------------------
void Ellipse::setNewPosition(INT16 _xcnew,INT16 _ycnew)
{
    setNewPosition(_xcnew,_ycnew,true);
}
//-----------------------------------------------
void Ellipse::setNewPosition(INT16 _xcnew,INT16 _ycnew,bool isScreenLimits)
{
    if(myIsVisible==false)
        return;
    //
    if(myCenterX==_xcnew && myCenterY==_ycnew)
        return;
    //
    this->setInvisible(true); // colorie le cir avec couleur de la screen

    myIsVisible=true;
    if(isScreenLimits) {
        //test Xmax
        if(_xcnew+myRadiusX >= myXMoveMax) {
            _xcnew=myXMoveMax-myRadiusX;

            if(myState==STATE_ON)
                myState=BUMP_RIGHT;
        }

        //test Xmin
        if(_xcnew <= myRadiusX) {
            _xcnew=myXMoveMin+myRadiusX;

            if(myState==STATE_ON)
                myState=BUMP_LEFT;
        }
        //test Ymax
        if(_ycnew +myRadiusY >= myYMoveMax && _ycnew >0) {
            _ycnew = myYMoveMax- myRadiusY;

            if(myState==STATE_ON)
                myState=BUMP_DOWN;
        }
        //test yminMin;
        if(_ycnew <= myRadiusY) {
            _ycnew=myYMoveMin+myRadiusY;

            if(myState==STATE_ON)
                myState=BUMP_UP;
        }
    }
    //
    myCenterX=_xcnew;
    myCenterY=_ycnew;

    myX=_xcnew-myRadiusX;
    myY=_ycnew-myRadiusY;


    this->draw();
}
//-----------------------------------------------
Ellipse::~Ellipse(void)
{
}
//----------------------------------------------
UINT16 Ellipse::getCenterX(void) const
{
    return this->myCenterX;
}
//---------------------------------------------
UINT16 Ellipse::getCenterY(void) const
{
    return this->myCenterY;
}
//----------------------------------------------
void Ellipse::setCenterX(UINT16 _xcenter)
{
    myCenterX=_xcenter;
}
//----------------------------------------------
void Ellipse::setCenterY(UINT16 _ycenter)
{
    myCenterY=_ycenter;
}