void Projectile::Run(float elapsed_time) { if (HasReachedDestination()) { float factor, attenuation; time_left -= elapsed_time; factor = time_left / timeout; attenuation = base_attenuation / factor; SetAttenuation(0, 0, (attenuation < 0 ? 1000 : attenuation)); } else { LPoint3f objective = target.get_pos(node_path.get_parent()); LPoint3f position = node_path.get_pos(); LPoint3f distance = position - objective; float max_distance = max(max(abs((long)distance.get_x()), abs((long)distance.get_y())), abs((long)distance.get_z())); LPoint3f movement; if (max_distance <= speed) { node_path.set_pos(objective); node_path.hide(); HitsTarget.Emit(); } else { movement.set_x(-(speed * (distance.get_x() / max_distance))); movement.set_y(-(speed * (distance.get_y() / max_distance))); movement.set_z(-(speed * (distance.get_z() / max_distance))); node_path.set_pos(node_path.get_pos() + movement); } } }
void SceneCamera::CenterCameraOn(NodePath np) { if (_useTrackball) _window->center_trackball(np); else { _centeringCamera = true; _objectivePos = np.get_pos(_window->get_render()); _objectivePos.set_z(_objectivePos.get_z() + _camera_height); LPoint3f cameraRot = _camera.get_hpr(); float rad2deg = 3.1415926535897 / 180; cameraRot.set_x(cameraRot.get_x() * rad2deg); cameraRot.set_y(cameraRot.get_y() * rad2deg); cameraRot.set_z(cameraRot.get_z() * rad2deg); _objectivePos.set_x(np.get_x() + sin(cameraRot.get_x()) * 100); _objectivePos.set_y(np.get_y() + tan(cameraRot.get_y()) * 100); if (_currentCameraAngle == 1) _objectivePos.set_y(_objectivePos.get_y() + 80 + (140 - _camera_height) / 1.35); else { _objectivePos.set_x(_objectivePos.get_x() + 25 - (_camera_height - 50) * 0.85); _objectivePos.set_y(_objectivePos.get_y() + 40 - (_camera_height - 50) * 1); } } }
/* * Camera/NodePath centering and following stuff */ void SceneCamera::CenterCameraInstant(LPoint3f pos) { _cameraPos = pos; LPoint3f cameraRot = _camera.get_hpr(); float rad2deg = 3.1415926535897 / 180; cameraRot.set_x(cameraRot.get_x() * rad2deg); cameraRot.set_y(cameraRot.get_y() * rad2deg); cameraRot.set_z(cameraRot.get_z() * rad2deg); _camera.set_x(pos.get_x() + sin(cameraRot.get_x()) * 100); _camera.set_y(pos.get_y() + sin(cameraRot.get_y()) * 100); if (_currentCameraAngle == 1) _camera.set_y(_camera.get_y() + 80 + (140 - _camera_height) / 1.35); else { _camera.set_x(_camera.get_x() + 25 - (_camera_height - 50) * 0.85); _camera.set_y(_camera.get_y() + 40 - (_camera_height - 50) * 1); } #ifndef GAME_EDITOR CameraMoved.Emit(); #endif }
void SceneCamera::RunFollow(float elapsedTime) { if (_followingNodePath) CenterCameraOn(_toFollow); LPoint3f camVec = _objectivePos - _camera.get_pos(); LPoint3f camSpeed; camSpeed = camVec / 2; if (camSpeed.get_x() > 0 && camSpeed.get_x() < _cameraMovementSpeed) camSpeed.set_x(_cameraMovementSpeed); else if (camSpeed.get_x() < 0 && camSpeed.get_x() > -_cameraMovementSpeed) camSpeed.set_x(-_cameraMovementSpeed); if (camSpeed.get_y() > 0 && camSpeed.get_y() < _cameraMovementSpeed) camSpeed.set_y(_cameraMovementSpeed); else if (camSpeed.get_y() < 0 && camSpeed.get_y() > -_cameraMovementSpeed) camSpeed.set_y(-_cameraMovementSpeed); if (camSpeed.get_z() > 0 && camSpeed.get_z() < _cameraMovementSpeed) camSpeed.set_z(_cameraMovementSpeed); else if (camSpeed.get_z() < 0 && camSpeed.get_z() > -_cameraMovementSpeed) camSpeed.set_z(-_cameraMovementSpeed); camSpeed = camSpeed * elapsedTime; LPoint3f dest = _camera.get_pos() + (camSpeed); LPoint3f dist = _objectivePos - dest; if (ABS(dist.get_x()) < ABS(camSpeed.get_x())) dest.set_x(_objectivePos.get_x()); if (ABS(dist.get_y()) < ABS(camSpeed.get_y())) dest.set_y(_objectivePos.get_y()); if (ABS(dist.get_z()) < ABS(camSpeed.get_z())) dest.set_z(_objectivePos.get_z()); _camera.set_pos(dest); #ifndef GAME_EDITOR CameraMoved.Emit(); #endif if (dest == _objectivePos) _centeringCamera = false; }
// Accepts arrow keys to move either the player or the menu cursor, // Also deals with grid checking and collision detection void World::move() { // If the camera-left key is pressed, move camera left. // If the camera-right key is pressed, move camera right. NodePath cameraNp = m_windowFrameworkPtr->get_camera_group(); cameraNp.look_at(m_ralph); if(m_keyMap[K_cam_left] != false) { cameraNp.set_x(cameraNp, -20 * ClockObject::get_global_clock()->get_dt()); } if(m_keyMap[K_cam_right] != false) { cameraNp.set_x(cameraNp, +20 * ClockObject::get_global_clock()->get_dt()); } // save ralph's initial position so that we can restore it, // in case he falls off the map or runs into something. LPoint3f startPos = m_ralph.get_pos(); // If a move-key is pressed, move ralph in the specified direction. if(m_keyMap[K_left]) { m_ralph.set_h(m_ralph.get_h() + 300 * ClockObject::get_global_clock()->get_dt()); } if(m_keyMap[K_right]) { m_ralph.set_h(m_ralph.get_h() - 300 * ClockObject::get_global_clock()->get_dt()); } if(m_keyMap[K_forward]) { m_ralph.set_y(m_ralph, -25 * ClockObject::get_global_clock()->get_dt()); } // If ralph is moving, loop the run animation. // If he is standing still, stop the animation. if(m_keyMap[K_forward] || m_keyMap[K_left] || m_keyMap[K_right]) { if(!m_isMoving) { m_ralph.loop("run", true); m_isMoving = true; } } else { if(m_isMoving) { m_ralph.stop("run"); m_ralph.pose("walk", 5); m_isMoving = false; } } // If the camera is too far from ralph, move it closer. // If the camera is too close to ralph, move it farther. LPoint3f camVec = m_ralph.get_pos() - cameraNp.get_pos(); camVec.set_z(0); float camDist = camVec.length(); camVec.normalize(); if(camDist > 10.0) { cameraNp.set_pos(cameraNp.get_pos() + camVec*(camDist-10)); camDist = 10.0; } if(camDist < 5.0) { cameraNp.set_pos(cameraNp.get_pos() - camVec*(5-camDist)); camDist = 5.0; } // Now check for collisions. NodePath renderNp = m_windowFrameworkPtr->get_render(); m_collisionTraverser.traverse(renderNp); // Adjust ralph's Z coordinate. If ralph's ray hit terrain, // update his Z. If it hit anything else, or didn't hit anything, put // him back where he was last frame. m_ralphGroundHandlerPtr->sort_entries(); if(m_ralphGroundHandlerPtr->get_num_entries() > 0 && m_ralphGroundHandlerPtr->get_entry(0)->get_into_node()->get_name() == "terrain") { m_ralph.set_z(m_ralphGroundHandlerPtr->get_entry(0)->get_surface_point(renderNp).get_z()); } else { m_ralph.set_pos(startPos); } // Keep the camera at one foot above the terrain, // or two feet above ralph, whichever is greater. m_camGroundHandlerPtr->sort_entries(); if(m_camGroundHandlerPtr->get_num_entries() > 0 && m_camGroundHandlerPtr->get_entry(0)->get_into_node()->get_name() == "terrain") { cameraNp.set_z(m_camGroundHandlerPtr->get_entry(0)->get_surface_point(renderNp).get_z()+1.0); } if(cameraNp.get_z() < m_ralph.get_z() + 2.0) { cameraNp.set_z(m_ralph.get_z() + 2.0); } // The camera should look in ralph's direction, // but it should also try to stay horizontal, so look at // a floater which hovers above ralph's head. m_floaterNp.set_pos(m_ralph.get_pos()); m_floaterNp.set_z(m_ralph.get_z() + 2.0); cameraNp.look_at(m_floaterNp); }
void SceneCamera::RunScroll(float elapsedTime) { if (_window->get_graphics_window() == 0) return ; MouseData pointer = _graphicWindow->get_pointer(0); unsigned char cameraMotion = MotionNone; float _mouseBorderMargin = 40; float cameraSpeedX = _cameraMovementSpeed; float cameraSpeedY = _cameraMovementSpeed; float cameraMovementX; float cameraMovementY; LPoint3f movement; LPoint3f cameraRot = _camera.get_hpr(); float rad2deg = 3.1415926535897 / 180; if (pointer.get_y() <= _mouseBorderMargin) { cameraMotion |= MotionTop; cameraSpeedY = cameraSpeedY * ((_mouseBorderMargin - pointer.get_y()) / _mouseBorderMargin); } else if (pointer.get_y() >= _graphicWindow->get_y_size() - _mouseBorderMargin) { cameraMotion |= MotionBottom; cameraSpeedY = cameraSpeedY * ((pointer.get_y() - (_graphicWindow->get_y_size() - _mouseBorderMargin)) / _mouseBorderMargin); } if (pointer.get_x() <= _mouseBorderMargin) { cameraMotion |= MotionLeft; cameraSpeedX = cameraSpeedX * ((_mouseBorderMargin - pointer.get_x()) / _mouseBorderMargin); } else if (pointer.get_x() >= _graphicWindow->get_x_size() - _mouseBorderMargin) { cameraMotion |= MotionRight; cameraSpeedX = cameraSpeedX * ((pointer.get_x() - (_graphicWindow->get_x_size() - _mouseBorderMargin)) / _mouseBorderMargin); } cameraMovementX = cameraSpeedX * elapsedTime; cameraMovementY = cameraSpeedY * elapsedTime; cameraRot.set_x(cameraRot.get_x() * rad2deg); cameraRot.set_y(cameraRot.get_y() * rad2deg); cameraRot.set_z(cameraRot.get_z() * rad2deg); // Horizontal movement { movement.set_y(sin(cameraRot.get_x())); movement.set_x(cos(cameraRot.get_x())); if (cameraMotion & MotionLeft) movement *= -cameraMovementX; else if (cameraMotion & MotionRight) movement *= cameraMovementX; else movement *= 0; movement.set_z(0); _camera.set_pos(_camera.get_pos() + movement); } // Vertical movement { movement.set_x(tan(cameraRot.get_x())); movement.set_y(tan(cameraRot.get_y())); if (cameraMotion & MotionTop) movement *= -cameraMovementY; else if (cameraMotion & MotionBottom) movement *= cameraMovementY; else movement *= 0; movement.set_z(0); _camera.set_pos(_camera.get_pos() + movement); } if (_maxPosX != 0 || _minPosX != 0 || _maxPosY != 0 || _minPosY != 0) { if (_camera.get_x() > _maxPosX) { _camera.set_x(_maxPosX); } else if (_camera.get_x() < _minPosX) { _camera.set_x(_minPosX); } if (_camera.get_y() > _maxPosY) { _camera.set_y(_maxPosY); } else if (_camera.get_y() < _minPosY) { _camera.set_y(_minPosY); } } #ifndef GAME_EDITOR CameraMoved.Emit(); #endif }