2013-02-15 2 views
1

Я делаю HTML5 на холсте, используя JavaScript. Игра просто простая, где на холсте отображается несколько изображений, а также несколько полей описания. Пользователь должен перетащить каждое изображение в соответствующее поле описания.JavaScript-вызывающие функции изнутри функций

В настоящее время у меня есть холст, отображающий изображения и описания. Они отображаются сразу же, как только загружается страница, однако я хочу добавить «кнопку запуска», которую пользователь должен будет щелкнуть, прежде чем появятся изображения и поля описания и т. Д., И они начнут играть в игру.

Код для моей страницы в настоящее время выглядит следующим образом:

<!DOCTYPE HTML> 
<html> 
    <head> 
    <style> 
    body { 
    margin: 0px; 
    padding: 0px; 
    } 
    canvas{ 
    border: 1px solid #9C9898; 
    background:#F5F5F5; 
    } 
</style> 
<div id="container"></div> 
<script src="kinetic.js"></script> 
<script src="drawdescriptionboxes.js"></script> 
<script src="drawLevelOneElements.js"></script> 
<script src="startGameDrawGameElementsDrawStartButton.js"></script> 
<script> 
/*Add the game elements' global variables */ 
var currentLevel = 1; 
var totalLevels = 3; 
var currentScore = 0; 
var currentScorePositionX = 950; 
var currentScorePositionY = 10; 

/*Add code to draw images to random locations here */ 
    //var imageX = Math.floor(Math.random()*950); 
    //var imageY = Math.floor(Math.random()*450); 

    var stage = new Kinetic.Stage({ 
     container: "container", 
     width: 1000, 
     height: 500 
    }); 
    var imagesLayer = new Kinetic.Layer(); 
    var canvas = imagesLayer.getCanvas(); 
    var context = canvas.getContext("2d"); 
    console.log("Foo "); 

/*Load the images from the HTML into the JavaScript */ 
function loadImages(sources, callback){ 
    var imagesDir = ""; 
    var images = {}; 
    var loadedImages = 0; 
    var numImages = 0; 

    //console.log("length " + sources.length); 
    for (var src in sources){ 
     numImages++; 
    } 
    //console.log("Num Images " + numImages); 

    var index=0; 
    console.log("length " + sources.length); 
    for (index=0;index < numImages ;index++){ 
     console.log(index); 
     images[index] = new Image(); 
     images[index].src = sources[index]; 
     console.log("Adding " + sources[index]); 
     callback(images[index]); 
     console.log("sources array length = " + sources.length); 
    } 

    stage.add(imagesLayer); // should only be added once!! 
} 

