示例#1
0
文件: chipmunk.c 项目: rlofc/cage
/* 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;
}
示例#2
0
	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
	}
}
示例#4
0
文件: physics.c 项目: dns/CLove
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;
}
示例#5
0
文件: physics.c 项目: dns/CLove
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;
}
示例#6
0
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;
}
示例#7
0
void KinematicBody::setup(cpSpace *space){
	Body::setup(space, cpBodyNewKinematic());
}