INDEX

INTRO::

 -Applied Design Brief and Roles
– Magna Carta
– First visit to Salisbury Cathedral
– Workflow in environments – AGILE AND SCRUM
– Initial ideas Mood boards
– Initial idea: Matt
– Initial idea: Inayat
– Initial idea: Claudia
– Initial idea: Jaymi

ITERATION I::

– Iteration 1: First ideas 
– Iteration 1: Feedback on first idea 

ITERATION II::

– Iteration 2: Improved idea 
– Iteration 2: Feedback on final idea 

ITERATION III::

– Iteration 3: Analysis using MosCoW
– Iteration 3: Ways to avoid users rushing through the cathedral

ITERATION IV::

– Iteration 4: Second trip to Salisbury. Looking for shapes in the space 
– Iteration 4: FLOWCHART 
– Iteration 4: PSEUDOCODE
– Iteration 4: NARRATIVE 

– Iteration 4: QUESTIONS AND ZONES

– Iteration 4: DESIGN MOCK-UPS

ITERATION V

– Iteration 5: Third visit to Salisbury Cathedral

– Iteration 5: Making the shapes for the answers

– Iteration 5: Code tutorials

– Iteration 5: Prototype without implementing design

ITERATION VI

– Iteration 6: Implementing Design

ITERATION VII:

– Iteration 7: The design and changes

– Iteration 7: Changes in the narrative

– Iteration 7: Implementing those changes

ITERATION VIII:

-Iteration 8: Correcting constrains

– Problems we have had to solve

– Particularities of the app

– Video of app working

INDEX

PARTICULARITIES OF THE APP

Since all questions are placed in a single View controller, we have had to make some tricks for each zone to display the correct questions. We have equaled each Zone to a string, which will trigger a concrete function depending on the zone picked. This function displays different questions depending on the selected zone.

    @IBAction func zoneOne(sender: AnyObject) {
        zonePicked = "zoneOne"
    }

    @IBAction func zoneTwo(sender: AnyObject) {
        zonePicked = "zoneTwo"
    }
    
    @IBAction func zoneThree(sender: AnyObject) {
        zonePicked = "zoneThree"
    }
    
    @IBAction func zoneFour(sender: AnyObject) {
        zonePicked = "zoneFour"
    }
    

  
    func setupZoneOne() {
        Question1.text = "What shape is the entrance to the cloisters?"
        Question2.text = "What is the arrangement of shapes in the arch of the cloisters?"
        Question3.text = "What are shapes cut out in the armoured glove?"
    }
    
    
    func setupZoneTwo() {
        Question1.text = "What is the shape on the points of the Cathedral roof during construction?"
        Question2.text = "What is the shape of the font?"
        Question3.text = "What is the shape of the freemason symbol given to Elias De Derham?"
    }
    
    
    
    func setupZoneThree() {
        Question1.text = "What is the shape of the shield painted on the ceiling?"
        Question2.text = "What shape is the arrangement of the Prisoners of Conscience Window?"
        Question3.text = "What shape is the Shrine Tomb of St Osmund?"
    }
    
    
    func setupZoneFour() {
        Question1.text = "What is the shape of the Chapter House?"
        Question2.text = "What is the shape of the fleur-de-lis found on all the cushions?"
        Question3.text = "What is the shape found on the pillow for Nicholas?"
    }

A different Popup View depending on the zone picked:

     if zonePicked == "zoneOne"{
            PopUpLabel.text = "GROUP ONE TURN: Let’s test your resourcefulness and patience by seeing how many answers you remember."
            
            
            self.chooseQuestion1()
        }
        else if zonePicked == "zoneTwo"{
            PopUpLabel.text = "GROUP ONE TURN: Let’s see how much publicity you will gain from answering questions correctly"

            self.chooseQuestion2()
        }
        else if zonePicked == "zoneThree"{
            PopUpLabel.text = "GROUP ONE TURN: Let’s see how well you know your citizens needs,"

            self.chooseQuestion3()
        }
        else {
            PopUpLabel.text = "GROUP ONE TURN: Let’s see how many more votes you have secured."

            self.chooseQuestion4()
        }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
        if let destinationVC = segue.destinationViewController as? TestViewController {
            destinationVC.zonePicked = zonePicked
            
        }
        
        performSegueWithIdentifier(zonePicked, sender: self)
    }



