Browse Source

Quick and dirty customisation of keyboard controller for lists

master
Devin 4 years ago
parent
commit
0338afe3cf
  1. 85
      Assets/Scripts/Shop/Controller/ListKeyboardController.cs
  2. 12
      Assets/Scripts/Shop/Controller/ListKeyboardController.cs.meta
  3. 18
      Assets/Scripts/Shop/View/ShopView.cs
  4. 16
      Assets/Scripts/Shop/View/ShopViewGrid.cs
  5. 16
      Assets/Scripts/Shop/View/ShopViewList.cs

85
Assets/Scripts/Shop/Controller/ListKeyboardController.cs

@ -0,0 +1,85 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// This class provides a keyboard controller for a ShopModel in a list view, it defines how to handle keyboard input in HandleInput()
/// </summary>
public class ListKeyboardController : ShopController
{
private ViewConfig viewConfig;//To move the focus up and down, we need to know how many columns the grid view has, in the current setup,
private int columnCount; //this information can be found in a ViewConfig scriptable object, which serves as a configuration file for
//views.
private int currentItemIndex = 0;//The current item index is changed whenever the focus is moved with keyboard keys
//------------------------------------------------------------------------------------------------------------------------
// Initialize()
//------------------------------------------------------------------------------------------------------------------------
//Override Initialize to set up additional information needed by this concrete controller: number of columns in the view
public override ShopController Initialize(ShopModel pShopModel)
{
base.Initialize(pShopModel);//Call base.Initialize to set up the model
currentItemIndex = model.GetSelectedItemIndex();//Synchronize the current item index with the model
viewConfig = Resources.Load<ViewConfig>("ViewConfig");//Load the ViewConfig scriptable object from the Resources folder
Debug.Assert(viewConfig != null);
columnCount = viewConfig.gridViewColumnCount;//Try to set up the column count, fails silently
return this;
}
//------------------------------------------------------------------------------------------------------------------------
// HandleInput()
//------------------------------------------------------------------------------------------------------------------------
//Currently hardcoded to AWSD to move focus and K to confirm the selected item. No criterion for the grade, so since lists are assumed to have one colum, we just hardcode that
public override void HandleInput()
{
//Move the focus to the left if possible
if (Input.GetKeyDown(KeyCode.A))
{
currentItemIndex--;
if (currentItemIndex < 0)
{
currentItemIndex = 0;
}
}
//Move the focus to the right if possible
if (Input.GetKeyDown(KeyCode.D))
{
currentItemIndex++;
if (currentItemIndex >= this.Model.inventory.GetItemCount())
{
currentItemIndex = this.Model.inventory.GetItemCount() - 1;
}
}
//Move the focus up if possible
if (Input.GetKeyDown(KeyCode.W))
{
currentItemIndex--;
if (currentItemIndex < 0)
{
currentItemIndex = 0;
}
}
//Move the focus down if possible
if (Input.GetKeyDown(KeyCode.S))
{
currentItemIndex++;
if (currentItemIndex >= this.Model.inventory.GetItemCount())
{
currentItemIndex = this.Model.inventory.GetItemCount() - 1;
}
}
//Select the item
SelectItemByIndex(currentItemIndex);
//Confirm the selected item when K is pressed
if (Input.GetKeyDown(KeyCode.K))
{
ConfirmSelectedItem();
}
}
}

12
Assets/Scripts/Shop/Controller/ListKeyboardController.cs.meta

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 84679d97889a19f4286eeae8f2f4e66a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences:
- viewConfig: {fileID: 11400000, guid: 5d1182a6d5a724428b8167840f0dfa92, type: 2}
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

18
Assets/Scripts/Shop/View/ShopView.cs

