int main (void) { Wall wall; Heli heli; Landscape landscape; hardwareInit(); initLandscape(&landscape, 70); heli_init(&heli); wall_init(&wall, 10, getYRoof(&landscape, 159), getYBottom(&landscape, 159) ); while(1) { //DelayMs(100); heli_clear(&heli); if(DIORead(USW0)) { DPRINT("up\n"); heli_update(&heli, 0.1, 100); // - means up } else { DPRINT("down\n"); heli_update(&heli, -0.1, 100); // + means down } landscapeFlow(&landscape, 70); wall_clear(&wall); wall_update(&wall, 100); if(heli_check_collision(&heli, wall.x, wall.y1, wall.x, wall.y2)) { heli_init(&heli); wall_init(&wall, 10, getYRoof(&landscape, 159), getYBottom(&landscape, 159) ); } if(touch(&landscape, heli.x, heli.y+heliRadius)) { heli_init(&heli); wall_init(&wall, 10, getYRoof(&landscape, 159), getYBottom(&landscape, 159) ); } if(touch(&landscape, heli.x, heli.y-heliRadius)) { heli_init(&heli); wall_init(&wall, 10, getYRoof(&landscape, 159), getYBottom(&landscape, 159) ); } wall_draw(&wall); heli_draw(&heli); } }
/*! Draw container content \param pDA Draw arguments */ void fp_TOCContainer::draw(dg_DrawArgs* pDA) { if(getPage() == NULL) { return; } if(!isThisBroken() && getFirstBrokenTOC()) { getFirstBrokenTOC()->draw(pDA); return; } fp_TOCContainer * pMaster = this; if(getMasterTOC()) { pMaster = getMasterTOC(); } xxx_UT_DEBUGMSG(("TOC: Drawing broken TOC %x x %d, y %d width %d height %d \n",this,pDA->xoff,pDA->yoff,getWidth(),getHeight())); // // Only draw the lines in the clipping region. // dg_DrawArgs da = *pDA; UT_uint32 count = pMaster->countCons(); UT_sint32 iYStart = getYBreak(); UT_sint32 iYBottom = getYBottom(); xxx_UT_DEBUGMSG(("Drawing TOC, yBreak %d ybottom %d \n",iYStart,iYBottom)); for (UT_uint32 i = 0; i<count; i++) { fp_ContainerObject* pContainer = static_cast<fp_ContainerObject*>(pMaster->getNthCon(i)); if(pContainer->getY() < iYStart) { continue; } if(pContainer->getY() > iYBottom) { break; } da.xoff = pDA->xoff + pContainer->getX(); da.yoff = pDA->yoff + pContainer->getY() - iYStart; pContainer->draw(&da); } _drawBoundaries(pDA); }
/*! * Return the height of this Table taking into account the possibility * of it being broken. */ UT_sint32 fp_TOCContainer::getHeight(void) const { UT_sint32 iFullHeight = fp_VerticalContainer::getHeight(); if(!isThisBroken()) { // // If this is a master table but it contains broken tables, we actually // want the height of the first broken table. The Master table is the // one that actually has a relevant Y value in the vertical container. // All other Y offsets from the broken tables are calculated relative to // it. // if(getFirstBrokenTOC() != NULL) { return getFirstBrokenTOC()->getHeight(); } return iFullHeight; } UT_sint32 iMyHeight = getYBottom() - getYBreak(); return iMyHeight; }
bool fp_TOCContainer::isInBrokenTOC(fp_Container * pCon) { // // OK A container is allowed in this broken TOC if it's // Y location plus height lie between getYBreak() and getYBottom. // // // Short circuit things if the BrokenContainer pointer is set. // if(pCon->getMyBrokenContainer() == static_cast<fp_Container *>(this)) { return true; } if(pCon->getMyBrokenContainer() != NULL) { return false; } UT_sint32 iTop = 0; iTop = pCon->getY(); UT_sint32 iHeight = pCon->getHeight(); UT_sint32 iBot = iTop + iHeight; UT_sint32 iBreak = getYBreak(); UT_sint32 iBottom = getYBottom(); xxx_UT_DEBUGMSG(("Column %x iTop = %d ybreak %d iBot= %d ybottom= %d \n",getBrokenColumn(),iTop,iBreak,iBot,iBottom)); if(iBot >= iBreak) { if(iBot < iBottom) { // pCon->setMyBrokenContainer(this); return true; } } return false; }
/*! * This method creates a new broken toccontainer, broken at the * offset given. * If the new TOCcontainer is broken from a pre-existing * broken TOC it is inserted into the holding vertical container after * the old broken TOC. * It also inserted into the linked list of containers in the vertical * container. * vpos is relative to the either the start of the TOC if it's the first * non-zero vpos or relative to the previous ybreak if it's further down. */ fp_ContainerObject * fp_TOCContainer::VBreakAt(UT_sint32 vpos) { // // Do the case of creating the first broken TOC from the master TOC. // fp_TOCContainer * pBroke = NULL; if(!isThisBroken() && getLastBrokenTOC() == NULL) { if(getFirstBrokenTOC() != NULL) { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); return NULL; } pBroke = new fp_TOCContainer(getSectionLayout(),this); UT_DEBUGMSG(("SEVIOR:!!!!!!! First broken TOC %p \n",pBroke)); pBroke->setYBreakHere(vpos); pBroke->setYBottom(fp_VerticalContainer::getHeight()); // leave this in! UT_ASSERT(pBroke->getHeight()); setFirstBrokenTOC(pBroke); setLastBrokenTOC(pBroke); pBroke->setContainer(getContainer()); static_cast<fp_VerticalContainer *>(pBroke)->setHeight(pBroke->getHeight()); static_cast<fp_VerticalContainer *>(pBroke)->setY(getY()); return pBroke; } // // Now do the case of breaking a Master TOC. // if(getMasterTOC() == NULL) { return getLastBrokenTOC()->VBreakAt(vpos); } if(getContainer() == NULL) { return NULL; } pBroke = new fp_TOCContainer(getSectionLayout(),getMasterTOC()); getMasterTOC()->setLastBrokenTOC(pBroke); xxx_UT_DEBUGMSG(("SEVIOR!!!!!!!!!!! New broken TOC %x \n",getLastBrokenTOC())); // // vpos is relative to the container that contains this height but we need // to add in the height above it. // pBroke->setYBreakHere(getYBreak()+vpos); setYBottom(getYBreak() + vpos -1); UT_ASSERT(getHeight() >0); fp_VerticalContainer * pVCon = static_cast<fp_VerticalContainer *>(getMasterTOC()); if(pVCon == NULL) { } pBroke->setYBottom(pVCon->getHeight()); xxx_UT_DEBUGMSG(("SEVIOR????????: YBreak %d YBottom %d Height of broken TOC %d \n",pBroke->getYBreak(),pBroke->getYBottom(),pBroke->getHeight())); xxx_UT_DEBUGMSG(("SEVIOR????????: Previous TOC YBreak %d YBottom %d Height of broken TOC %d \n",getYBreak(),getYBottom(),getHeight())); UT_ASSERT(pBroke->getHeight() > 0); UT_sint32 i = 0; // // The structure of TOC linked list is as follows. // NULL <= Master <==> Next <==> Next => NULL // first // ie terminated by NULL's in the getNext getPrev list. The second // broken TOC points and is pointed to by the Master TOC // pBroke->setPrev(this); fp_Container * pUpCon = NULL; if(getMasterTOC()->getFirstBrokenTOC() == this) { i = getContainer()->findCon(getMasterTOC()); pUpCon = getMasterTOC()->getContainer(); pBroke->setPrev(getMasterTOC()); pBroke->setNext(NULL); getMasterTOC()->setNext(pBroke); setNext(pBroke); } else { pBroke->setNext(NULL); setNext(pBroke); if(getYBreak() == 0 ) { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); pUpCon = getMasterTOC()->getContainer(); // // Fallback for loads... // if(pUpCon == NULL) { pUpCon = getContainer(); } } else { pUpCon = getContainer(); } if(getYBreak() == 0) { i = pUpCon->findCon(getMasterTOC()); } else { i = pUpCon->findCon(this); } } if(i >=0 && i < pUpCon->countCons() -1) { pUpCon->insertConAt(pBroke,i+1); } else if( i == pUpCon->countCons() -1) { pUpCon->addCon(pBroke); } else { UT_ASSERT(UT_SHOULD_NOT_HAPPEN); return NULL; } pBroke->setContainer(pUpCon); // // Now deal with issues from a container overlapping the top of the // of the new broken TOC. // // Skip this for now. Look at fp_TableContainer to see if it's needed later // static_cast<fp_VerticalContainer *>(pBroke)->setHeight(pBroke->getHeight()); return pBroke; }