With the arrays we pass the complete array from one controller to the other with the values that it comprises.


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
        if let destinationVC = segue.destinationViewController as? TestViewController {
            destinationVC.group1 = group1
            destinationVC.group2 = group2
        }
        
        performSegueWithIdentifier(zonePicked, sender: self)
    }

We have a narrative that guides the user through the game, and that relates the app to Magna Carta. To introduce this narrative in the app we have inserted pop up windows that come every now and then and that keep on explaining the narrative of the app and guiding the user through the game.

To make the pop up windows we have inserted a View that has a boolean property of .hidden . It equals to false when a view comes into the screen, and it changes to true once a button placed in this View is pressed.


        PopUp.hidden = false



  @IBAction func PopUpButton(sender: AnyObject) {
        PopUp.hidden = true
    }

The boolean property .hidden has also been added to the button “NEXT”. Doing so, the button Next only appears when the user has answered the question

        nextButton.hidden = true


 
    func updateViewForQuestionAnswered() {
        
        nextButton.hidden = false
        enableQuestionButtons(false)
    }

The buttons for the answers of the questions are images, this is why we had to code them differently from that of a normal button. The code is as follows:

  case 18:
            QuestionText.text = "What is the shape found on the pillow for Nicholas?"
            answer1.setBackgroundImage(UIImage(named: "zone4_Q3_2.png"), forState: .Normal)
            answer2.setBackgroundImage(UIImage(named: "zone4_Q3_3.png"), forState: .Normal)
            answer3.setBackgroundImage(UIImage(named: "zone4_Q3_1.png"), forState: .Normal)
            answer4.setBackgroundImage(UIImage(named: "zone4_Q3_4.png"), forState: .Normal)

PARTICULARITIES OF THE APP

PROBLEMS WE HAVE HAD TO SOLVE

– Placing all questions in one view controller with the switch statement, in stead of different view controllers

There are many different ways of doing each step that an app has to make. In this case, we could have placed a view controller for each question, typing the same code now and again. However, we decided to make a Switch Statement and place all the code in the same view controller. It is harder to code, but it looks tidier and simpler code-wise. Moreover, it makes things easier if the style is changed, because things only has to be changed once in one view controller.

Screenshot 2015-05-20 01.30.52

PICTURE SWITCH STATEMENT

 func chooseQuestion1 (){

        switch questionNumber{
        case 0:
            QuestionText.text = "What shape is the entrance to the cloisters?"
            answer1.setBackgroundImage(UIImage(named: "zone1_Q1_3.png"), forState: .Normal)
            answer2.setBackgroundImage(UIImage(named: "zone1_Q1_2.png"), forState: .Normal)
            answer3.setBackgroundImage(UIImage(named: "zone1_Q1_1.png"), forState: .Normal)
            answer4.setBackgroundImage(UIImage(named: "zone1_Q1_4.png"), forState: .Normal)

        case 1:
            QuestionText.text = "What is the arrangement of shapes in the arch of the cloisters?"
            answer1.setBackgroundImage(UIImage(named: "zone1_Q2_2.png"), forState: .Normal)
            answer2.setBackgroundImage(UIImage(named: "zone1_Q2_1.png"), forState: .Normal)
            answer3.setBackgroundImage(UIImage(named: "zone1_Q2_3.png"), forState: .Normal)
            answer4.setBackgroundImage(UIImage(named: "zone1_Q2_4.png"), forState: .Normal)

        case 2:
            QuestionText.text = "What are shapes cut out in the armoured glove?"
            answer1.setBackgroundImage(UIImage(named: "zone1_Q3_4.png"), forState: .Normal)
            answer2.setBackgroundImage(UIImage(named: "zone1_Q3_2.png"), forState: .Normal)
            answer3.setBackgroundImage(UIImage(named: "zone1_Q3_1.png"), forState: .Normal)
            answer4.setBackgroundImage(UIImage(named: "zone1_Q3_3.png"), forState: .Normal)

        default:
            break

        }

        println("You're on question \(questionNumber)")
        questionNumber++

        if questionNumber == 4 {

          println("Go to the next screen")

            performSegueWithIdentifier("group1ToGroup2", sender: self)
        }
    }

