Drivin’ My Car – μέρος 5ο

Τελικά δεν μπορώ να αποφασίσω εάν είναι καλύτερα να κάνεις αλλαγές σε υπάρχοντα κώδικα ή να τον ξαναγράφεις από την αρχή. Το να ανακαλύπτεις τον τροχό κάθε φορά που φτιάχνεις κάτι σίγουρα δεν είναι η ενδεδειγμένη λύση όμως το να αλλάζεις την λειτουργικότητα μιας ομάδας κλάσεων δεν είναι και τόσο απλό! Στην συγκεκριμένη περίπτωση σκέφτηκα να κάνω μόνο τις απαραίτητες αλλαγές γιατί μου άρεσε η υλοποίηση της Microsoft με τα εφέ μετάβασης. Όπως είχα γράψει στο προηγούμενο δεν μου άρεσε ο τρόπος υλοποίησης των ελέγχων χειρισμού του χρήστη. Αρχικά δεν υπήρχε υποστήριξη για mouse και είχε επιπλέον πολλούς χρήστες που στο Drivin’ My Car δεν χρειάζεται. Έτσι λοιπόν αφαιρέθηκε από το παιχνίδι και την θέση της πήρε η κλάση UserInputEngine τις οποίας ο κώδικας φαίνεται στην συνέχεια.

#region File Description
//-----------------------------------------------------------------------------
// UserInputEngine.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion

#region Using Statements
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
#endregion

namespace DrivinMyCar
{
    public enum MouseButton
    {
        Left, Middle, Right, X1, X2
    }
    public class UserInputEngine
    {
        #region Fields
        public KeyboardState CurrentKeyboardState;
        public GamePadState CurrentGamePadState;
        public MouseState CurrentMouseState;

        public KeyboardState LastKeyboardState;
        public GamePadState LastGamePadState;
        public MouseState LastMouseState;

        public bool GamePadWasConnected;

        #endregion

        #region Initialization

        public UserInputEngine()
        {
            CurrentKeyboardState = Keyboard.GetState();
            CurrentGamePadState = GamePad.GetState(PlayerIndex.One);
            CurrentMouseState = Mouse.GetState();

            LastKeyboardState = Keyboard.GetState();
            LastGamePadState = GamePad.GetState(PlayerIndex.One);
            LastMouseState = Mouse.GetState();
            GamePadWasConnected = GamePad.GetCapabilities(PlayerIndex.One).IsConnected;
        }

        #endregion

        #region Public Methods

        public void Update()
        {
            LastKeyboardState = CurrentKeyboardState;
            LastGamePadState = CurrentGamePadState;
            LastMouseState = CurrentMouseState;

            CurrentKeyboardState = Keyboard.GetState();
            CurrentGamePadState = GamePad.GetState(PlayerIndex.One);
            CurrentMouseState = Mouse.GetState();

            // Keep track of whether a gamepad has ever been connected, so we can detect if it is unplugged.
            if (CurrentGamePadState.IsConnected)
            {
                GamePadWasConnected = true;
            }
        }

        public bool IsPressed(Keys key)
        {
            return (CurrentKeyboardState.IsKeyDown(key) && LastKeyboardState.IsKeyUp(key));
        }

        public bool IsPressed(Buttons button)
        {
            return (CurrentGamePadState.IsButtonDown(button) &&
                   LastGamePadState.IsButtonUp(button));
        }
        public bool IsPressed(MouseButton button)
        {
            bool ret = false;
            switch (button)
            {
                case MouseButton.Left:
                    ret = (LastMouseState.LeftButton == ButtonState.Pressed && CurrentMouseState.LeftButton == ButtonState.Released);
                    break;
                case MouseButton.Right:
                    ret = (LastMouseState.RightButton == ButtonState.Pressed && CurrentMouseState.RightButton == ButtonState.Released);
                    break;
                case MouseButton.Middle:
                    ret = (LastMouseState.MiddleButton == ButtonState.Pressed && CurrentMouseState.MiddleButton == ButtonState.Released);
                    break;
                case MouseButton.X1:
                    ret = (LastMouseState.XButton1 == ButtonState.Pressed && CurrentMouseState.XButton1 == ButtonState.Released);
                    break;
                case MouseButton.X2:
                    ret = (LastMouseState.XButton2 == ButtonState.Pressed && CurrentMouseState.XButton2 == ButtonState.Released);
                    break;
            }
            return ret;
        }
        #endregion
    }
}
This entry was posted in Ανάπτυξη βιντεοπαιχνιδιών. Bookmark the permalink.

Comments are closed.