示例#1
0
文件: Worm.cpp 项目: xy124/Spill
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
}
示例#2
0
文件: Physics.cpp 项目: albertz/Spill
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);
}