示例#1
0
        private void MenuItem_OnClick2(object sender, RoutedEventArgs e)
        {
            var block = new Block("New Block");

            block.AddComponent <TransformComponent>();
            (ProjectStructure.SelectedItem as NodeViewModel).AddChild(block, true);
        }
示例#2
0
        private void ProjectWindow_OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            var rootBlock = ((ProjectViewModel)DataContext).Workspace.RootBlock;

            rootBlock.AddComponent <TransformComponent>();

            var sphere = new Block("Sphere");

            sphere.AddComponent <TransformComponent>();
            sphere.AddComponent <SphereRendererComponent>();
            sphere.AddComponent <RigidBodyComponent>();


            var box = new Block("Box");

            box.AddComponent <TransformComponent>();
            box.AddComponent <BoxRendererComponent>();
            box.AddComponent <RigidBodyComponent>();

            box.GetComponent <TransformComponent>().Position.Value    = new Vector3(0, 0, -10);
            box.GetComponent <RigidBodyComponent>().IsKinematic.Value = true;

            rootBlock.AddChild(sphere);
            rootBlock.AddChild(box);

            SystemManager <Block> .RegisterSystem(new TransformSystem());

            SystemManager <Block> .RegisterSystem(new RenderingSystem());

            SystemManager <Block> .RegisterSystem(new PhysicsSystem());

            SystemManager <Block> .InitializeSystems(rootBlock);

            SceneRoot.Children.Clear();
            SceneRoot.Children.Add(new ModelVisual3D
            {
                Content = SystemManager <Block> .GetSystem <RenderingSystem>().RootModel3D
            });
        }
示例#3
0
    public Block Instance()
    {
        if (_instance != null)
        {
            return(_instance);
        }

        Block b = new Block();

        b.Info = this;

        foreach (var c in Components)
        {
            b.AddComponent(c.Key, c.Value);
        }

        return(b);
    }
示例#4
0
    public override bool OnPlace(int x, int y, int z, int rot)
    {
        Block b = Block.Transparent.Instance();

        b.AddComponent <MultiblockPartComponent>(x, y, z, parentBlock);

        bool  canPlaceThis;
        Chunk chunk = null;

        foreach (Vector3Int pos in Locations)
        {
            if (pos.x + x < 0 || pos.x + x > World.sizeX * Chunk.maxX - 1 || pos.z + z < 0 || pos.z + z > World.sizeZ * Chunk.maxZ - 1 || World.GetBlock(x + pos.x, y + pos.y, z + pos.z) != null)
            {
                return(false);
            }

            canPlaceThis = false;
            chunk        = World.GetChunkByBlock(x + pos.x, z + pos.z);

            foreach (Chunk c in World.builder.building.Chunks)
            {
                if (c == chunk)
                {
                    canPlaceThis = true;
                    break;
                }
            }

            if (!canPlaceThis)
            {
                return(false);
            }
        }

        foreach (Vector3Int pos in Locations)
        {
            World.SetBlock(x + pos.x, y + pos.y, z + pos.z, b);
        }

        MeshCreator.UpdateMesh(chunk, chunk.Blocks);

        return(true);
    }