– Making two arrays, one for each group, and then compare those to know what group is the winner 

We had to solve a problem which was how to make the game for two players, and how to make one of those the winner. We decided that a good way of doing it would be making one player answer the questions first, and then the other. Then, this results would be stored in two different arrays. One would belong to the first player, and the other to the second.

Screenshot 2015-05-20 01.55.24

 var group1: [Int]!
    var group2: [Int]!

 

After, to decide who is the winner, we have made a function that compares both arrays and that select the greater as the winner


        var G1 = group1.reduce(0,combine: +)
        var G2 = group2.reduce(0,combine: +)

        if G1 >= G2 {
            ResultLabel.text = "Well done Group 1!You have won the position of political party in power."

        } else {
            ResultLabel.text = "Well done Group 2! You have won the position of political party in power."

        }
    }

– We have had to make each button score a different punctuation, instead of being equal to RIGHT or WRONG. It has allowed us to be able to compare both arrays and see which one is the greater to decide the winner

Screenshot 2015-05-20 02.02.22

The app is a multi choice quiz. It is comprised of several questions with four answers each. At the beginning, we had the idea of categorise three questions as WRONG and one of them as a RIGHT. The only problem in doing it was the difficulty to assign a winner through the code. This is why, we decided to make each question equal to an integer. Since our quiz is based on shapes, the right shape would get the greatest number, and then the shape more similar to the correct one will get a smaller number, and so on and so forth.

In a nutshell, there are four questions, and each one of those has a different punctuation. When the players answer the questions, they will collect points for each one depending on how close they are to the correct answer. If they are far from the right one, they will get 1 point, but if their answer is correct, they will get 4 points.


  @IBAction func answer4pressed(sender: AnyObject) {

        updateViewForQuestionAnswered()

        if questionNumber == 0 {
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"
        }else if questionNumber == 1{
            group1.append(1)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber == 2 {
            group1.append(2)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber2 == 5{
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber2 == 6 {
            group1.append(4)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber2 == 7{
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber3 == 11 {
            group1.append(2)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber3 == 12{
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber3 == 13 {
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber4 == 16{
            group1.append(3)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber4 == 17 {
            group1.append(1)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"

        }else if questionNumber4 == 18{
            group1.append(2)
            result.text="GROUP 1 HAS \(group1.reduce(0,combine: +)) POINTS"
        }
    }

– Disable the buttons after clicking them 

Screenshot 2015-05-20 02.03.33

Another problem we came across, was that once a player was answering a question, they could keep on pressing the answer buttons, and summing up points to their score. The buttons had to be disabled after one answer had been selected.


    func updateViewForQuestionAnswered() {

        nextButton.hidden = false
        enableQuestionButtons(false)
    }

    func enableQuestionButtons(enable: Bool) {
        answer1.enabled = enable
        answer2.enabled = enable
        answer3.enabled = enable
        answer4.enabled = enable
    }

– Zones PopUp

Screenshot 2015-05-20 02.05.23

We had the problem that the pop up view was appearing every time that users came back to the Zone View Controller, after they had finished one round of questions.

Since this message only has to appear once, the solution has been to create a new view controller that would make the functionality and look like a pop up.

PROBLEMS WE HAVE HAD TO SOLVE

Iteration 7: Changes in the narrative

After sending off our draft of the narrative to Steph from RedBalloon, we received some feedback. Steph stated that idea of making it about democracy works well, however she wondered if there could be some direct mention to Magna Carta somehow – just a note in the text somewhere at the intro stage that our democracy could be said to be originated in Magna Carta.

After reading Stephs feedback it was clear that we needed to make clear how the democracy idea related to Magna Carta, in order to do this we made some simple changes to the narrative.

1RST SCREEN:: EXPLANATION OF GAME WITH AN INTEGRATED NARRATIVE

Welcome to the House of Commons! The fight to gain power starts here.

As we are in a democratic country due to the establishment of the Magna Carta 800 years ago, it is your responsibility as a political party to win the votes of the population and to beat the opposing party. Winner will gain power and secure the first position in the parliament.

Iteration 7: Changes in the narrative