Ich mache ein Simon-Spiel und ich nehme die Deckkraft von 1 bis 0,3 und zurück zu 1 jedes Mal, wenn eine Sequenz stattfindet. Es funktioniert fast, aber der Fall, der Probleme verursacht, ist, wenn ich in der Sequenz die gleiche Farbe hintereinander habe. GRÜN, GRÜN, ROT, BLAU zeigt beispielsweise nur einen grünen und einen roten und einen blauen Druck an. Es ist ein Problem mit dem Timing, weil die Logik gut funktioniert. Hier ist mein CodeSimon Spiel Javascript, wie synchronisiere ich die Lichter der Tasten nicht aufeinander mit Animation() und Verzögerung() JQUERY?
$(document).ready(function(){
let simon={
colors:["green","red","yellow","blue"],
sequence:[],
userSequence:[],
strict:false,
buttonSounds : {},
init: function(){
let objectContext=this;
$("#start").on("click",function(){
objectContext.setSounds();
//executes for the first time
objectContext.emptyAllSequences();
//I generate the first of the sequence
objectContext.generateAndAddRandomColor();
//I display the sequence on the board
objectContext.displaySequenceOnBoard();
});
$("#title").addClass('tada animated');
$("#strict").on("click",function(){
$(this).toggleClass("active");
if($(this).hasClass("active")){
objectContext.strict=true;
}else{
objectContext.strict=false;
}
});
$(".button").on("click",function(){
const color=$(this).attr("data-color");
objectContext.lightButton(color,0);
objectContext.userSequence.push(color);
let isSequenceCorrect=objectContext.checkUserSequence();
/* console.log("sequenceCorrect "+isSequenceCorrect);
console.log("sequence "+objectContext.sequence);
console.log("user sequence "+objectContext.userSequence);
console.log("user sec length "+objectContext.userSequence.length);
console.log("sec length "+objectContext.sequence.length);*/
if(objectContext.userSequence.length===objectContext.sequence.length || !isSequenceCorrect){
if(isSequenceCorrect){
setTimeout(function(){objectContext.generateAndAddRandomColor();
objectContext.displaySequenceOnBoard();
//reset the userSequence to check the whole sequence again
objectContext.emptyUserSequence(); }, 1500);
}else{
//if strict mode is on
if(strict){
//user looses
$("#count").html("Lost");
//wipe sequence array
objectContext.emptyAllSequences();
$("#start").removeClass("active");
}else{
setTimeout(function(){
//change this to generate another sequence instead of displaying the existent
objectContext.displaySequenceOnBoard();
//reset the userSequence to check the whole sequence again
objectContext.emptyUserSequence(); }, 1500);
}
}
}
});
},
setSounds:function(){
this.buttonSounds["green"] = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound1.mp3");
this.buttonSounds["red"] = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound2.mp3");
this.buttonSounds["yellow"] = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound3.mp3");
this.buttonSounds["blue"] = new Audio("https://s3.amazonaws.com/freecodecamp/simonSound4.mp3");
},
emptyUserSequence: function(){
this.userSequence.length=0;
},
emptyAISequence: function(){
this.sequence.length=0;
},
emptyAllSequences:function(){
this.emptyUserSequence();
this.emptyAISequence();
},
updateCount: function(){
$("#count").html(this.sequence.length);
},
checkUserSequence:function(){
for(let i=0,len=this.userSequence.length;i<len;i++){
if(this.userSequence[i]!== this.sequence[i]){
return false;
}
}
return true;
},
generateAndAddRandomColor:function(){
const randColorIndex=Math.floor(Math.random()*4);
const randColor=this.colors[randColorIndex];
this.sequence.push(randColor);
this.updateCount();
},
displaySequenceOnBoard: function(){
for(let i=0,len=this.sequence.length;i<len;i++){
// this.buttonSounds[this.sequence[i]].play();
this.lightButton(this.sequence[i],i);
}//end for
},
lightButton: function(color,i){
var objectContext=this;
$("#"+color).delay(400*i)
.animate({opacity : 0.3}, 300,function(){
objectContext.buttonSounds[color].play();
$("#"+color).animate({opacity : 1}, 150);
});
}
}
simon.init();
});
Hier ist der Codepen. Sie müssen Start drücken, um das Spiel zu starten, und wenn die Reihenfolge wächst und auf dem Brett angezeigt wird, taucht das Problem auf, das zuvor kommentiert wurde, was könnte passieren ?. Vielen Dank!
http://codepen.io/juanf03/pen/jrEdWz?editors=1111
große Antwort, aber könnten Sie mir erklären, warum ich "mehrere Verzögerungen auf dem gleichen Element auf einmal einstellen"? ... Ich verstehe nicht warum .... – Juan
@Juan Jedes Mal, wenn lightButton() aufgerufen wird , es setzt ein $(). delay() für das Element mit der angegebenen Farbe. Beim ersten Aufruf von lightButton ("grün") wird eine Verzögerung auf '# grün' gesetzt. Wenn Sie es dann das zweite Mal aufrufen (nächste Iteration in der for-Schleife), wird eine weitere, längere Verzögerung für '# green' gesetzt. Aber da ein Element nur eine Verzögerung haben kann, ersetzt die zweite die erste. – Robert
klar wie Wasser ... Vielen Dank .... mein letzter Codepen ist das http://codepen.io/juanf03/pen/jrEdWz?editors=0001 es funktioniert perfekt, die Sounds funktionierten nicht aber ich habe es deiner Funktion hinzugefügt. jetzt habe ich ein problem, wenn die gleichen farben hintereinander sind hört sich der 2. ton nicht an ...... zum beispiel rot rot nur die ersten roten töne ..... was könnte passieren? Ich habe den Sound auf Leitung 160 – Juan