Skapa en app för Ubuntu Touch [QML] - [Del 2]

Inledning:

Nåväl här har vi inlägget som följer första delenI den här kommer vi att fokusera på att hantera data (frågor), och vi börjar med den logiska delen av spelet, i nästa kommer vi att avsluta logiken och implementera tiden och de 3 alternativen.

Du hittar koden i mitt Launchpad-arkiv (Klicka här), där jag uppdaterar det när jag går.

Databas:

För databasen kommer vi att använda u1db, som är en databas som sparar data i formatet JSON.

Låt oss först se vilka data vi ska spara, vi har en fråga (förutom frågan i texten skulle det vara trevligt att ha en identifierare), med 1 möjliga svar, varav endast 4 kan vara, därför är dokumentet i JSON enstaka fråga bör vara:

{ "id": 1, "question": " det kommer att finnas dev.desdelinux.net ", "svar" : { r1: "ja", r2: "nej", r3: "vet inte", r4: "det här är ett falskt svar" }, "rätt": 3 }

Som vi ser har vi strukturerat i format JSON där vi har en identifierare, en sträng med frågan och r1, r2 som representerar svar 1 och svar 2, slutligen har vi vilket av svaren som är korrekt.

Låt oss se lite hur U1db fungerar, det första vi måste göra för att använda U1db är att importera modulen:

import U1db 1.0 as U1db

Vi förklarar databasen:

U1db.Database {
id: aDatabase
path: "aU1DbDatabase"
}

Databaserna sparas som aU1DbDatabase.u1db, nu skapar vi ett dokument:

U1db.Document {
id: aDocument
database: aDatabase
docId: 'helloworld'
create: true
defaults: { "hello": "Hello World!" }
}

Där vi kan se formatet {«hej»: «något»}, för att utföra frågor, antingen för att lägga till data, få data, radera dem etc. Vi har U1db.Query-elementet.

Vi kan hitta en handledning på utvecklingswebbplatsen för ubuntu.

Låt oss gå till vår applikation och skapa vår databas, som vi har sett definierar vi databasen:

U1db.Database {id: db frågor; sökväg: "frågordb.u1db"}

Okej, låt oss nu sätta några standardelement i databasdokumentets frågordb:

    U1db.Document { id: aDocument databas: questiondb docId: 'questions' create: true defaults: { "questions": [ {"question":"Det kommer att finnas dev.desdelinux.net ?", "r1":"ja", "r2":"nej", "r3":"näsa", "r4":"falskt svar", "rätt": "3" }, {"fråga ":"Vem är Hagrid (Harry Potter)?", "r1":"Skolans vice rektor", "r2":"Självvårdaren", "r3":"Förvandlingsläraren", "r4":" En prefekt", "correct": "2"}, {"question":"Vad är Islands huvudstad?", "r1":"Amsterdam", "r2":"Reykjavik", "r3":" Tbilisi ", "r4":"Almaty", "correct": "2"} ] } }

Jag är medveten om att koden inte visas som den ska, men om vi tittar noga ser vi att vi har ett element preguntas, som med »[]» specificerar vi att det kan finnas flera (de är inte statiska) element; i det här fallet har vi 4 som standard, fyra frågor med respektive svar.

För att få dokumentelementen JSON, kan vi ange identifieraren för det dokument som vi har skapat (vilket är ett dokument). Låt oss föreställa oss att vi vill få texten till den första frågan:

aDocument.contents.questions [0] .question

Denna kodrad ger oss frågeinnehållet i dokumentet aDocument, av element 0 (det första i indexet), vilket är: «Det kommer att finnas dev.desdelinux.netto?" Om vi ​​sätter siffran 1 i indexet så är det den andra frågan.

Programmering av spellogiken

Nu när vi vet hur vi ska hantera databasen där vi har sparat frågorna ska vi programmera spellogiken. Först och främst skapar vi en fil JavaScript (.js): Lägg till ny -> Qt -> Js-fil. jag ska ringa honom logic.js.

