2016-03-22 19 views
6

Vấn đềtrang khác nhau trong một trò chơi vải

tôi đang tạo ra một trò chơi bằng cách sử dụng HTML5 Canvas, các trò chơi có một menu chính, menu chính có nhiều nút để bạn lựa chọn. Tôi thấy khó khăn và khó hiểu như thế nào, ví dụ nếu người dùng nhấn nút 'Phát' để hiển thị trò chơi. Dưới đây là hình ảnh của menu chính:

Main menu of game.

Các Câu hỏi

Câu hỏi đặt ra là làm thế nào tôi sẽ nhận được từ trang này sang trang khác trong trò chơi của tôi?

enter image description here

Tôi nghĩ bạn có ý tưởng. Tôi cố tình tạo trình đơn bằng cách sử dụng canvas, tôi biết tôi có thể tạo menu bằng cách sử dụng HTML, nhưng tôi không thể làm ví dụ này cho sinh viên về Canvas có thể làm gì, tốt và xấu, v.v.

<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

Tôi chỉ đơn giản là thay thế các canva hiện tại với một trong những quyền tùy thuộc vào sự lựa chọn của người dùng ...? – Salketer

+0

Vì vậy, sử dụng nhiều canvas ', tùy thuộc vào những gì người dùng chọn, hiển thị canvas đó? – RushFan2112

+0

Các câu hỏi trợ giúp gỡ lỗi yêu cầu [mcve] theo [help]. Mã của bạn không phải là tối thiểu.Vui lòng [sửa] câu hỏi của bạn để đảm bảo rằng mã của bạn là Tối thiểu (chỉ có mã cần thiết để tạo lại vấn đề của bạn trong câu hỏi của bạn), Hoàn thành (người dùng không cần bất kỳ điều gì khác để tạo lại vấn đề của bạn) và Xác minh (mã được cung cấp sinh sản) vấn đề chính xác bạn đang gặp phải). Vì nó là câu hỏi của bạn là off-topic cho Stack Overflow. Lưu ý rằng đây cũng là một lý do phổ biến [downvote] (http://idownvotedyoubecause.com/so/TooMuchCode). –

Trả lời

5

Điều tôi thường làm là có bảng chuyển đổi bên trong vòng lặp draw và biến trạng thái giữ trạng thái trò chơi hiện tại (menu, đang phát, v.v ...).

Sau đó, dựa trên trạng thái trò chơi hiện tại, bạn chỉ vẽ các đối tượng cần thiết cho cảnh hiện tại.

Something như thế này:

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; 
    } 
} 

Khi người dùng nhấn vào nút Play điều duy nhất bạn phải làm là:

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

Nếu bạn không thích câu lệnh switch, bạn có thể tạo một lớp State có phương thức draw. Sau đó, bạn chỉ có thể tạo các trạng thái mới, mỗi trạng thái có phương thức vẽ riêng và trong vòng lặp vẽ chính chỉ gọi phương thức vẽ của trạng thái hiện tại.

Cùng chức năng update, mỗi trạng thái có chức năng cập nhật riêng (trong menu chính bạn cập nhật nút hoặc hoạt ảnh, trong khi chơi trò chơi bạn cập nhật thế giới trò chơi và chạy vật lý). Vì vậy, dựa trên trạng thái hiện tại, hàm update của bạn thực sự khác. Đó là vào bạn cách bạn cấu trúc mã của bạn và cách bạn gọi các hàm khác nhau dựa trên trạng thái hiện tại.

+0

Điều này có ý nghĩa rất nhiều, cảm ơn bạn! – RushFan2112

+0

+1, đây là con đường để đi. Kết hợp điều này với một vòng lặp trò chơi (cập nhật, render, vv) và điều này là vô cùng mạnh mẽ. Chỉnh sửa: Tôi thấy bạn đã cập nhật câu trả lời của bạn để bao gồm này, nvm =) – Lewis

+0

Bây giờ tôi chỉ có để có được vòng đầu của tôi thực hiện điều này, atleast ive có tất cả các ngày haha! – RushFan2112

1

Trong mỗi tùy chọn văn bản, bạn nên tạo Canvas nhỏ hơn, chỉ với văn bản tùy chọn và thêm sự kiện 'nhấp' với cuộc gọi lại.

Mẹo: Bạn không cần một trang khác, chỉ cần xóa canvas chính và vẽ những gì bạn muốn.

+0

Vì vậy, tạo 4 canvas 'cho mỗi tùy chọn trong menu? – RushFan2112

+0

Có, một canvas cho mỗi tùy chọn và sau đó thêm trình xử lý sự kiện. – mariodiniz

Các vấn đề liên quan