void pd::player::jump() { if (!airborne()) apply_impulse(0.0f, -jump_impulse); }
void cpBodyApplyImpulse(cpBody *body, const cpVect j, const cpVect r) { cpBodyActivate(body); apply_impulse(body, j, r); }
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 }