2016-03-22 12 views
6

Problemróżne strony w grze płótnie

tworzę grę przy użyciu HTML5 Canvas, gra posiada menu głównego, w menu głównym ma kilka przycisków do wyboru. Utrudniam i mylę, w jaki sposób, na przykład, jeśli użytkownik naciśnie przycisk "Graj", aby pokazać grę. Oto obraz z głównego menu:

Main menu of game.

Pytanie

Pytanie brzmi, jak byłoby uzyskać z tej strony do innego w mojej grze?

enter image description here

Chyba masz pomysł. Rozmyślnie utworzyłem menu używając płótna, wiem, że mogłem zrobić menu używając HTML na przykład, ale nie mogę tego zrobić, ponieważ jest to przykład dla uczniów tego, co Canvas może zrobić, co jest dobre i złe itp.

Kodeks

<html> 
<head> 
    <title>Sean Coyne</title> 
</head> 
<body onload="start_game()"> 
<body> 
    <div style id="canvas"> 
     <canvas id="myCanvas" style="border:5px solid #410b11" height="320" width="480"> 
      <p>Your browser does not support HTML5!</p> 
     </canvas> 

     <script type="text/javascript"> 

      //Referencing the canvas 
      var canvas = document.getElementById("myCanvas"); 
      var context = canvas.getContext("2d"); 
      var width = canvas.getAttribute('width'); 
      var height = canvas.getAttribute('height'); 

      //Finding the position of the mouse 
      var mouseX; 
      var mouseY; 

      //Images 
      var bgImage = new Image(); 
      var logoImage = new Image(); 
      var playImage = new Image(); 
      var instructImage = new Image(); 
      var settingsImage = new Image(); 
      var aboutImage = new Image(); 
      var peaceImage = new Image(); 

      var backgroundY = 0; 
      var speed = 1; 

      //Arrays below used for mouse over function 
      var buttonX = [130,110,130,160]; 
      var buttonY = [100,140,180,220]; 
      var buttonWidth = [96,260,182,160]; 
      var buttonHeight = [40,40,40,40]; 

      var peaceX = [0,0]; 
      var peaceY = [0,0]; 
      var peaceWidth = 35; 
      var peaceHeight = 35; 

      var peaceVisible = false; 
      var peaceSize = peaceWidth; 
      var peaceRotate = 0; 

      var frames = 30; 
      var timerId = 0; 
      var fadeId = 0; 
      var time = 0.0; 

      peaceImage.src = "Images/peace.png"; 
      bgImage.onload = function(){ 
       context.drawImage(bgImage, 0, backgroundY); 
      }; 
      bgImage.src = "Images/background.png"; 
      logoImage.onload = function(){ 
       context.drawImage(logoImage, 50, -10); 
      } 
      logoImage.src = "Images/logo.png"; 
      playImage.onload = function(){ 
       context.drawImage(playImage, buttonX[0], buttonY[0]); 
      } 
      playImage.src = "Images/play.png"; 
      instructImage.onload = function(){ 
       context.drawImage(instructImage, buttonX[1], buttonY[1]); 
      } 
      instructImage.src = "Images/instructions.png"; 
      settingsImage.onload = function(){ 
       context.drawImage(settingsImage, buttonX[2], buttonY[2]); 
      } 
      settingsImage.src = "Images/settings.png"; 
      aboutImage.onload = function(){ 
       context.drawImage(aboutImage, buttonX[3], buttonY[3]); 
      } 
      aboutImage.src = "Images/about.png"; 

      timerId = setInterval("update()", 1000/frames); 

      canvas.addEventListener("mousemove", checkPos); 
      canvas.addEventListener("mouseup", checkClick); 

      function update() { 
       clear(); 
       move(); 
       draw(); 
      } 
      function clear() { 
       context.clearRect(0, 0, width, height); 
      } 
      function move(){ 
       backgroundY -= speed; 
       if(backgroundY == -1 * height){ 
        backgroundY = 0; 
       } 
       if(peaceSize == peaceWidth){ 
        peaceRotate = -1; 
       } 
       if(peaceSize == 0){ 
        peaceRotate = 1; 
       } 
       peaceSize += peaceRotate; 
      } 


      function draw(){ 
       context.drawImage(bgImage, 0, backgroundY); 
       context.drawImage(logoImage, 50,-10); 
       context.drawImage(playImage, buttonX[1], buttonY[0]); 
       context.drawImage(instructImage, buttonX[2], buttonY[1]); 
       context.drawImage(settingsImage, buttonX[2], buttonY[2]); 
       context.drawImage(aboutImage, buttonX[3], buttonY[3]); 
        if(peaceVisible == true){ 
        context.drawImage(peaceImage, peaceX[0] - (peaceSize/2), peaceY[0], peaceSize, peaceHeight); 
        context.drawImage(peaceImage, peaceX[2] - (peaceSize/2), peaceY[2], peaceSize, peaceHeight); 
       } 
      } 

      function checkPos(mouseEvent){ 
       if(mouseEvent.pageX || mouseEvent.pageY == 0){ 
        mouseX = mouseEvent.pageX - this.offsetLeft; 
        mouseY = mouseEvent.pageY - this.offsetTop; 
       }else if(mouseEvent.offsetX || mouseEvent.offsetY == 0){ 
        mouseX = mouseEvent.offsetX; 
        mouseY = mouseEvent.offsetY; 
       } 
       for(i = 0; i < buttonX.length; i++){ 
        if(mouseX > buttonX[i] && mouseX < buttonX[i] + buttonWidth[i]){ 
         if(mouseY > buttonY[i] && mouseY < buttonY[i] + buttonHeight[i]){ 
          peaceVisible = true; 
          peaceX[0] = buttonX[i] - (peaceWidth/2) - 2; 
          peaceY[0] = buttonY[i] + 2; 
          peaceX[1] = buttonX[i] + buttonWidth[i] + (peaceWidth/2); 
          peaceY[1] = buttonY[i] + 2; 
         } 
        }else{ 
         peaceVisible = false; 
        } 
       } 
      } 
      function checkClick(mouseEvent){ 
       for(i = 0; i < buttonX.length; i++){ 
        if(mouseX > buttonX[i] && mouseX < buttonX[i] + buttonWidth[i]){ 
         if(mouseY > buttonY[i] && mouseY < buttonY[i] + buttonHeight[i]){ 
          fadeId = setInterval("fadeOut()", 1000/frames); 
          clearInterval(timerId); 
          canvas.removeEventListener("mousemove", checkPos); 
          canvas.removeEventListener("mouseup", checkClick); 
         } 
        } 
       } 
      } 
      function fadeOut(){ 
       context.fillStyle = "rgba(0,0,0, 0.2)"; 
       context.fillRect (0, 0, width, height); 
       time += 0.1; 
       if(time >= 2){ 
        clearInterval(fadeId); 
        time = 0; 
        timerId = setInterval("update()", 1000/frames); 
        canvas.addEventListener("mousemove", checkPos); 
        canvas.addEventListener("mouseup", checkClick); 
       } 
      } 
     </script> 
    </body> 
