void Build(GPTexture* tex, cpSpace* a_space) { sprite=GPSprite(tex); space=a_space; ConvexPolygon polyset; SimplePolygon BB=CreateBoundingBoxFromTexture(tex); // polyset.addPolygon(BB); /* SimplePolygon BB=CreateBoundingBoxFromTexture(tex); SimplePolygon triangle1; SimplePolygon triangle2; triangle1.addVertex(BB.getVertex(0)); triangle1.addVertex(BB.getVertex(1)); triangle1.addVertex(BB.getVertex(2)); triangle2.addVertex(BB.getVertex(2)); triangle2.addVertex(BB.getVertex(3)); triangle2.addVertex(BB.getVertex(0)); polyset.addPolygon(triangle1); polyset.addPolygon(triangle2);*/ polyset=CreateConvexPolySetFromTexture(tex,TYPE); cpFloat m=1;//mass cpFloat inertia=1;//inertia body=cpBodyNew(m,inertia); inertia=0; int N_polys=polyset.getSize(); cout<<"N_polys="<<N_polys<<endl; shape.resize(N_polys); Nshapes+=N_polys; for(int i=0;i<N_polys;i++) { SimplePolygon poly=polyset.getPolygon(i); SDL_Surface* surf = tex->getSurface(); poly.addVector(GPVector(-surf->w/2.0,surf->h/2.0)); int N=poly.getSize(); cpVect* verts=new cpVect[N]; for(int j=0;j<N;j++) { // verts[N-1-j]=cpv(poly.getVertex(j).getX(),poly.getVertex(j).getY()); verts[j]=cpv(poly.getVertex(j).getX(),poly.getVertex(j).getY()); } cpVect offset=cpvzero; inertia+=cpMomentForPoly(m/(double)N_polys, poly.getSize(), verts, offset); shape[i] = cpPolyShapeNew(body, poly.getSize(), verts, offset); cpSpaceAddShape(space,shape[i]); delete verts; } cout<<"inertia="<<inertia<<endl; // cpBodySetMoment(body,inertia); // cpBodySetMoment(body,1/*inertia*/); SetBBInertia(m,BB,tex); cpSpaceAddBody(space,body); }
int main(void) { cpInitChipmunk(); /* Actually, that's pretty much it */ space=cpSpaceNew(); space->gravity=cpv(0,-100); space->elasticIterations=7; cpFloat dt=0.008; cpBody* staticBody = cpBodyNew(INFINITY, INFINITY); cpShape* bottom=cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 5.0f); cpShape* leftside=cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 5.0f); cpShape* rightside=cpSegmentShapeNew(staticBody, cpv(320,-240), cpv(320,240), 5.0f); cpSpaceAddStaticShape(space,bottom); cpSpaceAddStaticShape(space,leftside); cpSpaceAddStaticShape(space,rightside); cpFloat dim=10; int count=1000; cpSpaceResizeStaticHash(space, dim, count); cpSpaceResizeActiveHash(space, dim, count); GPEngine* engine = GPEngine::getInstance(); engine->initAll(); window = GPWindow::getInstance(); window->setRenderMode(GPWindow::GP_OPENGL); window->setWindowTitle("Gamepower 2D Testing App"); window->createWindow(640, 480, 24); window->setGraphicsDefaults(); GPKeyboardHandler* handler = new GPKeyboardHandler(); handler->registerKeyAction(GPKeyEvent::GP_KEY_ESCAPE, new ExitAction()); handler->registerKeyAction(GPKeyEvent::GP_KEY_SPACE, new TogglePhysics()); GPMouseHandler* mhandler = new GPMouseHandler(); mhandler->registerMouseAction(new MouseAction()); GPInputProcessor* proc = new GPInputProcessor(); proc->addHandler(handler); proc->addHandler(mhandler); cam = new GPGameCamera(window->getHeight() / 2); cam->setPosition(0.0f, 0.0f); texSprite[0] = new GPTexture("susi.png"); texSprite[1] = new GPTexture("debin.png"); texSprite[2] = new GPTexture("fidori.png"); texSprite[3] = new GPTexture("genti.png"); texSprite[4] = new GPTexture("lini.png"); texSusi = new GPTexture("susi.png"); texMissile = new GPTexture("missile.png"); texLeaves = new GPTexture("iteam_leaves_animation.png"); ConvexPolygon polySprite[5]; ConvexPolygon polyMissile; cout<<"=================="<<endl; for(int l_TYPE=0;l_TYPE<4;l_TYPE++) { cout<<"++++++++++++++++"<<endl; cout<<"Susi:"<<endl; polySprite[0]=CreateConvexPolySetFromTexture(texSprite[0],l_TYPE); cout<<"Debin:"<<endl; polySprite[1]=CreateConvexPolySetFromTexture(texSprite[1],l_TYPE); cout<<"Fidori:"<<endl; polySprite[2]=CreateConvexPolySetFromTexture(texSprite[2],l_TYPE); cout<<"Genti:"<<endl; polySprite[3]=CreateConvexPolySetFromTexture(texSprite[3],l_TYPE); cout<<"Lini:"<<endl; polySprite[4]=CreateConvexPolySetFromTexture(texSprite[4],l_TYPE); cout<<"Missile:"<<endl; polyMissile=CreateConvexPolySetFromTexture(texMissile,l_TYPE); } cout<<"=================="<<endl; ConvexPolygon polyLeaves=CreateConvexPolySetFromTexture(texLeaves,TYPE); ConvexPolygon polySusi=CreateConvexPolySetFromTexture(texSusi,TYPE); polySusi.setPosition(0,0); polyMissile.setPosition(100,0); polyLeaves.setPosition(0,100); for(int i=0;i<5;i++) cout<<"polySprite[i].getSize()="<<polySprite[i].getSize()<<endl; cout<<"polySusi.getSize()="<<polySusi.getSize()<<endl; cout<<"polyMissile.getSize()="<<polyMissile.getSize()<<endl; cout<<"polyLeaves.getSize()="<<polyLeaves.getSize()<<endl; class_testing(texSusi,space); // vector <GP_chipmunk_combo> sprSusi1; // sprSusi1.push_back(GP_chipmunk_combo(texSusi,space)); // sprSusi1[sprSusi1.size()-1].setPosition(0.0f, 0.0f); // GP_chipmunk_combo S(texSusi,space,"normal element"); // S.setPosition(0,0); // S.setRotation_Z(0); // S.sprite.setRotCenter(64,-64,0); // cout<<"S.sprite.getRotCenter_X()="<<S.sprite.getRotCenter_X()<<endl; // cout<<"S.sprite.getRotCenter_Y()="<<S.sprite.getRotCenter_Y()<<endl; // cout<<"S.sprite.getRotCenter_Z()="<<S.sprite.getRotCenter_Z()<<endl; bottom->e=1.0; bottom->u=0.0; /* S.SetElasticity(0.0); S.SetFriction(0.0);*/ /* cout<<"S elasticity="<<S.shape->e<<endl; cout<<"S friction="<<S.shape->u<<endl;*/ cout<<"bottom elasticity="<<bottom->e<<endl; cout<<"bottom friction="<<bottom->u<<endl; // GP_chipmunk_combo B=S; /* B.setPosition(100,100); B.setRotation_Z(46);*/ // GP_chipmunk_combo C=S; /* C.setPosition(200,200); C.setRotation_Z(180);*/ // GP_chipmunk_combo D=S; /* D.setPosition(300,300); D.setRotation_Z(270);*/ Uint32 start = 0; start = SDL_GetTicks(); bool random_susi=true; GPFont* font = new GPFont("font.ttf", 12); GPText* text1 = new GPText(font); text1->setRenderType(GPText::GP_RENDER_NICEST); text1->setX(0); text1->setY(0); text1->setZ(12); text1->setText("Hi 1"); int frames=0; GPTimer timer; timer.start(); while(!quit) { proc->pollEvents(); window->clearScreen(); // S.draw(); // B.draw(); // C.draw(); // D.draw(); int FPS; int milliseconds=timer.getTicks(); // cout<<timer.getTicks()<<endl; if(milliseconds>1000) { FPS=frames/(double)(milliseconds/1000.0); /* cout<<"frames="<<frames<<endl; cout<<"milliseconds="<<milliseconds<<endl;*/ cout<<"FPS="<<FPS<<" SpriteVector.size()="<<SpriteVector.size()<<" Nshapes="<<Nshapes<<endl; frames=0; timer.reset(); } // text1->setText("FPS=%i",FPS); // text1->draw(); // polySusi.draw(); // polyMissile.draw(); // polyLeaves.draw(); // Uint32 T=SDL_GetTicks() - start; // if(T>1000 && random_susi) // { // random_susi=false; // int x = rand() % 640 - 320; // int y = rand() % 480 - 240; // cout << "Timer: " << T << " -> ("<<x<<","<<y<<")"<<endl; // SpriteVector.push_back(GP_chipmunk_combo(texSusi,space,"vector element")); // SpriteVector[SpriteVector.size()-1].setPosition(x,y); // start = SDL_GetTicks(); // } for(unsigned int i=0;i<SpriteVector.size();i++) { SpriteVector[i].draw(); } /* drawLine(100,240,100,-240); drawLine(320,100,-320,100);*/ drawLine(-320,-240,320,-240);//bottom drawLine(-320,-240,-320,240);//left drawLine(320,-240,320,240);//right // drawLine(0,0,320,240);//diagonal // drawLine(0,0,320,0);//Xbottom // drawLine(0,0,0,240);//Ybottom window->sync(); if(physics) cpSpaceStep(space,dt); frames++; } delete font; delete text1; engine->shutdownAll(); atexit(clean_physics); return(0); }