Beispiel #1
0
void pd::player::jump()
{
    if (!airborne())
        apply_impulse(0.0f, -jump_impulse);
}
Beispiel #2
0
void
cpBodyApplyImpulse(cpBody *body, const cpVect j, const cpVect r)
{
	cpBodyActivate(body);
	apply_impulse(body, j, r);
}
Beispiel #3
0
void squares::collision_handler(vector<dynamic_info> &status)
{
	int j,k;
	vector<dynamic_info> status_temp=status;
	for(int i=0;i<collision_pair.size();i++)
	{
		//get n and p: further collision detection
		vec n(0,0,0),p,p_prev;
		pair curr=collision_pair[i];
		bool has_added=false;
		bool finish=false;
		for(j=0;j<4;j++)
		{//vertex a edge b
			vec point=status[curr.a].x+position[curr.a].pos[j];
			for(k=0;k<4;k++)
			{
				//vec edge=position[curr.b].posi[(k+1)%4]-position[curr.b].posi[k];
				vec diff1=point-position[curr.b].pos[k]-status[curr.b].x;
				vec diff2=point-position[curr.b].pos[(k+1)%4]-status[curr.b].x;
				number_t temp=abs(diff1*diff2+diff1.len()*diff2.len());
				if(abs(diff1*diff2+diff1.len()*diff2.len())<1e-4)
				{

					n=position[curr.b].pos[k]-position[curr.b].pos[(k+3)%4];
					p=point;
					has_added=apply_impulse(status_temp,status,curr,p,n);
					finish=has_added;
					
					if(finish)
					{
						cout<<"impulse"<<endl;
						break;
						
					}
				}
			}
			if(finish)
				break;
		}

		p_prev=p;
		finish=false;
		curr.change();
		for(j=0;j<4;j++)
		{//vertex b edge a
			vec point=status[curr.a].x+position[curr.a].pos[j];
			for(k=0;k<4;k++)
			{
				//vec edge=position[curr.a].posi[(k+1)%4]-position[curr.a].posi[k];
				vec diff1=point-position[curr.b].pos[k]-status[curr.b].x;
				vec diff2=point-position[curr.b].pos[(k+1)%4]-status[curr.b].x;
				if(abs(diff1*diff2+diff1.len()*diff2.len())<1e-4)
				{
					n=position[curr.b].pos[k]-position[curr.b].pos[(k+3)%4];
					p=point;
					
					if((p-p_prev).len()>1e-4)
					{
						
						finish=apply_impulse(status_temp,status,curr,p,n);


						if(has_added)
						{
							status_temp[curr.a].P=(status_temp[curr.a].P+status[curr.a].P)/2;
							status_temp[curr.b].P=(status_temp[curr.b].P+status[curr.b].P)/2;
							status_temp[curr.a].L=(status_temp[curr.a].L+status[curr.a].L)/2;
							status_temp[curr.b].L=(status_temp[curr.b].L+status[curr.b].L)/2;
						}
						
						//curr.change();
						//status=status_temp;
						if(finish)
						{
							cout<<"impulse"<<endl;
							break;
						}
					}
				}
			}
			if(finish)
				break;
		}


	}
	status=status_temp;//optimizable
}