示例#5
0
        private Entity LoadBlock(Vector2 pos, string collisionType, string blocktype)
        {
            Block block;

            switch (blocktype)
            {
            case "walls":
                block = new Wall(LevelMapSpriteFactory.Instance.CreateExterior(), pos);
                Constants.SetLayerDepth(block, Constants.LayerDepth.Room);
                break;

            case "entrance":
                block = new Block(LevelMapSpriteFactory.Instance.CreateRoomEntrance(), pos);
                Constants.SetLayerDepth(block, Constants.LayerDepth.Room);
                break;

            case "empty":
                block = new Block(LevelMapSpriteFactory.Instance.CreateRoomEmpty(), pos);
                Constants.SetLayerDepth(block, Constants.LayerDepth.Room);
                break;

            case "black":
                block = new Block(LevelMapSpriteFactory.Instance.CreateRoomBlack(), pos);
                Constants.SetLayerDepth(block, Constants.LayerDepth.Room);
                break;

            case "itemroom":
                block = new Block(LevelMapSpriteFactory.Instance.CreateRoomItem(), pos);
                Constants.SetLayerDepth(block, Constants.LayerDepth.Room);
                break;

            case "downdoor":
                block = new Door(LevelMapSpriteFactory.Instance.CreateDownOpen(), pos);
                break;

            case "leftdoor":
                block = new Door(LevelMapSpriteFactory.Instance.CreateLeftOpen(), pos);
                break;

            case "rightdoor":
                block = new Door(LevelMapSpriteFactory.Instance.CreateRightOpen(), pos);
                break;

            case "updoor":
                block = new Door(LevelMapSpriteFactory.Instance.CreateTopOpen(), pos);
                break;

            case "downwall":
                block = new Door(LevelMapSpriteFactory.Instance.CreateDownWall(), pos, Door.Type.Wall);
                break;

            case "leftwall":
                block = new Door(LevelMapSpriteFactory.Instance.CreateLeftWall(), pos, Door.Type.Wall);
                break;

            case "rightwall":
                block = new Door(LevelMapSpriteFactory.Instance.CreateRightWall(), pos, Door.Type.Wall);
                break;

            case "upwall":
                block = new Door(LevelMapSpriteFactory.Instance.CreateTopWall(), pos, Door.Type.Wall);
                break;

            case "downlock":
                block = new Door(LevelMapSpriteFactory.Instance.CreateDownLock(), pos, Door.Type.Locked);
                break;

            case "leftlock":
                block = new Door(LevelMapSpriteFactory.Instance.CreateLeftLock(), pos, Door.Type.Locked);
                break;

            case "rightlock":
                block = new Door(LevelMapSpriteFactory.Instance.CreateRightLock(), pos, Door.Type.Locked);
                break;

            case "uplock":
                block = new Door(LevelMapSpriteFactory.Instance.CreateTopLock(), pos, Door.Type.Locked);
                break;

            case "downbomb":
                block = new Door(LevelMapSpriteFactory.Instance.CreateDownWall(), pos, Door.Type.BombWall);
                break;

            case "leftbomb":
                block = new Door(LevelMapSpriteFactory.Instance.CreateLeftWall(), pos, Door.Type.BombWall);
                break;

            case "rightbomb":
                block = new Door(LevelMapSpriteFactory.Instance.CreateRightWall(), pos, Door.Type.BombWall);
                break;

            case "upbomb":
                block = new Door(LevelMapSpriteFactory.Instance.CreateTopWall(), pos, Door.Type.BombWall);
                break;

            case "downboss":
                block = new Door(LevelMapSpriteFactory.Instance.CreateDownBoss(), pos, Door.Type.Locked);
                break;

            case "leftboss":
                block      = new Door(LevelMapSpriteFactory.Instance.CreateLeftBoss(), pos, Door.Type.Locked);
                block.name = "boss_door";
                break;

            case "rightboss":
                block = new Door(LevelMapSpriteFactory.Instance.CreateRightBoss(), pos, Door.Type.Locked);
                break;

            case "upboss":
                block = new Door(LevelMapSpriteFactory.Instance.CreateTopBoss(), pos, Door.Type.Locked);
                break;

            case "statuedragon":
                block = new Block(LevelMapSpriteFactory.Instance.CreateStatueDragon(), pos);
                break;

            case "statueface":
                block = new Block(LevelMapSpriteFactory.Instance.CreateStatueFace(), pos);
                break;

            case "bluestatuedragon":
                block = new Block(LevelMapSpriteFactory.Instance.CreateBlueStatueDragon(), pos);
                break;

            case "bluestatueface":
                block = new Block(LevelMapSpriteFactory.Instance.CreateBlueStatueFace(), pos);
                break;

            case "raisedtile":
                block = new Block(LevelMapSpriteFactory.Instance.CreateTileRaised(), pos);
                break;

            case "stairs":
                block = new Block(LevelMapSpriteFactory.Instance.CreateTileStairs(), pos);
                break;

            case "navytile":
                block = new Block(LevelMapSpriteFactory.Instance.CreateTileNavy(), pos);
                break;

            case "water":
                block = new Block(LevelMapSpriteFactory.Instance.CreateTileBlue(), pos);
                break;

            case "invis":
                block = new Block(LevelMapSpriteFactory.Instance.CreateTileInvis(), pos);
                break;

            default:
                Console.WriteLine("Level @ LoadBlock(): Unrecognized blocktype \"" + blocktype + "\"!");
                return(null);
            }

            // TODO: Slowly but surely we should create classes for each general type
            // of block (Door, Wall, MovableBlock, etc.) to avoid this collision logic.
            var coll = new Collider();

            switch (collisionType)
            {
            case "movableU":
                coll.response = new MovableCollisionResponse(block, Constants.Direction.UP);
                break;

            case "movableD":
                coll.response = new MovableCollisionResponse(block, Constants.Direction.DOWN);
                break;

            case "movableL":
                coll.response = new MovableCollisionResponse(block, Constants.Direction.LEFT);
                break;

            case "movableR":
                coll.response = new MovableCollisionResponse(block, Constants.Direction.RIGHT);
                break;

            case "movableRK":
                coll.response = new MovableKeyCollisionResponse(block, Constants.Direction.RIGHT, Root.name);
                break;

            case "rigid":
                coll.response = new RigidCollisionResponse(block);
                break;

            //case "door":
            //    coll.response = new DoorCollisionResponse(block);
            //    break;
            case "invis":
                coll.response = new InvisibleBlockCollisionResponse(block);
                break;

            case "stairs00":
                coll.response = new StairsCollisionResponse(block, "0_0");
                break;

            case "stairs10":
                coll.response = new StairsCollisionResponse(block, "1_0");
                break;

            case "wall":
                // Already handled
                break;

            case "none":
                // no collision necessary
                break;

            default:
                //coll.response = new BaseCollisionResponse(block);
                break;
            }
            block.AddComponent(coll);

            Scene.Add(block);
            return(block);
        }