foreach (QGraphicsItem *item, collidingItems()){ if (item->zValue() == zValue() - 1){ QString kind = item->data(0).toString(); if ((kind == "Object") || (kind == "Robot")){ hide(); m_bulletTime->stop(); emit bulletCollision(item); } } }
bool Sprite::update() { // Delete colliding bullets for (auto i = game.bullets.begin(); i != game.bullets.end();) { if (bulletCollision(*i)) { delete (*i); game.bullets.erase(i++); } ++i; } return true; }
void Room::update(float time, glm::vec3 player_pos) { /*CREACION DE BALAS*/ for (Enemy *enemy : enemies){ if (enemy->type() == 3 and ((Arbok*)enemy)->isShooting()){ // Arbok, puede tener una bala glm::vec3 dirBullet = glm::normalize(player_pos - enemy->position()); glm::vec3 posBullet = enemy->position() + dirBullet * enemy->radius() * 2.0f; enemies.push_back(new Bullet(posBullet,dirBullet,0,enemy->getPower()*2,enemy->radius())); } // otro enemigo dispara 8 balas } /*REBOTE EN LAS PAREDES */ for (Enemy *enemy : enemies) { glm::vec3 nextpos = enemy->stepTest(time, player_pos); RoomWhere npos = where(nextpos.x, nextpos.z, enemy->radius()); if (npos == CAN_BE and !enemiesCollision(enemy,nextpos)) enemy->step(); else if(npos == COLLISION and enemy->type() == 4) enemy->step(); else if (npos == E_COLLISION or npos == W_COLLISION) enemy->reflectDirection(-1,1); else if (npos == N_COLLISION or npos == S_COLLISION) enemy->reflectDirection(1,-1); else if (npos > CAN_BE and enemy->type() == 4) //bala muere en las puertas enemy->receiveImpact(1); } /*calcular colisiones de las balas*/ for (Enemy *enemy : enemies) { int damage = bulletCollision(enemy); if (damage>0) enemy->receiveImpact(damage); } for (ParticleEngine *pe : particles) pe->step(time); removeDead(); }
//------------------------------------------------------------------------------------- bool MainApplication::frameRenderingQueued(const Ogre::FrameEvent& evt) { if(mWindow->isClosed()) return false; if(mShutDown) return false; //Need to capture/update each device mKeyboard->capture(); mMouse->capture(); Ogre::Vector3 shotsSpeed(500, 0, 0); Ogre::Vector3 enemySpeed(-500, rand() % 10 - 5, 0); Ogre::Vector3 playerPosition = mSceneMgr -> getSceneNode("NinjaNode")->getPosition(); Ogre::Vector3 playerDirection = mSceneMgr -> getSceneNode("NinjaNode") -> getOrientation() * Ogre::Vector3(0,0,1); //Ogre::Vector3 direction = mSceneMgr -> getSceneNode("NinjaNode") ->_getDerivedOrientation() * Ogre::Vector3::NEGATIVE_UNIT_Z; if(playerCollision(playerPosition, playerDirection)) { mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(0, 0, -500)); } mTrayMgr->frameRenderingQueued(evt); mSceneMgr -> getSceneNode("NinjaNode") -> translate(mDirection * evt.timeSinceLastFrame, Ogre::Node::TS_WORLD); if(shotCounter) { //Ogre::String number2 = Ogre::StringConverter::toString(shotCounter); for(int i = 0; i < shots.size(); i++) { Ogre::Vector3 shotPosition = mSceneMgr -> getSceneNode(shots[i])->getPosition(); Ogre::Vector3 shotDirection = mSceneMgr -> getSceneNode(shots[i]) -> getOrientation() * Ogre::Vector3(0,0,1); if(bulletCollision(shotPosition, shotDirection)) { mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(0, 0, 0)); //mDistance = Ogre::Vector3::ZERO; //mShutDown = true; } mSceneMgr -> getSceneNode(shots[i]) -> translate(shotsSpeed * evt.timeSinceLastFrame, Ogre::Node::TS_WORLD); } } if(enemyCounter) { //Ogre::String number = Ogre::StringConverter::toString(enemyCounter); for(int i = 0; i < enemies.size(); i++) { mSceneMgr -> getSceneNode(enemies[i]) -> translate(enemySpeed * evt.timeSinceLastFrame, Ogre::Node::TS_WORLD); } } //enemytranslate mDistance = mSceneMgr-> getSceneNode("NinjaNode")->getPosition(); if(mDistance.x >= MAX_RIGHT) { mDirection.x = 0; mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(MAX_RIGHT, mDistance.y, mDistance.z)); } if(mDistance.x <= MAX_LEFT) { mDirection.x = 0; mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(MAX_LEFT, mDistance.y, mDistance.z)); } if(mDistance.y >= MAX_UP) { mDirection.y = 0; mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(mDistance.x, MAX_UP, mDistance.z)); } if(mDistance.y <= MAX_DOWN) { mDirection.y = 0; mSceneMgr -> getSceneNode("NinjaNode") -> setPosition(Ogre::Vector3(mDistance.x, MAX_DOWN, mDistance.z)); } timer++; if(timer%20 == 0) { spawn_enemy(); } return true; }