2014-11-23 7 views
0

간단한 HTML5 게임을 만들고 있는데 성과 시스템을 구현하려고합니다. 내 방법은 이름, 설명, 조건 등의 속성을 가진 성취 객체를 만드는 것입니다. 이제는 Achievement.LookARock = new Achievement("Look! A Rock!", "Mined stone for the first time!", (stone.count == 1), false);과 같은 것을 호출하여 다른 성취 객체를 생성해야합니다. 이제는 성취 조건이 사실인지 확인해야합니다. 나는 setInterval로 전화해서 그렇게한다. 다음은 내가 사용하고있는 코드입니다 :매개 변수/인수로 부울?

//Achievements 
Achievement.LookARock = new Achievement("Look! A rock!", "Mined stone for the first time.", (stone.count >= 1), false); 
Achievement.IGotWood = new Achievement("Haha... I got wood...", "Mined wood for the first time.", (wood.count == 1), false); 
Achievement.Stone100 = new Achievement("Stone 100", "Mined 100 stone blocks.", (stone.count == 100), false); 
Achievement.Stone500 = new Achievement("Stone 500", "Mined 500 stone blocks.", (stone.count == 500), false); 
Achievement.Stone1000 = new Achievement("Stone 1000", "Mined 1000 stone blocks.", (stone.count == 1000), false); 
Achievement.FirstCraft = new Achievement("First Craft", "Crafted your first item.", (craftedtools.length == 2), false); 
Achievement.Shiny = new Achievement("Oooooo... shiny!", "Mined a diamond!", (diamond_ore.count == 1), false); 
Achievement.ICantButter = new Achievement("I can't believe it's not butter!", "Mined gold!", (gold_ore.count == 1), false); 
Achievement.IronMan = new Achievement("I am Iron Man...", "Mined metal!", (metal_ore == 1), false); 
//Achievement.Level1 = new Achievement("Level 1 Completed!", "Crafted a Diamond Pickaxe!", craftedtools.includes(diamond_pick), false); 

/*var achievements = [Achievement.LookARock, 
        Achievement.IGotWood, 
        Achievement.Stone100, 
        Achievement.Stone500, 
        Achievement.Stone1000, 
        Achievement.FirstCraft, 
        Achievement.Shiny, 
        Achievement.ICantButter, 
        Achievement.IronMan];*/ 

function checkAchievement(achievement){ 

    var condition = achievement.condition; 
    var achieved = achievement.achieved; 

    if(condition !== false){ 

     return true; 

    } 

    return false; 

} 

function checkAchievements(){ 

    for(var i = 0; i < achievements.length; i++){ 

     var a = achievements[i]; 

     if(checkAchievement(a)){ 

      alert(a.name + "\n" + a.description); 

     } 

    } 

} 

function update(){ 

    try{ 

     checkAchievements(); 

    }catch(e){ 

     console.log(e); 

    } 

} 

changeTool(stone_pick); 
makeMineGenerator(); 

setInterval(update, 50); 

나는 이것이 성과를 확인하고 있음을 알고 있습니다. 그러나 카운트가 정확한 양이라도 조건은 항상 false를 반환합니다. 이 문제를 해결할 수있는 방법이 있습니까?

+1

"개수"는 무엇입니까? 여러분이 올린 코드에서 일어나는 모든 일은 부울 플래그의 값을 확인하는 것입니다. – Pointy

답변

0

성과를 만드는 방법이 원인입니다. (stone.count == 1) 개체 생성시 condition 속성에 false이 할당되도록 Achievement 생성자를 호출하기 전에 평가됩니다.

성취도를 확인할 때 호출 할 수있는 성취도 개체를 만들어야합니다.

Achievement.LookARock = new Achievement(
    "Look! A Rock!", 
    "Mined stone for the first time!", 
    function() { 
    return stone.count == 1; 
    }, 
    false 
); 

그런 다음 업적을 확인하려면 if (achievement.condition())을 사용할 수 있습니다.

+0

정말 고마워요! 이것은 내 문제를 해결했다. – arjay07

관련 문제