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/

Diamond.cpp

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

File content as of revision 1:a74e42cf52b2:

#include "Diamond.h"

Diamond::Diamond(Screen* mScreen,UINT16 x1,UINT16 y1,UINT16 x2,UINT16 y2,
                 UINT16 x3,UINT16 y3,UINT16 x4,UINT16 y4,Color _color):

    Sprite(mScreen,0,x1,y4,x3-x1,y2-y4,_color)
{
    myX1=x1;
    myY1=y1;

    myX2=x2;
    myY2=y2;

    myX3=x3;
    myY3=y3;

    myX4=x4;
    myY4=y4;

    myU1=x4-x1;
    myU2=x2-x1;

    myV1=y1-y4;
    myV2=y3-y4;


    myType=OBJ_DIAMOND;

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

    if(ps!=0) {
        ps->draw_filled_diamond(myX1,myY1,myX2,myY2,myX3,myY3,myX4,myY4,myColor);
    }
    ps=0;
}
//-----------------------------------------
Diamond::~Diamond(void)
{
}
//----------------------------
void Diamond::update(float delta)
{
    if(myIsUpdateAutomatic)
        elementUpdate();
    //
    float xnew=myX+mySpeedX*delta;
    float ynew=myY+mySpeedY*delta;

    this->setNewPosition((INT16)xnew,(INT16)ynew,true);
}
//-------------------------------
void Diamond::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_diamond(myX1,myY1,myX2,myY2,myX3,myY3,myX4,myY4,c);
            
        }
        ps=0;
    }

    // element devient visible
    else {
        myIsVisible=true;

        this->draw();
    }
}
//--------------------------------
void Diamond::setNewPosition(INT16 _xnew,INT16 _ynew)
{
   setNewPosition(_xnew,_ynew,true);
}
//---------------------------------
void Diamond::setNewPosition(INT16 _xnew,INT16 _ynew,bool isScreenLimits)
{
    if(myIsVisible==false)
        return;
    //
    if(myX==_xnew && myY==_ynew)
        return;
    setInvisible(true); // colorie le tri avec couleur de la screen

    myIsVisible=true;

if(isScreenLimits)
{
    //test Xmax
    if(_xnew+myWidth >= myXMoveMax) {
        _xnew=myXMoveMax-myWidth;

        if(myState==STATE_ON)
            myState=BUMP_RIGHT;
    }
    //
    //test Xmin
    if(_xnew <= myXMoveMin) {
        _xnew=myXMoveMin;

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

        if(myState==STATE_ON)
            myState=BUMP_DOWN;
    }
    //test yminMin;
    if(_ynew <= myYMoveMin) {
        _ynew=myYMoveMin;

        if(myState==STATE_ON)
            myState=BUMP_UP;
    }
}
    //
    myX=_xnew;
    myY=_ynew;

    myX1=_xnew;
    myY1=_ynew+myV1;

    myX2=_xnew+myU2;
    myY2=_ynew+myHeight;

    myX3=_xnew+myWidth;
    myY3=_ynew+myV2;

    myX4=_xnew+myU1;
    myY4=_ynew;

    this->draw();
}