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/
Diff: Isocele.cpp
- Revision:
- 1:a74e42cf52b2
diff -r 65fd8b1cbf86 -r a74e42cf52b2 Isocele.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Isocele.cpp Sun Apr 05 13:54:48 2015 +0000 @@ -0,0 +1,307 @@ +#include "Isocele.h" + +void Isocele::updateOrientation(void) +{ + switch(myOrientation) { + // + case Isocele::ORIENTATION_UP: + mySpeedX=0.0; + mySpeedY=-mySpeed; + + myX=myXcenter-myRadius; + myY=myYcenter-myRadius; + myWidth=myRadius+myRadius; + myHeight=myRadius; + + myX1=myXcenter; + myY1=myYcenter-myRadius; + + myX2=myXcenter-myRadius; + myY2=myYcenter; + + myX3=myXcenter+myRadius; + myY3=myYcenter; + break; + + // + case Isocele::ORIENTATION_RIGHT: + mySpeedX=mySpeed; + mySpeedY=0.0; + + myX=myXcenter; + myY=myYcenter-myRadius; + myWidth=myRadius; + myHeight=myRadius+myRadius; + + myX1=myXcenter; + myY1=myYcenter-myRadius; + + myX2=myXcenter; + myY2=myYcenter+myRadius; + + myX3=myXcenter+myRadius; + myY3=myYcenter; + break; + + // + case Isocele::ORIENTATION_DOWN: + mySpeedX=0.0; + mySpeedY=mySpeed; + + myX=myXcenter-myRadius; + myY=myYcenter; + myWidth=myRadius+myRadius; + myHeight=myRadius; + + myX1=myXcenter-myRadius; + myY1=myYcenter; + + myX2=myXcenter; + myY2=myYcenter+myRadius; + + myX3=myXcenter+myRadius; + myY3=myYcenter; + break; + + // + case Isocele::ORIENTATION_LEFT: + mySpeedX=-mySpeed; + mySpeedY=0.0; + + myX=myXcenter-myRadius; + myY=myYcenter-myRadius; + myWidth=myRadius; + myHeight=myRadius+myRadius; + + myX1=myXcenter-myRadius; + myY1=myYcenter; + + myX2=myXcenter; + myY2=myYcenter+myRadius; + + myX3=myXcenter; + myY3=myYcenter-myRadius; + break; + + // + default: + break; + + } + +} +//-------------------------------------------- +Isocele::Isocele(Screen* mScreen,UINT16 xc,UINT16 yc,UINT16 radius,int orientation,float _speed, + Color color): + Sprite(mScreen,0,xc-radius,yc-radius,radius+radius,radius,color) +{ + myXcenter=xc; + myYcenter=yc; + myRadius=radius; + myOrientation=orientation; + mySpeed=_speed; + + updateOrientation(); + + myIsUpdateAutomatic=false; + + myType=OBJ_ISOCELE; + + myScreen->addWidget((Widget*) this); +} +//-------------------------------------------- +void Isocele::draw(void) +{ + // isVisible ? + if(myIsVisible==false) { + return; + } + // + PicasoSerial* ps=0; + ps=myScreen->getPicasoSerial(); + + if(ps!=0) { + ps->draw_filled_triangle(myX1,myY1,myX2,myY2,myX3,myY3,myColor); + // + //ps->draw_rectangle(myX,myY,myX+myWidth,myY+myHeight,BLACK); + } + ps=0; +} +//--------------------------------------------- +Isocele::~Isocele(void) +{ +} +//-------------------------------------------- +void Isocele:: 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_triangle(myX1,myY1,myX2,myY2,myX3,myY3,c); + //ps->draw_rectangle(myX,myY,myX+myWidth,myY+myHeight,c); + } + ps=0; + } + + // element devient visible + else { + myIsVisible=true; + + this->draw(); + } +} +//------------------------------------------ +void Isocele::setNewPosition(INT16 _xcnew,INT16 _ycnew) +{ + setNewPosition(_xcnew,_ycnew,true); +} +//------------------------------------------- +void Isocele::setNewPosition(INT16 _xcnew,INT16 _ycnew,bool isScreenLimits) +{ + if(myIsVisible==false) + return; + // + if(myXcenter==_xcnew && myYcenter==_ycnew) + return; + // + this->setInvisible(true); + + myIsVisible=true; +if(isScreenLimits) +{ + + //test Xmax + if(_xcnew+myRadius >= myXMoveMax) { + _xcnew=myXMoveMax-myRadius; + + if(myState==STATE_ON) + myState=BUMP_RIGHT; + } + + //test Xmin + if(_xcnew <= myRadius) { + _xcnew=myXMoveMin+myRadius; + + if(myState==STATE_ON) + myState=BUMP_LEFT; + } + //test Ymax + if(_ycnew +myRadius >= myYMoveMax && _ycnew >0) { + _ycnew = myYMoveMax- myRadius; + + if(myState==STATE_ON) + myState=BUMP_DOWN; + } + //test yminMin; + if(_ycnew <= myRadius) { + _ycnew=myYMoveMin+myRadius; + + if(myState==STATE_ON) + myState=BUMP_UP; + } +} + // + myXcenter=_xcnew; + myYcenter=_ycnew; + + updateOrientation(); + + this->draw(); +} +//-------------------------------------------- +void Isocele::myElementUpdate(void) +{ + switch(myState) { + // + case BUMP_DOWN: + setInvertSpeedY(); + myState=STATE_ON; + myOrientation=Isocele::ORIENTATION_UP; + break; + // + case BUMP_LEFT: + setInvertSpeedX(); + myState=STATE_ON; + myOrientation=Isocele::ORIENTATION_RIGHT; + break; + // + case BUMP_RIGHT: + setInvertSpeedX(); + myState=STATE_ON; + myOrientation=Isocele::ORIENTATION_LEFT; + break; + // + case BUMP_UP: + setInvertSpeedY(); + myState=STATE_ON; + myOrientation=Isocele::ORIENTATION_DOWN; + break; + // + case STATE_OFF: + break; + // + default: + break; + } +} +//-------------------------------------------- +void Isocele::update(float delta) +{ + if(myIsUpdateAutomatic) + myElementUpdate(); + // + float xnew=myXcenter+mySpeedX*delta; + float ynew=myYcenter+mySpeedY*delta; + + this->setNewPosition((INT16)xnew,(INT16)ynew,true); + +} +//-------------------------------------------- +void Isocele::setOrientation(int _orientation) +{ + myOrientation=_orientation; + +} +//-------------------------------------------- +int Isocele::getOrientation(void) const +{ + return this->myOrientation; +} +//-------------------------------------------- +UINT16 Isocele::getXcenter(void) const +{ + return this->myXcenter; +} +//-------------------------------------------- +UINT16 Isocele::getYcenter(void) const +{ + return this->myYcenter; +} +//-------------------------------------------- +void Isocele::turnLeft(void) +{ + myOrientation+=1; + + if(myOrientation >Isocele::ORIENTATION_RIGHT) + myOrientation=ORIENTATION_UP; + +} +//-------------------------------------------- +void Isocele::turnRight(void) +{ + myOrientation-=1; + + if(myOrientation <Isocele::ORIENTATION_UP) + myOrientation=ORIENTATION_RIGHT; + +} \ No newline at end of file