[SOLVED] Reference error: Can't find variable...



  • Hey there!
    Currently trying to follow one of the game guides on qt-project http://qt-project.org/doc/qt-4.8/declarative-tutorials-samegame-samegame1.html.

    However when I run the main qml file named "samegame.qml" my terminal give me the error "Reference error: Can't find variable floodFill. Basicly I don't know why this is happening since I have more or less copied what the guide says, would be nice with some advice!

    Here's the code so far:

    samegame.js
    @ var blockSize = 30;
    var maxColumn = 10;
    var maxRow = 15;
    var maxIndex = maxColumn * maxRow;
    var board = new Array(maxIndex);
    var component;

    //Index function used instead of a 2D array
    function index(column, row) {
    return column + (row * maxColumn);
    }

    function startNewGame() {
    //Delete blocks from previous game
    for (var i = 0; i < maxIndex; i++) {
    if (board[i] != null)
    board[i].destroy();
    }

     //Calculate board size
     maxColumn = Math.floor(background.width / blockSize);
     maxRow = Math.floor(background.height / blockSize);
     maxIndex = maxRow * maxColumn;
    
     //Initialize Board
     board = new Array(maxIndex);
     for (var column = 0; column < maxColumn; column++) {
         for (var row = 0; row < maxRow; row++) {
             board[index(column, row)] = null;
             createBlock(column, row);
         }
     }
    

    }

    function createBlock(column, row) {
    if (component == null)
    component = Qt.createComponent("Block.qml");

     // Note that if Block.qml was not a local file, component.status would be
     // Loading and we should wait for the component's statusChanged() signal to
     // know when the file is downloaded and ready before calling createObject().
     if (component.status == Component.Ready) {
         var dynamicObject = component.createObject(background);
         if (dynamicObject == null) {
             console.log("error creating block");
             console.log(component.errorString());
             return false;
         }
         dynamicObject.x = column * blockSize;
         dynamicObject.y = row * blockSize;
         dynamicObject.width = blockSize;
         dynamicObject.height = blockSize;
         board[index(column, row)] = dynamicObject;
     } else {
         console.log("error loading block component");
         console.log(component.errorString());
         return false;
     }
     return true;
    

    }

    function handleClick(xPos, yPos) {
    var column = Math.floor(xPos / gameCanvas.blockSize);
    var row = Math.floor(yPos / gameCanvas.blockSize);
    if (column >= maxColumn || column < 0 || row >= maxRow || row < 0)
    return;
    if (board[index(column, row)] == null)
    return;
    //If it's a valid block, remove it and all connected (does nothing if it's not connected)
    floodFill(column, row, -1);
    if (fillFound <= 0)
    return;
    gameCanvas.score += (fillFound - 1) * (fillFound - 1);
    shuffleDown();
    victoryCheck();
    }

    function victoryCheck() {
    //Award bonus points if no blocks left
    var deservesBonus = true;
    for (var column = maxColumn - 1; column >= 0; column--)
    if (board[index(column, maxRow - 1)] != null)
    deservesBonus = false;
    if (deservesBonus)
    gameCanvas.score += 500;

     //Check whether game has finished
     if (deservesBonus || !(floodMoveCheck(0, maxRow - 1, -1)))
         dialog.show("Game Over. Your score is " + gameCanvas.score);
    

    }@

    samegame.qml
    @import QtQuick 1.0
    import "samegame.js" as SameGame

    Rectangle {
    id: screen

     width: 490; height: 720
    
     SystemPalette { id: activePalette }
    
     Item {
         width: parent.width
         anchors { top: parent.top; bottom: toolBar.top }
    
         Image {
             id: background
             anchors.fill: parent
             source: "img/rsz_3test.jpg"
             fillMode: Image.PreserveAspectCrop
         }
    
         Item {
             id: gameCanvas
    
             property int score: 0
             property int blockSize: 40
    
             width: parent.width - (parent.width % blockSize)
             height: parent.height - (parent.height % blockSize)
             anchors.centerIn: parent
    
             MouseArea {
                 anchors.fill: parent
                 onClicked: SameGame.handleClick(mouse.x, mouse.y)
             }
         }
     }
    
     Rectangle {
         id: toolBar
         width: parent.width; height: 30
         color: activePalette.window
         anchors.bottom: screen.bottom
    
         Button {
             anchors { left: parent.left; verticalCenter: parent.verticalCenter }
             text: "New Game"
             onClicked: SameGame.startNewGame()
         }
    
         Text {
             id: score
             anchors { right: parent.right; verticalCenter: parent.verticalCenter }
             text: "Score: Who knows?"
         }
     }
    

    }@

    Would be very happy for an answer! Thanks in advance!



  • floodFill is a function which is missing in your samegame.js.

    Have a look at
    http://qt-project.org/doc/qt-4.8/declarative-tutorials-samegame-samegame4-content-samegame-js.html



  • Argh, thanks...didn't realise that they skipped the part where they explained the floodFill function. Guess it sometimes would be worth it to read the guide a bit more thoroughly. Once again Thank you!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.