void CWorm::ProcessPickDropItem() { //for all items in range: pick them up, if no item selected if ((g_pFramework->isNewEvent()) && (g_pFramework->KeyDown(m_pSettings->KeyPickDropItem))) { if (m_SelectedpItem == m_pItems.begin()) { //pick item up! list<CItem*>::iterator it; for (it = m_pGame->m_pItems.begin(); it != m_pGame->m_pItems.end(); ++it) { if ((*it)->getOwner() == NULL) { //nobody owns it //calculate distance to item: CVec posItem = CVec((*it)->getRect(), true); CVec dist = CVec(getRect()); dist -= posItem; if (dist.quad_abs() < QUADMAXITEMPICKUPDIST) { //in range...., so its mine now! (*it)->setOwner(this); m_pItems.push_back((*it)); //new item = selected one: m_SelectedpItem = m_pItems.end(); m_SelectedpItem--; } } }//for } else {//drop item! if ((*m_SelectedpItem)->isDropable()) {//can drop item (*m_SelectedpItem)->setOwner(NULL); m_SelectedpItem = m_pItems.erase(m_SelectedpItem); } } }//keydown }
void CPhysics::doPhysicsFor(CPhysicalObject * it) { if (! it->getCanMove()) return; S_Collision YCollision; S_Collision XCollision; float timeElapsed = g_pTimer->getElapsed(); if (timeElapsed == 0.0f) return; //macht keinen Sinn.... FloatRect FR = it->getRect(); //rect of PO..PhysicalObject CVec dir = it->getDir(); //dir of PO XCollision.bIsCollision = false; YCollision.bIsCollision = false; float time = timeElapsed; int i;//Anzahl der Kleinschritte herrausbekommen: for (i = 1; dir.quad_abs()*time > BLOCKSIZE*BLOCKSIZE; i++) { time = timeElapsed/i; } //////////////////// //X/Y-Collisions: for (i = 1; (i*time <= timeElapsed); i++) { if (!XCollision.bIsCollision) { FR.x += dir.x*time; XCollision = getCollision(FR); if (XCollision.bIsCollision) { //kollission durch x-Rutschen? FR.x -= dir.x*time; //dann x-Rutschen wieder r�ckg�ngig machen dir.x *= (-1 * XCollision.fBouncingFactorX); } } if (!YCollision.bIsCollision) { //yes all physicall objects fall! //Fallbeschleunigung dazu! //HINT: Fallkurve hängt von getTimeelapsed ab!! evtl mit s=g/2t² arbeieten dir.y += Gravity*time; //graviy muss nach unten zeigen... it->setCanJump(false); //kann auf jeden erstmal nicht springen //Kollission durch y-Verschiebung?? FR.y += dir.y*time; YCollision = getCollision(FR); if (YCollision.bIsCollision) { //kollission durch y-Rutschen? //JumpingBoard... //getBouncingfactor from Blocktype FR.y -= dir.y*time; //dann y-Rutschen wieder r�ckg�ngig machen dir.y *= (-1 * YCollision.fBouncingFactorY);//neues Y if ((Abs(dir.y) < 10.0f) || (YCollision.BlockType == CBlock::JUMPBOARD)) { it->setCanJump(true); } } } if (YCollision.bIsCollision && XCollision.bIsCollision) break; }//für jeden SChritt... //wenn keine x-Kollission: //HINT:Reibung://Flugreibung ist Sinnlos! if (!XCollision.bIsCollision) dir.x *= (Friction ) ; //TODO TimeElapsed einrechnen! if (FR.x < 0.0f) FR.x = 0.0f; //man kann nicht aus dem linken bildschirm fallen!! if (FR.y < 0.0f) {//opben geht das ganze natürlich auch nicht FR.y = 0.0f; dir.y = 0.0f; }//MBE Performance: allways 0.0f if its float! with .0f!!! //Wenn keine kollission dann Verschieben !...^^ it->setDir(dir); it->setRect(FR); //gegebenenfalls neue collision setzen if (YCollision.BlockType != CBlock::AIR) it->setLastCollisionY(YCollision); }