</html> 
+0

Chciałbym po prostu zastąpić bieżącą kanwę prawą w zależności od wyboru użytkownika ...? – Salketer

+0

Więc użyj wielu kanw ", w zależności od tego, co wybierze użytkownik, pokaż to płótno? – RushFan2112

+0

Debugowanie pytań pomocy wymaga [mcve] zgodnie z [pomocą]. Twój kod nie jest minimalny.Proszę [edytuj] swoje pytanie, aby upewnić się, że Twój kod jest Minimalny (tylko kod niezbędny do odtworzenia problemu w pytaniu), Kompletny (użytkownicy nie potrzebują niczego więcej, aby odtworzyć problem) i Sprawdzalny (podany kod jest odtwarzany) dokładny problem, z którym się spotykasz). Ponieważ Twoje pytanie nie dotyczy tematu Stack Overflow. Zauważ, że jest to również powszechny powód (http://idownvotedyoubecause.com/so/TooMuchCode). –

Odpowiedz

5

Zazwyczaj używam instrukcji switcha wewnątrz pętli draw oraz zmiennej stanu, która przechowuje bieżący stan gry (menu, gra itp.).

Następnie, w oparciu o bieżący stan gry, narysujesz tylko obiekty wymagane dla bieżącej sceny.

coś takiego:

var STATES = { 
    Menu: 0, 
    PauseMenu: 1, 
    Playing: 2 
}; 
var currentState = STATES.Menu; 
... 
function draw() { 
    switch(currentState) { 
    case STATES.Menu: 
     // Draw buttons, etc.. 
    break; 
    case STATES.Playing: 
     // Draw the game screen, the player, etc... 
    break; 
    } 
} 

Gdy użytkownik naciśnie przycisk Play jedyną rzeczą, którą musisz zrobić, to:

function onPlayButtonClick() { 
    currentState = STATES.Playing; 
    // Starting the next frame the new state will be "magically" drawn 
} 

Jeśli nie podoba ci się switch, można utwórz klasę State, która ma metodę draw. Następnie możesz po prostu utworzyć nowe stany, każde z własną metodą rysowania, aw pętli głównej tylko wywołać metodę losowania bieżącego stanu.

To samo dotyczy funkcji update, każdy stan ma swoją własną funkcję aktualizacji (w menu głównym aktualizujesz przyciski lub animujesz różne rzeczy, grając w grę aktualizujesz świat gry i prowadzisz fizykę). Tak więc, w oparciu o aktualny stan, twoja funkcja update jest inna. To zależy od Ciebie, w jaki sposób konstruujesz swój kod i jak wywołujesz różne funkcje w zależności od bieżącego stanu.

+0

To ma sens, dziękuję! – RushFan2112

+0

+1, to jest droga. Połącz to z pętlą gry (aktualizuj, renderuj, itp.) I jest to niezwykle potężne. Edycja: Widzę, że już zaktualizowałeś swoją odpowiedź, aby to uwzględnić, nvm =) – Lewis

+0

Teraz muszę tylko zająć się wdrażaniem tego, co najmniej przez cały dzień haha! – RushFan2112

1

W każdej opcji tekstu, należy utworzyć mniejszą płótnie, tylko z tekstem opcji i dodać „click” zdarzenie z wywołań zwrotnych.

Wskazówka: Nie potrzebujesz kolejnej strony, po prostu skasuj główne płótno i narysuj, co chcesz.

+0

Więc utwórz 4 płótno "dla każdej opcji w menu? – RushFan2112

+0

Tak, jedno zdjęcie dla każdej opcji, a następnie dodaj procedurę obsługi zdarzeń. – mariodiniz