/* create_sample is our game state's initialization function * and will return a fully ready instance of struct state for us * to work with in each frame. */ static void* create_sample(void) { struct state* state = malloc(sizeof(struct state)); state->space = cpSpaceNew(); state->tile_img = create_image("res/particle.png"); state->mouse_body = cpBodyNewKinematic(); init_tiles(state); init_walls(state); return state; }
cpBody* RigidBody2D::Create(float mass, float moment) { cpBody* handle; if (IsKinematic()) { if (IsStatic()) handle = cpBodyNewStatic(); else handle = cpBodyNewKinematic(); } else handle = cpBodyNew(mass, moment); cpBodySetUserData(handle, this); return handle; }
void DynamicObjectStabilizator::fixatePoints() { // vector<IDynamicObject *>::iterator begin = m_DynamicObjects.begin(); // vector<IDynamicObject *>::iterator end = m_DynamicObjects.end(); // vector<IDynamicObject *>::iterator iter = begin + 1; // for( ; iter != end ; iter++ ) size_t count = m_DynamicObjects.size(); for( size_t object_i = 0 ; object_i < 2 ; object_i++ ) { const IGeometryObject & geometryObjext = m_DynamicObjects[object_i]->getGeometryObject(); if( geometryObjext.getType() != GEOMETRYOBJECT_POINT ) { // assert( false ); continue; } cpBody * kineticBody = cpBodyNewKinematic(); cpSpaceAddBody( m_Space, kineticBody ); m_KineticBodies.push_back( kineticBody ); const GeometryPoint & geometryPoint = dynamic_cast<const GeometryPoint &>( geometryObjext ); int x = geometryPoint.getX(); int y = geometryPoint.getY(); cpVect mousePoint = cpv( x, y ); cpShape * shape = cpSpacePointQueryNearest( m_Space, mousePoint, 100.0, GRAB_FILTER, 0 ); if( 0 == shape ) { return; } cpVect new_mouse_position = cpv( x, y ); cpBodySetPosition( kineticBody, new_mouse_position ); cpBody * trackingBody = cpShapeGetBody( shape ); cpConstraint * joint = cpPivotJointNew2( kineticBody, trackingBody, cpvzero, cpvzero ); cpSpaceAddConstraint( m_Space, joint ); m_Joints.push_back( joint ); break; //one pointb } }
int l_physics_newCircleBody(lua_State* state) { l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space"); l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1); const char* type = luaL_optstring(state, 2, "dynamic"); float outer_radius = luaL_optnumber(state, 3, 1.0f); cpVect offset = cpvzero; offset.x = luaL_optnumber(state, 4, 0.0f); offset.y = luaL_optnumber(state, 5, 0.0f); float mass = luaL_optnumber(state, 6, 1.0f); float moment = luaL_optnumber(state, 7, 0.0f); float inner_radius = luaL_optnumber(state, 8, 0.0f); moduleData.body = (l_physics_Body*)lua_newuserdata(state, sizeof(l_physics_Body)); moduleData.body->physics = malloc(sizeof(physics_PhysicsData)); moduleData.body->physics = physics->physics; cpFloat _moment = moment; if (_moment == 0) _moment = cpMomentForCircle(mass, inner_radius, outer_radius, offset); if (strcmp(type, "dynamic") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewDynamic()); else if (strcmp(type, "kinematic") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewKinematic()); else if (strcmp(type, "static") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewStatic()); else { moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNew(mass, _moment)); /* const char* err = util_concatenate("Undefined type: ", type); l_tools_trowError(state, err); return -1; */ } lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.bodyMT); lua_setmetatable(state, -2); return 1; }
int l_physics_newBoxBody(lua_State* state) { l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space"); l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1); const char* type = l_tools_toStringOrErrorPlusMsg(state, 2, "You must provide a type, eg: dynamic,static,kinematic"); float width = l_tools_toNumberOrErrorPlusMsg(state, 3, "You must provide a width"); float height = luaL_optnumber(state, 4, width); float mass = luaL_optnumber(state, 5, 1.0f); float moment = luaL_optnumber(state, 6, 0.0f); moduleData.body = (l_physics_Body*)lua_newuserdata(state, sizeof(l_physics_Body)); moduleData.body->physics = malloc(sizeof(physics_PhysicsData)); moduleData.body->physics = physics->physics; cpFloat _moment = moment; // If we don't provide a default moment then we let chipmunk calculate one if (_moment == 0) _moment = cpMomentForBox(mass, width, height); if (strcmp(type, "dynamic") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewDynamic()); else if (strcmp(type, "static") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewStatic()); else if (strcmp(type, "kinematic") == 0) moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNewKinematic()); else { moduleData.body->body = cpSpaceAddBody(physics->physics->space, cpBodyNew(mass, _moment)); /* const char* err = util_concatenate("Undefined type: ", type); l_tools_trowError(state, err); return -1; */ } lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.bodyMT); lua_setmetatable(state, -2); return 1; }
static cpSpace * init(void) { // Create a rouge body to control the planet manually. cpSpace *space = cpSpaceNew(); cpSpaceSetIterations(space, 20); planetBody = cpSpaceAddBody(space, cpBodyNewKinematic()); cpBodySetAngularVelocity(planetBody, 0.2f); for(int i=0; i<30; i++){ add_box(space); } cpShape *shape = cpSpaceAddShape(space, cpCircleShapeNew(planetBody, 70.0f, cpvzero)); cpShapeSetElasticity(shape, 1.0f); cpShapeSetFriction(shape, 1.0f); cpShapeSetFilter(shape, NOT_GRABBABLE_FILTER); return space; }
void KinematicBody::setup(cpSpace *space){ Body::setup(space, cpBodyNewKinematic()); }