I filen ska vi skapa flera funktioner för att importera js-filen till vårt qml-dokument:

importera "logica.js" som Logica

Vi associerar namnet Logica, så när vi vill kalla en funktion kommer vi att göra det som Logica.funcion (), som om det vore ett objekt som har sina metoder.

För nu, så att inlägget inte blir för långt, lämnar vi tiden för frågan och alternativen för senare, vi kommer att koncentrera oss på frågorna och poängen, låt oss se en funktion som vi kommer att använda för att gå vidare från fråga:

function nextQuestion (num) {// time = 0 question.text = aDocument.contents.questions [num] .question; resp1.text = aDocument.contents.questions [num] .r1; resp2.text = aDocument.contents.questions [num] .r2; resp3.text = aDocument.contents.questions [num] .r3; resp4.text = aDocument.contents.questions [num] .r4; }

Som vi kan se passerar vi fråganummeret där vi är som ett argument och härifrån sätter det svaren på knapparna och frågetiketten. Låt oss se nu för att validera om det valda svaret är korrekt:

funktions träff (num, alternativ) {var hit = false; var num_correct = aDocument.contents.questions [num] .correct; if (option == correct_num) hit = true; retur hit; }

Koden talar för sig själv, om det valda alternativet är detsamma som det som tillhandahålls i databasen, så är det sant, annars gör det inte. Nu när vi har definierat dessa funktioner kommer vi att tillämpa dem i vår qml-kod.

Först och främst lägger vi till en variabel som styr vilken fråga vi befinner oss i, vi kommer att kalla den num; Vi kommer också att ha ytterligare tre variabler: träffar, missningar och poäng.

    property int num: 0 property int nfaults: 0 property int births: 0 property int npoints: 0

Ursprungligen är de alla på 0.

Nu lägger vi till en onClick till alla svarsknapparna. onClick, som namnet säger, är en händelse som kommer att hända när du klickar på knappen:

            Knapp {id: resp1 text: "Svar 1" anchors.horizontalCenter: parent.horizontalCenter bredd: parent.width - 20 onClicked: {if (Logic.certain (num, 1)) {num = num + 1; Logic.nextQuestion (num) npoints = npoints + 50 födslar = födslar + 1} annat {nfaults = nfault + 1}}}

Vi ser att när du klickar på knappen kontrollerar det om det är korrekt eller inte, om det är, lägg till poängen och skicka frågan, annars återstår ett liv.

Slutligen gör vi den första frågan när sidkomponenten laddas:

    Sidan {id: Gamepage Component.onCompleted: {Logic.nextPregunta (0)}

Låt oss se hur det blev:

testa


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   gabielus sade

    Jag följer stegen och allt fungerar. Bara för att samarbeta säger jag att:
    * Ändrar inte värdet på träffar och missningar. Du måste lägga till det till varje knapp i ditt klickhändelse.
    * Och det i raden:
    om (Logic.acerto (num, 1)) {
    ändra 1 till numret på knappen / svaret.

    lolbimbo, jag tycker att ditt bidrag är intressant. Jag hoppas nya tutor !!!

    Tack för att dela.

    1.    lolbimbo sade

      Jag gillar att du har kommenterat dessa punkter eftersom jag inte gjorde det tydligt i inlägget, vad mer, jag kommer inte ihåg poängen, framgångarna och misslyckandena, om du tittar på det kommer du att se att när vi trycker på knappen, vi lägger till poängen framgångarna ... men de återspeglas inte i etiketten, det är därför vi måste lägga den i dess textegenskap för att visa punkterna:

      Etikett {
      id: misslyckanden
      text: «Fel:» + nfel
      färgen röd"
      }

      Etikett {
      id: träffar
      text: «Träffar:» + född
      }

      Etikett {
      id: poäng
      text: «Poäng:» + npoäng
      fontSize: "medium"
      }

      Jag kommer också att klargöra det i del 3.