/*Function to check whether the item being dragged is near its description box */ 
function isNearDescriptionBox(itemImage, descriptionBox){ 
    var ii = itemImage; 
    var db = descriptionBox; 
    if(ii.attrs.x > db.x - 20 && ii.attrs.x < db.x + 20 && ii.attrs.y > db.y - 20 && ii.attrs.y < db.y +20){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

/* This function draws the game elements */ 
function drawGameElements(){ 
    /* Draw a line for the 'score bar'. */ 
    context.moveTo(0, 25); 
    context.lineTo(1000, 25); 
    context.stroke(); 

    /* Draw current level/ total levels on the left, and current score on the right. */ 
    context.font = "11pt Calibri"; /* Text font & size */ 
    context.strokeStyle = "black"; /* Font colour */ 
    context.strokeText(currentLevel + "/" + totalLevels, 10, 15); 
    context.strokeText(currentScore, 750, 15); 
} 

function initStage(images){ 
    var stage = new Kinetic.Stage({ 
     container: "container", 
     width: 1000, 
     height: 500 
    }); 
    var descriptionLayer = new Kinetic.Layer(); 
    //var imagesLayer = new Kinetic.Layer(); 
    var allImages = []; 
    var currentScore = 0; 

    var descriptionBoxes = { 
     assetsDescriptionBox: { 
      x: 70, 
      y: 400 
     }, 
     liabilitiesDescriptionBox: { 
      x: 300, 
      y: 400 
     }, 
     incomeDescriptionBox: { 
      x: 530, 
      y: 400 
     }, 
     expenditureDescriptionBox: { 
      x: 760, 
      y: 400 
     }, 
    }; 

    /*Code to detect whether image has been dragged to correct description box */ 
    for (var key in sources){ 
     /*Anonymous function to induce scope */ 
     (function(){ 
      var privateKey = key; 
      var imageSource = sources[key]; 

      /*Check if image has been dragged to the correct box, and add it to that box's 
       array and remove from canvas if it has */ 
      canvasImage.on("dragend", function(){ 
       var descriptionBox = descriptionBoxes[privateKey]; 
       if(!canvasImage.inRightPlace && isNearDescriptionBox(itemImage, descriptionBox)){ 
        context.remove(canvasImage); 
        /*Will need to add a line in here to add the image to the box's array */ 
       } 
      }) 

     })(); 
    } 

} 

function drawImage(imageObj) { 
    //var layer = new Kinetic.Layer(); 

    //var imageX = Math.floor(Math.random()*950); 
    //var imageY = Math.floor(Math.random()*450); 

    /*Got the code from generating random coordinates from: 
     http://stackoverflow.com/questions/4959975/random-between-two-numbers-in-javascript*/ 
    function randomPosition(from, to){ 
     return Math.floor(Math.random()*(to-from+1)+from); 
    } 

    var canvasImage = new Kinetic.Image({ 
     image: imageObj, 
     width: 50, 
     height: 50, 
     // puts the image in teh middle of the canvas 
     x: randomPosition(0, 950), //imageX, //stage.getWidth()/2 - 50/2, 
     y: randomPosition(30, 350), //imageY, //stage.getHeight()/2 - 50/2, 
     draggable: true 
    }); 

    // add cursor styling 
    canvasImage.on('mouseover', function() { 
     document.body.style.cursor = 'pointer'; 
    }); 
    canvasImage.on('mouseout', function() { 
     document.body.style.cursor = 'default'; 
    }); 

    imagesLayer.add(canvasImage); 
} 

/*This code loads the images to the canvas when the browser window loads */ 
window.onload = function(){ 
    var sources = []; 
     sources[0] = document.getElementById("building").src, 
     sources[1] = document.getElementById("chair").src, 
     sources[2] = document.getElementById("drink").src, 
     sources[3] = document.getElementById("food").src, 
     sources[4] = document.getElementById("fridge").src, 
     sources[5] = document.getElementById("land").src, 
     sources[6] = document.getElementById("money").src, 
     sources[7] = document.getElementById("oven").src, 
     sources[8] = document.getElementById("table").src, 
     sources[9] = document.getElementById("van").src, 

     sources[10] = document.getElementById("burger").src, 
     sources[11] = document.getElementById("chips").src, 
     sources[12] = document.getElementById("drink").src, 
     sources[13] = document.getElementById("franchiseFee").src, 
     sources[14] = document.getElementById("wages").src, 

     sources[15] = document.getElementById("admin").src, 
     sources[16] = document.getElementById("cleaners").src, 
     sources[17] = document.getElementById("electricity").src, 
     sources[18] = document.getElementById("insurance").src, 
     sources[19] = document.getElementById("manager").src, 
     sources[20] = document.getElementById("rates").src, 
     sources[21] = document.getElementById("training").src, 
     sources[22] = document.getElementById("water").src, 

     sources[23] = document.getElementById("burger").src, 
     sources[24] = document.getElementById("chips").src, 
     sources[25] = document.getElementById("drink").src, 

     sources[26] = document.getElementById("creditors").src, 
     sources[27] = document.getElementById("electricity").src, 
     sources[28] = document.getElementById("food").src, 
     sources[29] = document.getElementById("hirePurchase").src, 
     sources[30] = document.getElementById("loan").src, 
     sources[31] = document.getElementById("overdraft").src, 
     sources[32] = document.getElementById("payeTax").src, 
     sources[33] = document.getElementById("tax").src; 

    drawStartButton(); 
    loadImages(sources, drawImage); 
    //drawGameElements(); 
    //drawDescriptionBoxes(); 

}; 

У меня также есть скрытый раздел в <body></body> страницы, где я загружен все изображения, которые будут использоваться в HTML первый , прежде чем манипулировать ими с помощью JS.

В настоящее время, когда я просматриваю страницу в браузере, все изображения из массива sources отображаются на холсте в случайных местах, а также в окнах описания, баре счета и кнопке запуска.

Однако, что я хочу, это то, что, когда страница изначально загружается, на холсте отображается только кнопка запуска, а затем, когда пользователь нажимает на нее, отображается все остальное.

Предположительно, чтобы сделать это, я хотел бы, чтобы удалить/закомментировать вызовы ко всем функциям кроме drawStartButton() в конце функции windows.onload = function(){...}, а затем вызовы на другой функции в onmousedown случае прикрепленного к кнопка Пуск?

Однако по какой-то причине, когда я прокомментирую звонок в loadImages(sources, drawImage); в конце этой функции, а затем снова просмотрите мою страницу в браузере, холст больше не отображается на странице. Я бы ожидал, что холст все еще будет там, только без изображений, отображаемых на нем. Кто-нибудь знает, почему этого не происходит, и как я могу это исправить?

Кода для моей loadImages(sources, drawImage); функции:

function loadImages(sources, callback){ 
    var imagesDir = ""; 
    var images = {}; 
    var loadedImages = 0; 
    var numImages = 0; 

    //console.log("length " + sources.length); 
    for (var src in sources){ 
     numImages++; 
    } 
    //console.log("Num Images " + numImages); 

    var index=0; 
    console.log("length " + sources.length); 
    for (index=0;index < numImages ;index++){ 
     console.log(index); 
     images[index] = new Image(); 
     images[index].src = sources[index]; 
     console.log("Adding " + sources[index]); 
     callback(images[index]); 
     console.log("sources array length = " + sources.length); 
    } 

    stage.add(imagesLayer); // should only be added once!! 
} 

Я не могу понять, почему удаление вызова этой функции может остановить полотно из отображаются на странице ... какие-то идеи?

ответ

0

В последней строке функции,

stage.add(imagesLayer); // should only be added once!! 

добавляет слой на сцену. Хотя на этапе есть контейнер (div, например), слой является фактическим холстом.

Если вы не вызываете loadImages(), слой никогда не добавляется в DOM, потому что эта строка никогда не запускается.

+0

А, хорошо, что имеет смысл. Brilliant! Огромное спасибо! – someone2088

+0

Как бы я тогда установил 'onmousedown', чтобы вызвать функции, которые я хочу, когда mousedown обнаружен на изображении кнопки запуска? Предположительно мне нужно создать переменную JS, которая содержит изображение кнопки запуска, используя 'var startButton = document.getElementById (« startButton »). Src;' и тогда это будет что-то вроде функции startButton.onmousedown() {вызовы функций} ; '? – someone2088

+0

Поскольку вы используете холст или, если хотите, Kinetic.js, это не так просто. * (также .src будет URL-адресом для изображения, а не элементом DOM). * Я предполагаю, что вы используете Kinetic.js для кнопки запуска, а не просто позиционирование кнопки абсолютным? В этом случае ознакомьтесь с этим руководством для событий с кинетикой: http://www.html5canvastutorials.com/kineticjs/html5-canvas-path-mouseover/ – MildlySerious