//------------------------------------------------------------------------- // @brief //------------------------------------------------------------------------- void LaserManager::addInstance( const Vector3& position, const Vector3& direction, const ShaderInstance& shaderInstance, bool player_laser /*= false*/) { //probably need to rotate the laser to the requested direction currently its standing straight up from 0,0,0 along the y-axis if (player_laser) { if (m_currentNumberOfPlayerLasers < m_maxLasers) { LasterRenderPair pair = std::make_pair(Laser(position, direction, shaderInstance), m_renderInstancePool.back()); pair.second->setGeometryInstance(&(m_enemyLaser->getMeshData()[0]->getGeometryInstance())); m_worldPlayerTransforms.push_back(pair); ++m_currentNumberOfPlayerLasers; m_renderInstancePool.pop_back(); } } else { if (m_currentNumberOfEnemyLasers < m_maxLasers) { LasterRenderPair pair = std::make_pair(Laser(position, direction, shaderInstance), m_renderInstancePool.back()); pair.second->setGeometryInstance(&(m_enemyLaser->getMeshData()[0]->getGeometryInstance())); m_worldEnemyTransforms.push_back(pair); ++m_currentNumberOfEnemyLasers; m_renderInstancePool.pop_back(); } } }
void ProjectileHandler::AddProjectile(std::vector<Laser> &Lasers, float OriginX, float OriginY, float DestinationX, float DestinationY, float Damage) { float hypotenuse = trg.GetHypotenuse(OriginX, OriginY,DestinationX, DestinationY); float cos_x = trg.GetCosX(OriginX, DestinationX, hypotenuse); float sin_y = trg.GetSinY(OriginY, DestinationY, hypotenuse); Lasers.push_back(Laser(OriginX, OriginY, cos_x, sin_y, Damage)); }
void Shooter::shoot(bool key, std::list<Laser> &shoots) { Uint lastTick = SDL_GetTicks(); if (key && _lastTimeShoot + shootCooldown < lastTick) { std::clog << "Shooter tire un laser" << std::endl; shoots.push_back(Laser(_x + _sprite.w() / 2, _y - Laser::sprite().h(), Laser::UP)); _lastTimeShoot = lastTick; } }
void ShotAndLaser( bool button, // 버튼 상태 (눌렸으면 true) int min_power, // 에너지 샷이 발사될 최소한의 파워 int max_gauge // 연사 게이지의 최대치 ) { // 모은 에너지, 연사 게이지 static int power=0, gauge=0; // 버튼을 누르고 있을 때: if (button) { // 에너지가 부족할 경우: // 에너지를 늘려주고 연사 게이지를 최대값으로 하여 // 샷을 발사함. 구체적인 처리는 Shot 함수에서 수행하기로 함. if (power<min_power) { power++; gauge=max_gauge; Shot(); } // 에너지가 충분한 경우: // 연사 게이지를 0으로 하고 레이저를 발사. // 구체적인 처리는 Laser 함수에서 수행하기로 함. else { gauge=0; Laser(); } } // 버튼을 누르고 있지 않을 때: else { // 연사 게이지가 0보다 클 경우: // 보통 샷을 쏘고 연사 게이지를 1 감소시킴. if (gauge>0) { Shot(); gauge--; } // 에너지를 0으로 함. power=0; } }
void spindle_run(int8_t direction) //, uint16_t rpm) { if (direction != current_direction) { plan_synchronize(); if (direction) { Laser(); if(direction > 0) { SPINDLE_DIRECTION_PORT &= ~(1<<SPINDLE_DIRECTION_BIT); } else { SPINDLE_DIRECTION_PORT |= 1<<SPINDLE_DIRECTION_BIT; } SPINDLE_ENABLE_PORT |= 1<<SPINDLE_ENABLE_BIT; } else { spindle_stop(); Laser_Stop(); } current_direction = direction; } }
void Column::shoot(std::list<Laser> &lasers) { Uint lastTick = SDL_GetTicks(); while (lastTick - _lastShoot > _shootCooldown) { std::clog << "Enemies shoot" << std::endl; Uint y = _y; Uint tmp = _y; for (Enemy &enemy : _enemies) { tmp += enemy.h(); if (enemy.isAlive()) { y = tmp; } tmp += 10; } lasers.push_back(Laser(_x + _width / 2, y, Laser::DOWN)); _lastShoot += _shootCooldown; _shootCooldown = (rand() % 5 + 2) * 1000; } }