2013-07-30 6 views
0

Кто-нибудь видит ошибку в моем коде, которая запрещает изменение переменной «player1Bananas»? Все остальное в функции отлично работает.Переменная, не меняющаяся при вызове функции

//update playerStats arguments: 
    //banana is a banana object 
    //x and y are the banana's position 
    //players bananas is player1Bananas or player2Bananas, 
    //ballPosition is "left" or "right" 
    updatePlayerStats: function(banana, x, y, playersBananas, ballPosition) { 
     playersBananas += 1; 
     gameController.bananasTaken += 1; 
     banana.x = x; 
     banana.y = y; 
     gameController.player1Score = 0; 
     gameController.player2Score = 0; 
     gameController.setUpPaddles(); 
     gameController.setUpBall(ballPosition); 
    }, 
    gameController.updatePlayerStats(gameController.Banana1, 20, gameController.canvas.height - 20 - gameController.Banana1.height, 
gameController.player1Bananas, "left"); 

Спасибо!

+1

функция Причина получить его по значению. прочитайте: http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value – Cherniv

+0

Я рекомендую вам создавать функции доступа для абстрагирования некоторых из вашего кода. Вы можете просто вызвать 'gameController.giveBanana()', который увеличит 'bananasTaken' и увеличит' playersBananas'. Это поможет вам позже, если вы когда-либо измените имя переменной или внесите какие-либо другие изменения. – Jared

+0

@Jazza Это действительно хорошая идея, спасибо. – user2602079

ответ

1

gameController.player1Bananas примитивный тип, поэтому он передается по значению ... не ссылается. Это означает, что внутри функции playerBananas больше не ссылается на player1Bananas, это просто целое значение.

Попробуйте передать объект вместо этого, например, у вас может быть объект игрока с свойством bananaCount. Затем передайте объект игрока в функцию и увеличьте свойство bananaCount объекта игрока.

например.

//update playerStats arguments: 
    //banana is a banana object 
    //x and y are the banana's position 
    //players bananas is player1Bananas or player2Bananas, 
    //ballPosition is "left" or "right" 
    updatePlayerStats: function(banana, x, y, player, ballPosition) { 
     player.bananaCount += 1; 
     gameController.bananasTaken += 1; 
     banana.x = x; 
     banana.y = y; 
     gameController.player1Score = 0; 
     gameController.player2Score = 0; 
     gameController.setUpPaddles(); 
     gameController.setUpBall(ballPosition); 
    }, 
    gameController.updatePlayerStats(gameController.Banana1, 20, gameController.canvas.height - 20 - gameController.Banana1.height, 
gameController.player1, "left"); 

Смотрите эту ссылку для хорошего объяснения .. http://snook.ca/archives/javascript/javascript_pass

+0

Спасибо, я думаю, что это решение - лучший способ пойти на мою игру. – user2602079

2

Поскольку в JavaScript числа передаются по значению ...

Вы должны передать что-то другое, чем одно число, как государственный игрок объекта ({ID: 1, бананы: 17}, например).

5

Вы передаете значение из gameController.player1bananas в качестве параметра к функции.

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

Пример: http://jsfiddle.net/GHkJ6/

Чтобы это исправить, вам нужно передать его как объект. JavaScript не передаст его как значение, а сам объект.

Пример: http://jsfiddle.net/F446Q/

+0

Спасибо, я сейчас это делаю – user2602079

0

player1Bananas изменения глобальной переменной затем изменить тот же player1Bananas внутри функции

Смежные вопросы