2014-10-29 3 views
0

Я пытаюсь реализовать счет внутри игры, которую я создаю в AS3. До сих пор мне удалось создать систему оценки, которая добавляет/вычитает очки на основе действий в игре. Я решил, что было бы проще, чтобы система подсчета очков просто добавляла очки, а не вычитала их и достигла определенного числа, закончив игру.ActionScript 3 Scoring/Math

Проблема, с которой я сталкиваюсь, заключается в том, что, с одной стороны, игра выполняет проверки, чтобы увидеть, находятся ли фигуры в нужном месте. Если они есть, игрок выигрывает. С другой стороны, счетчик должен подсчитывать и достигать определенного количества (10), прежде чем решить, проигрывает ли игрок. В настоящий момент происходит какое-то странное поведение, в котором я могу перетащить куски, не помещая их в нужное место, а счетчик все равно длится 10. Я пробовал несколько вариантов изменения математики, так что он имеет разные значения , но функциональность такая же. Что бы мне пришлось изменить, чтобы он поступил так, как описано выше?

stop(); 

//Create the score counter 

import flash.text.TextField; 

var score = 0; 
scorecounter.text = score; 
function init(): void 
{ 
    score = 0; 
    scorecounter.text = "SCORE:" + score.toString(); 
} 

function updateScore(): void 
{ 
    scorecounter.text = ++score; 
} 

function evaluateScore(): void //this is meant to stop the score going below 0 
{ 
    scorecounter.text = --score; 
    if(score < 0) { 
     score -= score; 
    } 
} 

/*Omitted some functions and var's for object positions and events*/ 

function stopDragging(e:MouseEvent):void { 
    e.currentTarget.stopDrag(); 
    switch (e.currentTarget){ 
     case apple: 
      if (apple.x < appleEndX - offset || apple.x > appleEndX + offset || 
       apple.y < appleEndY - offset || apple.y > appleEndY + offset) { 

       apple.x = appleStartX; 
       apple.y = appleStartY; 
       soundOne(); 
       updateScore(); 
      } else { 
       apple.x = appleEndX; 
       apple.y = appleEndY; 
       soundTwo(); 
       updateScore(); 
       checkGame(); 
      } 
      break; 
      //Lots of other cases, using the same method 

      //The end of the game - here, I've been trying to set it to 
      //check whether the player will win or lose 
    } 
} 

function checkGame(): void { 

    if (apple.x == appleEndX && apple.y == appleEndY && pear.x == pearEndX && 
     pear.y == pearEndY && guava.x == guavaEndX && guava.y == guavaEndY && 
     pineapple.x == pineappleEndX && pineapple.y == pineappleEndY && 
     plum.x == plumEndX && plum.y == plumEndY && 
     purple.x == purpleEndX && purple.y == purpleEndY) 
    { 
     trace("You win!"); 
     gotoAndStop(149); 
     soundFive(); 
    } else if (score == 10) { 
     gotoAndStop(150); 
     soundSix(); 
     trace("You lose."); 
    } 
} 
+0

user3293367 вы вызываете updateScore() дважды: в 'if' и в' else'. Это точно так, как если бы вы вызывали его каждый раз. – helloflash

ответ

0

Я думаю, что логика немного сбивает с толку, но, как я понимаю из вашего кода, идея заключается в том, чтобы переместить перетаскивания фронтон элемент для правильного х, у позиции, с допуском «смещение «? Цель состоит в том, чтобы с минимально возможным «счетом» (или количеством ходов), и если количество ходов (оценка) больше 10, то вы теряете игру?

В настоящее время единственным местом, где проверено, было ли вы сделано 10 ходов, является «checkGame», и этот метод вызывается только в том случае, если ваше «яблоко» правильно расположено. Если он неправильно установлен, количество ходов увеличивается, но оценка не проверяется. Поэтому, когда вы, наконец, попадаете в «checkGame», но правильно позиционируете «яблоко», оценка может быть уже больше 10. Таким образом, ваша оценка «score == 10» также потерпит неудачу.

Так что вам нужно, чтобы проверить игру на каждый ход с чем-то вроде этого:

function stopDragging(e:MouseEvent):void { 
    ... 
    switch (e.currentTarget){ 
     case apple: 
      if (apple.x < appleEndX - offset || apple.x > appleEndX + offset || 
       apple.y < appleEndY - offset || apple.y > appleEndY + offset) { 

       apple.x = appleStartX; 
       apple.y = appleStartY; 

       soundOne(); 
      } else { 
       apple.x = appleEndX; 
       apple.y = appleEndY; 

       soundTwo(); 
      } 
     break; 
    ... 
    } 
    //Check the game on every turn. 
    checkGame(); 
} 


function checkGame(){ 

    //Update the score 
    score++; 

    if (apple.x == appleEndX && apple.y == appleEndY && pear.x == pearEndX && 
     pear.y == pearEndY && guava.x == guavaEndX && guava.y == guavaEndY && 
     pineapple.x == pineappleEndX && pineapple.y == pineappleEndY && 
     plum.x == plumEndX && plum.y == plumEndY && 
     purple.x == purpleEndX && purple.y == purpleEndY) 
    { 
      //Do the game win. 
    } 
    else if (score>=10) 
    { 
     //Else if you have a score greater then or equal to 10 do the game lose. 
    } 
} 
+0

Это отлично работает - спасибо! Я замечаю, что, пока оценка обновляется правильно, визуальная оценка больше не обновляется. Я просто включил checkGame в scorecounter.text, чтобы снова работать? – user3293367

+0

Да, так правильно под счетом ++ вы могли бы просто добавить scorecounter.text = score; –