@ -31,7 +31,7 @@ public abstract class ShopView : MonoBehaviour
protected ShopModel model; // Model in MVC pattern protected ShopModel model; // Model in MVC pattern
protected ShopModel other; // Other model in MVC pattern (our own inventory) protected ShopModel other; // Other model in MVC pattern (our own inventory)
private ShopController shopController; //Controller in MVC pattern protected ShopController shopController; //Controller in MVC pattern
private ItemType itemFilter = ItemType.All; // View can filter items, and this is the filter we want to use for that private ItemType itemFilter = ItemType.All; // View can filter items, and this is the filter we want to use for that
@ -149,24 +149,12 @@ public abstract class ShopView : MonoBehaviour
//------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------
// SwitchToKeyboardControl() // SwitchToKeyboardControl()
//------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------
private void SwitchToKeyboardControl() protected abstract void SwitchToKeyboardControl();
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<GridViewKeyboardController>().Initialize(model);//Create and add a keyboard controller
instructionText.text = "The current control mode is: Keyboard Control, WASD to select item, press K to buy. Press left mouse button to switch to Mouse Control.";
buyButton.gameObject.SetActive(false);//Hide the buy button because we only use keyboard
}
//------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------
// SwitchToMouseControl() // SwitchToMouseControl()
//------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------
private void SwitchToMouseControl() protected abstract void SwitchToMouseControl();
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<MouseController>().Initialize(model);//Create and add a mouse controller
instructionText.text = "The current control mode is: Mouse Control, press 'K' to switch to Keyboard Control.";
buyButton.gameObject.SetActive(true);//Show the buy button for the mouse controler
}
// These three are from the observable interface, and it was decided to leave this stuff to the implementation for now. Keeping here for reference // These three are from the observable interface, and it was decided to leave this stuff to the implementation for now. Keeping here for reference
// public virtual void OnSelected(Item item) // public virtual void OnSelected(Item item)

16
Assets/Scripts/Shop/View/ShopViewGrid.cs

@ -68,6 +68,22 @@ public class ShopViewGrid : ShopView
} }
} }
protected override void SwitchToKeyboardControl()
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<GridViewKeyboardController>().Initialize(model);//Create and add a keyboard controller
instructionText.text = "The current control mode is: Keyboard Control, WASD to select item, press K to buy. Press left mouse button to switch to Mouse Control.";
buyButton.gameObject.SetActive(false);//Hide the buy button because we only use keyboard
}
protected override void SwitchToMouseControl()
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<MouseController>().Initialize(model);//Create and add a mouse controller
instructionText.text = "The current control mode is: Mouse Control, press 'K' to switch to Keyboard Control.";
buyButton.gameObject.SetActive(true);//Show the buy button for the mouse controler
}
private void OnValidate() private void OnValidate()
{ {
_gridLayoutGroup = (GridLayoutGroup) layoutGroup; _gridLayoutGroup = (GridLayoutGroup) layoutGroup;

16
Assets/Scripts/Shop/View/ShopViewList.cs

@ -77,6 +77,22 @@ public class ShopViewList : ShopView, IShopModelObserver<Item>
} }
} }
protected override void SwitchToKeyboardControl()
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<ListKeyboardController>().Initialize(model);//Create and add a keyboard controller
instructionText.text = "The current control mode is: Keyboard Control, WASD to select item, press K to buy. Press left mouse button to switch to Mouse Control.";
buyButton.gameObject.SetActive(false);//Hide the buy button because we only use keyboard
}
protected override void SwitchToMouseControl()
{
Destroy(shopController);//Remove the current controller component
shopController = gameObject.AddComponent<MouseController>().Initialize(model);//Create and add a mouse controller
instructionText.text = "The current control mode is: Mouse Control, press 'K' to switch to Keyboard Control.";
buyButton.gameObject.SetActive(true);//Show the buy button for the mouse controler
}
private void OnValidate() private void OnValidate()
{ {
_listLayoutGroup = (VerticalLayoutGroup) layoutGroup; _listLayoutGroup = (VerticalLayoutGroup) layoutGroup;

Loading…
Cancel
Save