/// <summary> /// Erzeugt eine neue Instanz eines ChallengeModeScreen-Objekts und initialisiert diese mit einem Knot3Game-Objekt, einem Spielerknoten playerKnot und dem Knoten challengeKnot, den der Spieler nachbauen soll. /// </summary> public ChallengeModeScreen(GameCore game, Challenge challenge) : base(game) { // world PlayerWorld = new World (screen: this, drawOrder: DisplayLayer.GameWorld, bounds: Bounds.FromRight (percent: 0.5f)); ChallengeWorld = new World (screen: this, drawOrder: DisplayLayer.GameWorld, bounds: Bounds.FromLeft (percent: 0.5f)); ChallengeWorld.Camera = PlayerWorld.Camera; PlayerWorld.OnRedraw += () => ChallengeWorld.Redraw = true; ChallengeWorld.OnRedraw += () => PlayerWorld.Redraw = true; // input playerKnotInput = new KnotInputHandler (screen: this, world: PlayerWorld); challengeKnotInput = new KnotInputHandler (screen: this, world: ChallengeWorld); // overlay overlay = new Overlay (screen: this, world: PlayerWorld); // pointer pointer = new MousePointer (screen: this); // model mouse handler playerModelMouseHandler = new ModelMouseHandler (screen: this, world: PlayerWorld); challengeModelMouseHandler = new ModelMouseHandler (screen: this, world: ChallengeWorld); // knot renderer PlayerKnotRenderer = new KnotRenderer (screen: this, position: Vector3.Zero); PlayerWorld.Add (PlayerKnotRenderer); ChallengeKnotRenderer = new KnotRenderer (screen: this, position: Vector3.Zero); ChallengeWorld.Add (ChallengeKnotRenderer); // debug displays debugBoundings = new DebugBoundings (screen: this, position: Vector3.Zero); // edge movements PlayerEdgeMovement = new EdgeMovement (screen: this, world: PlayerWorld, knotRenderer: PlayerKnotRenderer, position: Vector3.Zero); PlayerEdgeMovement.KnotMoved = OnKnotMoved; // assign the specified challenge Challenge = challenge; // assign the specified player knot PlayerKnot = challenge.Start.Clone () as Knot; // assign the specified target knot ChallengeKnotRenderer.RenderKnot (challenge.Target); // assign the specified start knot PlayerKnotRenderer.RenderKnot (PlayerKnot); SkyCube playerSkyCube = new SkyCube (screen: this, position: Vector3.Zero, distance: 10000); PlayerWorld.Add (playerSkyCube); SkyCube challengeSkyCube = new SkyCube (screen: this, position: Vector3.Zero, distance: 10000); ChallengeWorld.Add (challengeSkyCube); // Die Spielzeit-Anzeige playTimeDisplay = new TextItem (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, text: String.Empty); playTimeDisplay.Bounds.Position = new ScreenPoint (this, 0.800f, 0.01f); playTimeDisplay.Bounds.Size = new ScreenPoint (this, 0.15f, 0.04f); playTimeDisplay.BackgroundColorFunc = (s) => Design.WidgetBackground; playTimeDisplay.ForegroundColorFunc = (s) => Design.WidgetForeground; playTimeDisplay.AlignX = HorizontalAlignment.Center; playTimeBorder = new Border (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, widget: playTimeDisplay, lineWidth: 2, padding: 0); //Undo-Button undoButton = new Button (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, name: "Undo", onClick: (time) => OnUndo ()); undoButton.SetCoordinates (left: 0.55f, top: 0.900f, right: 0.65f, bottom: 0.95f); undoButtonBorder = new Border (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, widget: undoButton, lineWidth: 2, padding: 0); undoButton.AlignX = HorizontalAlignment.Center; undoButton.IsVisible = false; // Redo-Button redoButton = new Button ( screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, name: "Redo", onClick: (time) => OnRedo () ); redoButton.SetCoordinates (left: 0.70f, top: 0.900f, right: 0.80f, bottom: 0.95f); redoButtonBorder = new Border (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, widget: redoButton, lineWidth: 2, padding: 0); redoButton.AlignX = HorizontalAlignment.Center; redoButton.IsVisible = false; // die Linien lines = new Lines (screen: this, drawOrder: DisplayLayer.Dialog, lineWidth: 2); lines.AddPoints (0.500f, 0.000f, 0.500f, 1.000f); // Status state = ChallengeModeState.Start; }
/// <summary> /// Erzeugt eine neue Instanz eines CreativeModeScreen-Objekts und initialisiert diese mit einem Knot3Game-Objekt game, sowie einem Knoten knot. /// </summary> public CreativeModeScreen(GameCore game, Knot knot) : base(game) { // die Spielwelt world = new World (screen: this, drawOrder: DisplayLayer.GameWorld, bounds: Bounds); // der Input-Handler knotInput = new KnotInputHandler (screen: this, world: world); // das Overlay zum Debuggen overlay = new Overlay (screen: this, world: world); // der Mauszeiger pointer = new MousePointer (screen: this); // der Maus-Handler für die 3D-Modelle modelMouseHandler = new ModelMouseHandler (screen: this, world: world); // der Knoten-Renderer knotRenderer = new KnotRenderer (screen: this, position: Vector3.Zero); world.Add (knotRenderer); // visualisiert die BoundingSpheres debugBoundings = new DebugBoundings (screen: this, position: Vector3.Zero); world.Add (debugBoundings); // der Input-Handler zur Kanten-Verschiebung edgeMovement = new EdgeMovement (screen: this, world: world, knotRenderer : knotRenderer, position: Vector3.Zero); edgeMovement.KnotMoved = OnKnotMoved; // der Input-Handler zur Kanten-Einfärbung edgeColoring = new EdgeColoring (screen: this); // Flächen zwischen Kanten edgeRectangles = new EdgeRectangles (screen: this); // assign the specified knot Knot = knot; // Hintergrund Sky skyCube = new Sky (screen: this, position: Vector3.Zero); world.Add (skyCube); // Sonne Sun sun = new Sun (screen: this); world.Add (sun); // Undo-Button undoButton = new Button ( screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, name: "Undo", onClick: (time) => OnUndo () ); undoButton.SetCoordinates (left: 0.05f, top: 0.900f, right: 0.15f, bottom: 0.95f); undoButton.AlignX = HorizontalAlignment.Center; undoButton.IsVisible = false; undoButtonBorder = new Border (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, widget: undoButton, lineWidth: 2, padding: 0); // Redo-Button redoButton = new Button ( screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, name: "Redo", onClick: (time) => OnRedo () ); redoButton.SetCoordinates (left: 0.20f, top: 0.900f, right: 0.30f, bottom: 0.95f); redoButton.AlignX = HorizontalAlignment.Center; redoButton.IsVisible = false; redoButtonBorder = new Border (screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, widget: redoButton, lineWidth: 2, padding: 0); invisible = new Button ( screen: this, drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem, name: "menu", onClick: (time) => { // erstelle einen neuen Pausedialog knotInput.IsEnabled = false; Dialog pauseDialog = new CreativePauseDialog (screen: this, drawOrder: DisplayLayer.Dialog, knot: Knot); // füge ihn in die Spielkomponentenliste hinzu pauseDialog.Close += (t) => knotInput.IsEnabled = true; AddGameComponents (time, pauseDialog); } ); invisible.SetCoordinates (left: 1.00f, top: 1.00f, right: 1.10f, bottom: 1.10f); invisible.IsVisible = true; invisible.AddKey (Keys.Escape); }