Ejemplo n.º 1
0
        public static PlayerComponent CreateAndAdd(AnglerGame game, Player player)
        {
            PlayerComponent newPlayer = new PlayerComponent(game, player);

            game.Components.Add(newPlayer);
            return(newPlayer);
        }
Ejemplo n.º 2
0
        protected override void LoadContent()
        {
            // Load textures, map and sounds
            Tileset ts = new Tileset();

            try
            {
                ts.LoadFromStream(typeof(Map).Assembly.GetManifestResourceStream("GameClassLibrary.game.tileset"));

                FXCollection.Textures = new List <Texture2D>();
                for (int i = 0; i < ts.Images.Images.Count; i++)
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        ts.Images.Images[i].Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                        FXCollection.Textures.Add(Texture2D.FromStream(GraphicsDevice, ms));
                    }
                }

                // Load sounds
                FXCollection.Songs        = new List <LoopedSoundPlayer>();
                FXCollection.SoundEffects = new List <SoundEffectInstance>();
                FXCollection.Songs[Songs.PreGame = FXCollection.Load <SoundEffect>("Audio\\Music\\titleSong")].Overlap       = new TimeSpan(0, 0, 0, 0, 1500);
                FXCollection.Songs[Songs.InGame = FXCollection.Load <SoundEffect>("Audio\\Music\\inGameBackground")].Overlap = new TimeSpan(0, 0, 0, 0, 2500);
                SoundEffects.Select  = FXCollection.Load <SoundEffectInstance>("Audio\\SoundEffects\\pop");
                SoundEffects.Collect = FXCollection.Load <SoundEffectInstance>("Audio\\SoundEffects\\boop");
                SoundEffects.Blip    = FXCollection.Load <SoundEffectInstance>("Audio\\SoundEffects\\blip");
            }
            catch
            {
                throw new Exception("There was a problem loading a resource!");
            }

            // Create audio zones for enemies
            for (int i = 1; i < World.Players.Count; i++)
            {
                Player e = World.Players[i];

                if (e is Enemy)
                {
                    // Temporary - just use the color red for enemies, rather than an actual texture
                    Texture2D texture = new Texture2D(GraphicsDevice, 1, 1);
                    texture.SetData(new[] { Color.Red });
                    FXCollection.Textures.Add(texture);

                    World.Players[i].CurrentGraphicIndex = FXCollection.Textures.Count - 1;
                    audioManager.AddZone(new EnemyAudioZone(e as Enemy, FXCollection.Load <SoundEffectInstance>("Audio\\Music\\tone"), 200));
                }
            }

            World.LightsFX = new LightsFX(
                Content.Load <Effect>("Effects\\resolveShadowsEffect"),
                Content.Load <Effect>("Effects\\reductionEffect"),
                Content.Load <Effect>("Effects\\2xMultiBlend"));

            // Eventually, the lower four lines graphics will be pulled from the tileset
            World.MainPlayer.BackGraphicIndex  = FXCollection.Load <Texture2D>("back_sprite");
            World.MainPlayer.FrontGraphicIndex = FXCollection.Load <Texture2D>("front_sprite");
            World.MainPlayer.LeftGraphicIndex  = FXCollection.Load <Texture2D>("left_sprite");
            World.MainPlayer.RightGraphicIndex = FXCollection.Load <Texture2D>("right_sprite");

            World.MainPlayer.CurrentGraphicIndex = World.MainPlayer.FrontGraphicIndex;

            KeyboardDispatcher = new KeyboardDispatcher(Window);

            inGamePanel      = new XNAComponentPanel(this);
            loginPanel       = new XNAComponentPanel(this);
            registerPanel    = new XNAComponentPanel(this);
            preGameMenuPanel = new XNAComponentPanel(this);
            howToPlayPanel   = new XNAComponentPanel(this);
            backgroundPanel  = new XNAComponentPanel(this);

            int screenWidth  = GraphicsDevice.Viewport.Width;
            int screenHeight = GraphicsDevice.Viewport.Height;

            Texture2D[] textboxTextures = new Texture2D[4]
            {
                Content.Load <Texture2D>("textboxBack"),
                Content.Load <Texture2D>("textboxLeft"),
                Content.Load <Texture2D>("textboxRight"),
                Content.Load <Texture2D>("textboxCaret")
            };

            // Background image with ripple effect
            background = new Background(this, Content.Load <Texture2D>("titleBackground"));
            RippleEffect rippleEffect = new RippleEffect(backgroundPanel);

            loginPanel.Components.Add(rippleEffect);
            registerPanel.Components.Add(rippleEffect);
            preGameMenuPanel.Components.Add(rippleEffect);
            howToPlayPanel.Components.Add(rippleEffect);

            PreGameMenu = new XNAMenu(this, new Rectangle(screenWidth / 2 - 150, screenHeight / 2 - 100, 300, 200))
            {
                ForeColor      = SD.Color.FromArgb(25, 50, 150),
                HighlightColor = SD.Color.FromArgb(4, 4, 99),
                Font           = new SD.Font("Calibri", 36),
                RenderingHint  = SD.Text.TextRenderingHint.SingleBitPerPixelGridFit,
                ItemHeight     = 60
            };
            PreGameMenu.SelectionChanged += (o, e) => { FXCollection.SoundEffects[SoundEffects.Blip].Play(); };
            PreGameMenu.AddMenuItem("Log In", (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();
                World.GameState = GameState.Login;
            });
            PreGameMenu.AddMenuItem("Create Account", (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();
                World.GameState = GameState.Register;
            });
            PreGameMenu.AddMenuItem("How to Play", (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();

                World.GameState = GameState.HowToPlay;
            });
            PreGameMenu.AddMenuItem("Quit Game", (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();
                System.Threading.Tasks.Task.Factory.StartNew(() =>
                {
                    System.Threading.Thread.Sleep(300);                     // Make sure the select sound plays
                    Exit();
                });
            });

            XNAPictureBox titlePicture = new XNAPictureBox(this, new Rectangle(100, screenHeight / 2 - 50, screenWidth - 200, 200))
            {
                StretchMode = StretchMode.CenterInFrame,
                Texture     = Content.Load <Texture2D>("logo")
            };

            loginPanel.Components.Add(titlePicture);
            registerPanel.Components.Add(titlePicture);
            preGameMenuPanel.Components.Add(titlePicture);
            howToPlayPanel.Components.Add(titlePicture);

            //temporary action objects that are used to construct the member TextBoxEvent variables
            Action <object, EventArgs> loginEvent;
            Action <object, EventArgs> registerEvent;

            // Login event
            loginEvent = (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();

                World.GameState = GameState.LoggingIn;

                World.MainPlayer.SendToServer(ServerAction.ClientLogin,
                                              new LoginData(usernameTextbox.Text, passwordTextbox.Text));
            };

            loginTBEvent = new TextBoxEvent(loginEvent);

            // Register event
            registerEvent = (o, e) =>
            {
                if (passwordTextbox.Text == confirmPasswordTextbox.Text)
                {
                    FXCollection.SoundEffects[SoundEffects.Select].Play();

                    World.GameState = GameState.Registering;

                    World.MainPlayer.SendToServer(ServerAction.ClientCreateAcc,
                                                  new LoginData(usernameTextbox.Text, passwordTextbox.Text));
                }
                else
                {
                    FXCollection.SoundEffects[SoundEffects.Select].Play();

                    XNADialog errDlg = new XNADialog(this, "Passwords do not match.", "Error creating account!");
                    errDlg.CloseAction = (param) => { FXCollection.SoundEffects[SoundEffects.Select].Play(); };
                }
            };

            XNALabel howToPlayText = new XNALabel(this, new Rectangle(screenWidth / 4, screenHeight / 2 - 80, screenWidth / 2, 300));

            howToPlayText.Text = Resources.HowToPlayText;
            howToPlayText.Font = new SD.Font("Calibri", 16);
            howToPlayPanel.Components.Add(howToPlayText);

            XNAHyperLink backHyperlink = new XNAHyperLink(
                this,
                new Rectangle(3 * screenWidth / 4 - 50, screenHeight / 2 + 75, 50, 30),
                "Arial", 12.0f,
                SD.FontStyle.Bold,
                SD.Text.TextRenderingHint.SingleBitPerPixelGridFit);

            backHyperlink.DrawOrder      = (int)RenderOrder.UILayer;
            backHyperlink.ForeColor      = SD.Color.FromArgb(139, 95, 71);
            backHyperlink.HighlightColor = SD.Color.FromArgb(150, 139, 95, 71);
            backHyperlink.Text           = "Back";
            backHyperlink.TextAlign      = System.Drawing.ContentAlignment.MiddleRight;
            backHyperlink.OnClick       += (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();
                World.GameState = GameState.PregameMenu;
            };
            howToPlayPanel.Components.Add(backHyperlink);

            registerTBEvent = new TextBoxEvent(registerEvent);

            subscribeToUsernameBox = (object sender, EventArgs e) => { usernameTextbox.Selected = true; KeyboardDispatcher.Subscriber = usernameTextbox; };
            subscribeToPasswordBox = (object sender, EventArgs e) => { passwordTextbox.Selected = true; KeyboardDispatcher.Subscriber = passwordTextbox; };
            subscribeToConfirmBox  = (object sender, EventArgs e) => { confirmPasswordTextbox.Selected = true; KeyboardDispatcher.Subscriber = confirmPasswordTextbox; };

            // Update error message event
            World.MainPlayer.UpdateErrorMessage += (o, e) =>
            {
                //close any open dialog
                XNADialog errMsg = new XNADialog(this, e.Message, e.Caption);
                if (!(o as ConnectedPlayer).Connected)
                {
                    errMsg.CloseAction += (bool success) =>
                    {
                        FXCollection.SoundEffects[SoundEffects.Select].Play();
                        this.Exit();
                    }
                }
                ;
            };

            World.MainPlayer.BacteriaCollect += (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Collect].Play();

                overlayRenderer.RenderBacteriaCount();
            };

            // Username field
            usernameTextbox             = new XNATextBox(this, new Rectangle(screenWidth / 2 - 100, screenHeight / 2 - 70, 200, 30), textboxTextures, "Arial", 12.0f);
            usernameTextbox.DrawOrder   = (int)RenderOrder.UILayer;
            usernameTextbox.MaxChars    = 30;
            usernameTextbox.DefaultText = "Username";
            usernameTextbox.Clicked    += subscribeToUsernameBox;
            subscribeToUsernameBox(usernameTextbox);
            usernameTextbox.OnTabPressed += subscribeToPasswordBox;
            loginPanel.Components.Add(usernameTextbox);
            registerPanel.Components.Add(usernameTextbox);

            // Password field
            passwordTextbox             = new XNATextBox(this, new Rectangle(screenWidth / 2 - 100, screenHeight / 2 - 20, 200, 30), textboxTextures, "Arial", 12.0f);
            passwordTextbox.DrawOrder   = (int)RenderOrder.UILayer;
            passwordTextbox.MaxChars    = 30;
            passwordTextbox.DefaultText = "Password";
            passwordTextbox.PasswordBox = true;
            passwordTextbox.Clicked    += subscribeToPasswordBox;
            loginPanel.Components.Add(passwordTextbox);
            registerPanel.Components.Add(passwordTextbox);

            // Confirm password field
            confirmPasswordTextbox                 = new XNATextBox(this, new Rectangle(screenWidth / 2 - 100, screenHeight / 2 + 30, 200, 30), textboxTextures, "Arial", 12.0f);
            confirmPasswordTextbox.DrawOrder       = (int)RenderOrder.UILayer;
            confirmPasswordTextbox.MaxChars        = 30;
            confirmPasswordTextbox.DefaultText     = "Confirm Password";
            confirmPasswordTextbox.PasswordBox     = true;
            confirmPasswordTextbox.Clicked        += subscribeToConfirmBox;
            confirmPasswordTextbox.OnTabPressed   += subscribeToUsernameBox;
            confirmPasswordTextbox.OnEnterPressed += new TextBoxEvent(registerEvent);
            registerPanel.Components.Add(confirmPasswordTextbox);

            Texture2D[] loginButtonTextures = new Texture2D[2]
            {
                Content.Load <Texture2D>("button"),
                Content.Load <Texture2D>("buttonHover")
            };

            XNAButton loginButton = new XNAButton(this, new Vector2(screenWidth / 2 + 20, screenHeight / 2 + 30), "Login");

            loginButton.DrawOrder = (int)RenderOrder.UILayer;
            loginButton.OnClick  += new XNAButton.ButtonClickEvent(loginEvent);
            loginPanel.Components.Add(loginButton);

            XNAButton registerButton = new XNAButton(this, new Vector2(screenWidth / 2 + 20, screenHeight / 2 + 80), "Register");

            registerButton.DrawOrder = (int)RenderOrder.UILayer;
            registerButton.OnClick  += new XNAButton.ButtonClickEvent(registerEvent);
            registerPanel.Components.Add(registerButton);

            cancelHyperlink = new XNAHyperLink(
                this,
                new Rectangle(screenWidth / 2 - 95, screenHeight / 2 + 80, 100, 30),
                "Arial", 12.0f,
                SD.FontStyle.Bold,
                SD.Text.TextRenderingHint.SingleBitPerPixelGridFit);
            cancelHyperlink.DrawOrder      = (int)RenderOrder.UILayer;
            cancelHyperlink.ForeColor      = SD.Color.FromArgb(139, 95, 71);
            cancelHyperlink.HighlightColor = SD.Color.FromArgb(150, 139, 95, 71);
            cancelHyperlink.Text           = "Cancel";
            cancelHyperlink.TextAlign      = System.Drawing.ContentAlignment.MiddleLeft;
            cancelHyperlink.OnClick       += (o, e) =>
            {
                FXCollection.SoundEffects[SoundEffects.Select].Play();
                World.GameState = GameState.PregameMenu;
            };
            registerPanel.Components.Add(cancelHyperlink);
            loginPanel.Components.Add(cancelHyperlink);

            // Map renderer
            MapRenderer mapRenderer = new MapRenderer(this, World.CurrentMap);

            inGamePanel.Components.Add(mapRenderer);

            // NPC rendering engine
            GraphicEngine npcEngine = new GraphicEngine(this, RenderOrder.NPCLayer);

            GraphicsEngineComponent.CreateAndAdd <MinorPlayerRenderer>(npcEngine);
            inGamePanel.Components.Add(npcEngine);

            // Overlay rendering engine
            GraphicEngine overlayEngine = new GraphicEngine(this, RenderOrder.OverlayLayer);

            overlayRenderer = GraphicsEngineComponent.CreateAndAdd <OverlayRenderer>(overlayEngine);
            inGamePanel.Components.Add(overlayEngine);

            // Audio manager
            inGamePanel.Components.Add(audioManager = new AudioManager(this));

            // Input handler
            InputHandler = new InputHandler(this);
            inGamePanel.Components.Add(InputHandler);
            InputHandler.ChatBoxClosing += (o, e) =>
            {
                if (ShowChatPrompt && chatRenderer.MessageBox.Text != "")
                {
                    World.MainPlayer.SendToServer(ServerAction.ClientSay, new TalkData(chatRenderer.MessageBox.Text));
                    chatRenderer.MessageBox.Text = "";
                }
            };
            InputHandler.RemoveTilde += () =>
            {
                chatRenderer.MessageBox.Text = chatRenderer.MessageBox.Text.TrimEnd('`');
            };

            // Main Player
            inGamePanel.Components.Add(MainPlayer = new PlayerComponent(this, World.MainPlayer));

            // Pause menu
            GraphicEngine pauseMenuEngine = new GraphicEngine(this, RenderOrder.PauseMenuLayer);

            GraphicsEngineComponent.CreateAndAdd <PauseMenuRenderer>(pauseMenuEngine);
            inGamePanel.Components.Add(pauseMenuEngine);

            // Chat
            GraphicEngine chatEngine = new GraphicEngine(this, RenderOrder.ChatLayer);

            chatRenderer = GraphicsEngineComponent.CreateAndAdd <ChatRenderer>(chatEngine);
            inGamePanel.Components.Add(chatEngine);

            World.GameState = GameState.PregameMenu;
        }