HTML5 Game (Canvas) - UI Techniques?

前端 未结 3 1731
遥遥无期
遥遥无期 2020-12-31 14:05

I\'m in the process of building a JavaScript / HTML5 game (using Canvas) for mobile (Android / iPhone/ WebOS) with PhoneGap. I\'m currently trying to design out how the UI a

相关标签:
3条回答
  • 2020-12-31 14:19

    I do not think that there is a "standard" for this. It highly depends on your UI. I think using the DOM elements is better in most cases, since you do not need to build all of the UI components, events, etc. yourself. They can be styled with CSS to achieve the desired look. If this is not enough, you'll probably need to build the interface elements yourself, but you should make sure that this is really needed. It is probably a huge amount of work to roll your own solution.

    0 讨论(0)
  • 2020-12-31 14:30

    You can do it a million ways. However you feel most comfortable and your engineers feel most confident.

    If you're looking for inspiration or a code example, here's one way that I do it. I have a function that repeatedly draws a menu until a button is pressed. When the button is pressed, the game loads and the old menu click event listeners are removed and new game click event listeners are added. I also end the old draw loop of the menu and start a new game draw loop. Here's some selected snippets to give you the idea of how its done:

    Game.prototype.loadMenu = function() {
      var game = this;
      var can = this.canvas;
    
      // now we can use the mouse for the menu
      can.addEventListener('click', game.menuClickEvent, false);
      can.addEventListener('touchstart', game.menuClickEvent, false);
    
      // draw menu
      this.loop = setInterval(function() { game.drawMenu() }, 30);
    };
    
    Game.prototype.drawMenu = function() {
      // ... draw the menu
    }
    
    Game.prototype.loadLevel = function(levelstring) {
      // unload menu
      var can = this.canvas;
      var game = this;
      can.removeEventListener('click', game.menuClickEvent, false);
      can.removeEventListener('touchstart', game.menuClickEvent, false);
    
      if (this.loop) clearInterval(this.loop);
    
      // ... other level init stuff
    
    
      // now we can press keys for the game
      //can.addEventListener('click', game.gameClickEvent, false);
      can.addEventListener('touchstart', game.gameClickEvent, false);
      can.addEventListener('keydown', game.gameKeyDownEvent, false);
    
      this.loop = setInterval(function() { game.tick() }, 30);
    }
    
    // called from tick()
    Game.prototype.draw = function(advanceFrame) {
      // ...
    }
    

    This way I'm able to separate out game drawing and game events from menu drawing and menu events. It also gives me leeway to use game/animation elements in my menus should I want to make them look real pretty.

    (I posted this at the twin gamedev discussion too)

    0 讨论(0)
  • 2020-12-31 14:34

    Try this :

    With Visual js you can setup page like this :

    Visual-JS multiplatform game engine windows GUI - source editor

    OnPage editor - for design

    You will get :

    *99% canvas 2d

    Add new object

    Create webcam component (nui or normal)

    Create coallision (basic - rect)

    Create textBox (virtual keyboard for mobile)

    Create particle

    Atach player (basic movement)

    MultipEER (Networking)*

    localStarage

    App created from visual js always work on all browsers(mobile / desktop). Networking - webRTC - multipeer

    Try online at : https://jsfiddle.net/user/zlatnaspirala/fiddles/

    Api look like this :

    Application Programming Interface Documentation for Visual JS 0.5 >

    GAME_OBJECT is main object in this framework.

    1) Adding new game object (name will be 'GO' ):   
    
    HELLO_WORLD.ENGINE.MODULES.ACCESS_MODULE("STARTER").NEW_OBJECT("GO" ,
    x , y , w , h , speed )
    
    HELLO_WORLD.ENGINE.MODULES.ACCESS_MODULE("STARTER").NEW_OBJECT( "GO" ,
    45   , 45 , 10 , 10 , 10)
    
    
    // 2) Adding image or animation : 
    
    // DRAW TYPE can be   // 'DRAW_FRAME' no animation   // 'LOOP' playing
    animation  // this number '1111123123' is ID  can be any number 
    //ANIMATION (  surf ,TYPE_, FrameIndex ,source , PARENT , ID , blink_
    , min_ , max_ , step , speed_ , opacity_  )
    HELLO_WORLD.ENGINE.MODULES.ACCESS_MODULE("STARTER").GAME_OBJECTS.ACCESS("GO").CREATE_ANIMATION(
    SURF , "DRAW_FRAME" , 6 , RESOURCE.Tiles  , 1111123123 , "no" ,
    1,11,1,1,1) 
    
    
    3)Disable draging   GO.DRAG = false;
    
    //  RESOURCE.NAMEOFFOLDERANIMATION
    
    add folder "Tiles"  with images in folder /res/ and run node res.js   
    
    // refresh page and you will get
    
    RESOURCE.Tiles ready for use !   
    // MAKE MODULE ACCESS EASY  var
    
    STARTER = HELLO_WORLD.ENGINE.MODULES.ACCESS_MODULE("STARTER");    
    
    STARTER.GAME_OBJECTS.ACCESS("GO").CREATE_ANIMATION( SURF ,
    "DRAW_FRAME" , 6 , RESOURCE.Tiles  , 1111123123 , "no" , 1,11,1,1,1) 
    
    
    //DRAG initial value is true GO.DRAG = false;
    //setup quard height  =  width  GO.POSITION.DIMENSION.H = GO.POSITION.DIMENSION.W;
    
    4) EVENTS  FOR MOUSE AND MOBILE TOUCH HANDLED
    //CLICK OR TOUCH START  GO.TAP = function(){  
    
    //this make point directing to the game object instance   
    //  this.NAME or this.ANIMATION.CURRENT_FRAME   };
    
    
    GO.TOUCH_DOWN = function(){  
    
    STARTER.DESTROY_OBJECT("GO")        console.log("THIS MUST BE TERMINATED
    ON MOUSE DOWN or TOUCH_DOWN  : " + this.NAME);
    //this.DESTROY_ME_AFTER_X_SECUND( 100 );    //console.log("THIS MUST BE
    TERMINATED ON CLICK : " + this.NAME);      };
    
    GO.TOUCH_MOVE = function(){  
    console.log("HOVER ON OBJECT OR MOBILE TOUCH_MOVE  : " + this.NAME);   };
    
    GO.TOUCH_UP = function(){  
    console.log("MOUSE UP ON OBJECT OR MOBILE TOUCH_UP  : " + this.NAME);   };*
    

    Download git

    0 讨论(0)
提交回复
热议问题