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 }
WaypointGenerator::WaypointGenerator(World* world, MapObject* object, LPoint4 margin, LPoint2 spacing, bool corner_origin) : world(world), object(object) { LPoint3f size = NodePathSize(object->render); spacingx = spacing.get_x(); spacingy = spacing.get_y(); sizex = (size.get_x() - (margin.get_x() + margin.get_z())) / spacingx + 1; sizey = (size.get_y() - (margin.get_y() + margin.get_w())) / spacingy + 1; if (corner_origin) { initPosX = -(margin.get_x() - size.get_x()); initPosY = -(margin.get_y() - size.get_y()); spacingx = -spacingx; spacingy = -spacingy; } else { initPosX = margin.get_x() - (size.get_x() / 2); initPosY = margin.get_y() - (size.get_y() / 2); } if (!(object->collider.node.is_empty())) { LPoint3f collision_node_pos = object->collider.node.get_pos(); initPosX -= collision_node_pos.get_x(); initPosY -= collision_node_pos.get_y(); } initPosZ = size.get_z() + 50.f; }
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; }
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 }