public override void Update(float delta) { if (_isReloading) { _reloadingTime += delta; if (_reloadingTime >= _cooldown) { _isReloading = false; } return; } if (_inputController.MouseUpdate && _inputController.MouseButtons[0]) { Vector3 rotation = GameObject.Rotation; rotation.Y = GameObject.Children[1].Rotation.Y; Matrix rotationMatrix = Matrix.RotationYawPitchRoll(rotation.Z, rotation.Y, rotation.X); Vector3 direction = (Vector3)Vector3.Transform(Vector3.UnitZ, rotationMatrix); Game3DObject bullet = _bulletPrototype.GetCopy(); bullet.MoveTo(GameObject.Position + direction); bullet.AddScript(new BulletScript(direction, 1, 1)); GameObject.Scene.AddGameObject(bullet); OnCakeShoot?.Invoke(); _reloadingTime = 0; _isReloading = true; } }
public PlatformsMovementScript(Game3DObject player, float speedY, float maxY, float minY) { _speedY = speedY; _maxY = maxY; _minY = minY; _player = player; }
public override void Update(float delta) { if (_isCreating) { _lastCreatingTime += delta; if (_lastCreatingTime >= _cooldown) { _isCreating = false; } return; } var position = new Vector3(GameObject.Position.X, GameObject.Position.Y - 0.27f, GameObject.Position.Z); var direction = _target.Position - position; direction.Normalize(); Game3DObject copyBullet = _bullet.GetCopy(); copyBullet.MoveTo(position); //copyBullet.MoveTo(GameObject.Position); if ((GameObject.Position - _target.Position).Length() <= 1.5f) { copyBullet.AddScript(new BulletScript(direction)); GameObject.Scene.AddGameObject(copyBullet); OnEggShoot?.Invoke(); } _lastCreatingTime = 0; _isCreating = true; }
/// <summary> /// Конструктор класса /// </summary> /// <param name="spawn">Объект, относительно которого появляется стрела</param> /// <param name="speed">Базовая скорость полёта стрелы</param> /// <param name="lifeTime">Время существования стрелы</param> public Arrow(Game3DObject spawn, float speed, float lifeTime) { _spawnObject = spawn; _speed = speed; _lifeTime = lifeTime; _time = 0.0f; }
public PlatformsSpawnerScript(Game3DObject platform, float cooldown = 0.51f) { _cooldown = cooldown; _lastCreatingTime = 0; _isCreating = false; _platform = platform; random = new Random(); }
/// <summary> /// Конструктор класса /// </summary> /// <param name="target">Цель врага</param> /// <param name="detectRadius">Радиус обнаружения</param> /// <param name="damage">Урон врага</param> public Enemy(SharpAudioVoice voice1, SharpAudioVoice voice2, Game3DObject target, float detectRadius, int damage) { _voice1 = voice1; _voice2 = voice2; _target = target; _detectRadius = detectRadius; _damage = damage; }
public BulletSpawnerScript(Game3DObject target, Game3DObject bullet, float cooldown = 2f) { _cooldown = cooldown; _lastCreatingTime = 0; _isCreating = false; _bullet = bullet; _target = target; }
public PlayerGunScript(Game3DObject bullet, float cooldown = 0.2f) { _inputController = InputController.GetInstance(); _bulletPrototype = bullet; _cooldown = cooldown; _reloadingTime = 0; _isReloading = false; }
/// <summary> /// От так /// </summary> /// <param name="player">Игрок</param> private void Attack(Game3DObject player) { _voice1.Stop(); _voice2.Stop(); _voice2.Play(); _reloadComponent.StartReload(); player.GetComponent <PlayerComponent>().RemoveHealth(_damage); new Animation(new float[] { 0f, -0.02f, 0.035f }, 0.5f).AddProcess((value) => { var position = GameObject.Children[1].LocalPosition; GameObject.Children[1].MoveBy(0, 0, value); }); }
private void GetChildrenMeshes(ref Game3DObject parent, Node node) { if (node.HasChildren) { var objects = new List <Game3DObject>(); foreach (var child in node.Children) { node.Transform.Decompose(out Vector3D _, out Assimp.Quaternion rotation, out Vector3D position); var newChildObject = new Game3DObject(new Vector3(position.X, position.Y, position.Z), ToEulerAngles(rotation)); newChildObject.AddMeshObject(meshList.Find(x => x.Name == child.Name)); objects.Add(newChildObject); GetChildrenMeshes(ref newChildObject, child); } parent.Children.AddRange(objects); } }
private void CreatePlatforms(Loader loader, int index, Vector3 position) { var file = @"Resources\Models\platform" + index.ToString() + ".fbx"; var obstacle = loader.LoadGameObjectFromFile(file, position, Vector3.Zero); obstacle.Tag = "obstacle"; obstacle.Collision = new BoxCollision(2.2f, 0.8f * index); obstacle.AddComponent(new ColliderComponent()); obstacle.AddScript(new ColliderScript()); var platform = new Game3DObject(new Vector3(0.0f, 1.5f * index, 0.0f), Vector3.Zero); platform.Tag = "ground"; platform.Collision = new BoxCollision(1.8f, 0.8f); platform.AddComponent(new ColliderComponent()); platform.AddScript(new ColliderScript()); obstacle.AddChild(platform); AddGameObject(obstacle); }
protected override void InitializeObjects(Loader loader, SharpAudioDevice audioDevice) { string file = @"Models\T_Rex.fbx"; _go = loader.LoadGameObjectFromFile(file, Vector3.Zero, new Vector3(0, MathUtil.PiOverTwo, 0)); Game3DObject g1 = loader.LoadGameObjectFromFile(file, new Vector3(1, 1, 0), Vector3.Zero); Game3DObject g2 = loader.LoadGameObjectFromFile(file, new Vector3(-1, 1, 0), Vector3.Zero); Game3DObject g3 = loader.LoadGameObjectFromFile(file, Vector3.UnitZ * 2, Vector3.Zero); _go.AddChild(g1); _go.AddChild(g2); _go.AddChild(g3); _go.AddScript(new DinoMovementScript()); AddGameObject(_go); AddGameObject(loader.LoadGameObjectFromFile(@"Models\dsa.fbx", Vector3.UnitX * 5, Vector3.Zero)); _voice = new SharpAudioVoice(audioDevice, @"Sounds\again.wav"); _voice2 = new SharpAudioVoice(audioDevice, @"Sounds\again.wav"); }
protected override void InitializeObjects(Loader loader, SharpAudioDevice audioDevice) { //_camera = new OrthoCamera(new Vector3(0, 20, -20), rotY: MathUtil.Pi / 4f, fovY: 0.1f); _camera = new Camera(new Vector3(0, 60, -60), rotY: MathUtil.Pi / 4f); _player = CreatePlayer(loader); var z1 = CreateZombie(loader); //var z2 = CreateZombie(loader); //var z3 = CreateZombie(loader); z1.MoveTo(Vector3.UnitX * 40); //z2.MoveTo(Vector3.UnitX * -40); //z3.MoveTo(Vector3.UnitZ * -40); AddGameObject(_player); //AddGameObject(loader.LoadGameObjectFromFile(@"Models\FirstAidKit.fbx", Vector3.Zero, Vector3.Zero, @"Textures\ammo.tif")); AddGameObject(z1); //AddGameObject(z2); //AddGameObject(z3); var ammo = loader.LoadGameObjectFromFile(@"Models\BonusAmmo.fbx", Vector3.UnitX * 20, Vector3.Zero); ammo.Collision = new SphereCollision(2); ammo.AddScript(new AmmoBonusScript(_player)); var health = loader.LoadGameObjectFromFile(@"Models\BonusHeart.fbx", Vector3.UnitZ * 20, Vector3.Zero); health.Collision = new SphereCollision(2); health.AddScript(new HealthBonusScript(_player)); var invisibility = loader.LoadGameObjectFromFile(@"Models\BonusStels.fbx", Vector3.UnitX * -20, Vector3.Zero); invisibility.Collision = new SphereCollision(2); invisibility.AddScript(new InvisibilityBonusScript(_player)); AddGameObject(ammo); AddGameObject(health); AddGameObject(invisibility); }
public Game3DObject LoadGameObjectFromFile(string path, Vector3 startPosition, Vector3 startRotation, string texture = null) { var importer = new AssimpContext(); importer.SetConfig(new NormalSmoothingAngleConfig(66.0f)); var fileScene = importer.ImportFile(path, PostProcessSteps.Triangulate); var indices = new List <uint>(); var vertices = new List <Renderer.VertexDataStruct>(); var root = fileScene.RootNode; Game3DObject gameObject = null; meshList = new List <MeshObject>(); materials = new List <Graphics.Material>(); textures = new List <Texture>(); ExtractTextures(fileScene); ExtractMaterials(fileScene, texture); ExtractMeshes(fileScene, indices, vertices); gameObject = new Game3DObject(startPosition, startRotation); if (root.HasChildren) { foreach (var child in root.Children) { if (child.HasMeshes) { child.Transform.Decompose(out Vector3D _, out Assimp.Quaternion rotation, out Vector3D position); var childObject = gameObject.AddChild(new Game3DObject(new Vector3(position.X, position.Y, position.Z), ToEulerAngles(rotation))); childObject.AddMeshObject(meshList[child.MeshIndices[0]]); GetChildrenMeshes(ref childObject, child); } } } else { gameObject.AddMeshObject(meshList[root.MeshIndices[0]]); } return(gameObject); }
/// <summary> /// Проверка столкновения коллайдера с другими объектами с тегам /// </summary> /// <param name="gameObject">Пересекаемый объект или NULL</param> /// <param name="tag">Тэг объкта, с которым проверяется пересечение</param> /// <returns>Результат пересечения</returns> public bool CheckIntersects(out Game3DObject gameObject, string tag = "") { foreach (var collision in _collisions) { if (tag == "" || collision.GameObject.Tag != tag) { continue; } if (collision != GameObject.Collision) { var result = ObjectCollision.Intersects(GameObject.Collision, collision); if (result) { gameObject = collision.GameObject; return(result); } } } gameObject = null; return(false); }
/// <summary> /// Обновление поведения /// </summary> /// <param name="delta">Время между кадрами</param> public override void Update(float delta) { if (_physicsComponent == null) { return; } if (_physicsComponent.IsGrounded) { if (!ObjectCollision.Intersects(GameObject.Collision, _ground.Collision)) { _ground = null; } } else { if (_colliderComponent.CheckIntersects(out Game3DObject ground, "ground")) { _ground = ground; } } _physicsComponent.UpdateGrounded(_ground); }
public BulletFlyScript(float flySpeed, Game3DObject target, int damage) { this._flySpeed = flySpeed; this._target = target; this._damage = damage; }
public FinishPlatformScript(Game3DObject player) { _player = player; }
/// <summary> /// Обработка попадания стрелы во врага /// </summary> /// <param name="enemy">Объект врага</param> protected override void HandleHitEnemy(Game3DObject enemy) { enemy.GetComponent <EnemyComponent>().MakeSlow(_slowTime); base.HandleHitEnemy(enemy); }
/// <summary> /// Конструктор класса /// </summary> /// <param name="spawn">Объект, относительно которого появляется стрела</param> /// <param name="speed">Базовая скорость полёта стрелы</param> /// <param name="lifeTime">Время существования стрелы</param> /// <param name="slowTime">Время замедления врага</param> public PoisonArrow(Game3DObject spawn, float speed, float lifeTime, float slowTime) : base(spawn, speed, lifeTime) { _slowTime = slowTime; }
/// <summary> /// Обработка попадания стрелы во врага /// </summary> /// <param name="enemy">Объект врага</param> protected virtual void HandleHitEnemy(Game3DObject enemy) { enemy.GetComponent <EnemyComponent>().RemoveHealth(); GameObject.Scene.RemoveGameObject(GameObject); _colliderComponent.RemoveCollisionFromScene(); }
public CopyableGameObject(Game3DObject gameObject, List <Func <Script> > scripts, List <Func <ObjectComponent> > components) { GameObject = gameObject; Scripts = scripts; Components = components; }
private void CreatePlayerLoader(Loader loader) { // создание игрока _player = new Game3DObject(new Vector3(0.0f, 10.0f, -5.0f), Vector3.Zero); float deltaAngle = Camera.FOVY / Game.RenderForm.ClientSize.Height; _player.Tag = "player"; _player.Collision = new BoxCollision(1.0f, 1.7f); _player.AddComponent(new PhysicsComponent()); _player.AddScript(new PhysicsScript()); _player.AddComponent(new ColliderComponent()); _player.AddScript(new ColliderScript()); var playerComponent = new PlayerComponent(); playerComponent.OnArrowsCountChanged += UpdateArrowsCountUI; playerComponent.OnHealthChanged += (count) => _healthProgressBar.Value = count; playerComponent.AddArrows(ArrowType.Standart, 5); playerComponent.AddArrows(ArrowType.Poison, 2); _player.AddComponent(playerComponent); _player.AddScript(new PlayerMovement(deltaAngle, 4f, 0.5f, 2.0f)); _player.AddChild(Camera); // доабвление игроку лука string file = @"Resources\Models\bow.fbx"; var bow = loader.LoadGameObjectFromFile(file, new Vector3(-0.017f, 0.94f, 0.08f), Vector3.Zero); _player.AddChild(bow); //добавление точки появления стрел игроку var arrowParrent = new Game3DObject(new Vector3(-0.052f, 0.95f, 0.0f), Vector3.Zero); arrowParrent.AddComponent(new VisibleComponent()); arrowParrent.AddScript(new VisibleScript()); // скрипт стрельбы var bowShootScript = new BowShoot(2.0f, 1.0f); //создание копируемых стрел для игрока //обычная стрела file = @"Resources\Models\arrow.fbx"; var arrow = loader.LoadGameObjectFromFile(file, Vector3.Zero, Vector3.Zero); arrow.Collision = new BoxCollision(0.3f, 0.2f, 0.3f); var arrowComponents = new List <Func <ObjectComponent> > { () => new ArrowComponent(), () => new PhysicsComponent(0.05f), () => new ColliderComponent() }; var arrowScripts = new List <Func <Script> > { () => new Arrow(arrowParrent, 20.0f, 5.0f), () => new PhysicsScript(), () => new ColliderScript() }; var arrowTemplate = new CopyableGameObject(arrow, arrowScripts, arrowComponents); bowShootScript.AddArrowTemplate(ArrowType.Standart, arrowTemplate); //стрела с ядом file = @"Resources\Models\arrowPoison.fbx"; arrow = loader.LoadGameObjectFromFile(file, Vector3.Zero, Vector3.Zero); arrow.Collision = new BoxCollision(0.3f, 0.2f, 0.3f); arrowComponents = new List <Func <ObjectComponent> > { () => new ArrowComponent(), () => new PhysicsComponent(0.05f), () => new ColliderComponent() }; arrowScripts = new List <Func <Script> > { () => new PoisonArrow(arrowParrent, 20.0f, 5.0f, 5.0f), () => new PhysicsScript(), () => new ColliderScript() }; arrowTemplate = new CopyableGameObject(arrow, arrowScripts, arrowComponents); bowShootScript.AddArrowTemplate(ArrowType.Poison, arrowTemplate); arrowParrent.AddScript(bowShootScript); //добавление стрел к точке появления file = @"Resources\Models\arrow.fbx"; arrow = loader.LoadGameObjectFromFile(file, Vector3.Zero, Vector3.Zero); arrowParrent.AddChild(arrow); file = @"Resources\Models\arrowPoison.fbx"; arrow = loader.LoadGameObjectFromFile(file, Vector3.Zero, Vector3.Zero); arrow.IsHidden = true; arrowParrent.AddChild(arrow); _player.AddChild(arrowParrent); AddGameObject(_player); }