寿司快卖,创建一个运行在电脑,手机及Pad上的多屏游戏

31 篇文章 0 订阅
28 篇文章 0 订阅

本节开始,我们将设计一个养成类游戏。游戏主题是创建一家寿司店,你是主厨,当客户点餐后,你根据菜单配置寿司。我们会先把游戏设计成页面游戏,然后通过不断的调试,将游戏移植到手机以及各类Pad上。

该游戏设计的一个难点是自动适配屏幕,运行在浏览器上时,一般对应着电脑的大屏幕,当运行在手机或者Pad上时,屏幕会变小,因此我们在游戏代码设计时必须要考虑到这一点。

屏幕快照 2018-10-05 下午6.16.38.png

上图就是我们要设计的游戏界面效果,这次游戏设计我们将使用MVC模式,将数据,界面分离开来,同时使用CSS提供的相应功能,我们可以实现游戏界面对运行设备屏幕的自适应调整。按照老样子,我们先搭建游戏的基本框架。首先我们先创建一个VUE项目,这次我们需要使用到一个库叫SouundJS,用来产生声音特效,现在项目根目录中的index.html将所需要使用的库引入:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, minimal-ui">
  <meta name="apple-mobile-web-app-capable" content="yes">
    <script type="text/javascript" src="./static/tweenjs-0.5.1.min.js"></script>
    <script type="text/javascript" src="./static/easeljs-0.7.1.min.js"></script>
    <script type="text/javascript" src="./static/movieclip-0.7.1.min.js"></script>
    <script type="text/javascript" src="./static/preloadjs-0.4.1.min.js"></script>
    <script  type="text/javascript" src="./static/soundjs-0.52.js">
    </script>
    <script type="text/javascript">
      window.createjs = createjs
      window.assetsLib = lib
    </script>
    <title>ShusiShop</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

游戏的主界面将根据屏幕的大小动态调整,当屏幕足够大时,我们将界面所有的组件从左往右全部显示出来,如果是在手机等小屏幕上,那么我们会把主界面放在正中间,其他附带组件放置在下方,或者需要时在弹出来。接下来我们先构造主界面布局,在src/component/目录下创建一个gamecontainer.vue文件,然后添加如下内容:

<template>
  <div>
    <game-scene></game-scene>
  </div>
</template>

<script>
import GameScene from './GameSceneComponent'
export default {
    components: {
      GameScene
    }
  }
</script>

<style scoped>
</style>

上面的GameContainer组件负责加载实现游戏主逻辑的GameSceneComponent组件,起到一个过度作用,在App.vue中做修改,将上面的组件引入:

<template>
  <div id="app">
    <game-container></game-container>
  </div>
</template>

<script>
import GameContainer from './components/gamecontainer'
export default {
  name: 'app',
  components: {
    GameContainer
  }
}
</script>

接着我们在本地目录创建一个gamescenecomponent.vue文本负责游戏主逻辑设计,首先是界面设置代码:

<template>
  <div id="game">
    <div id="status-bar">$23,000</div>
    <div id="customer-view">
      <canvas id="canvas" width ="100" height="100">
      </canvas>
    </div>
    <div id="dishes"></div>
    <div id="sushi-area">
      <div id="ingredients">
        <div class="ingredient" data-type="reice">10</div>
        <div class="ingredient" data-type="salmon-roe">10</div>
        <div class="ingredient" data-type="seaweed">10</div>
        <div class="ingredient" data-type="egg">10</div>
        <div id="phone"></div>
      </div>
      <div id="sushi-board">
        <a id="delete-sushi-btn">Delete</a>
        <div id="others"></div>
        <div id="rices"></div>
        <div id="seaweeds"><div>
      </div>
    </div>
    <div id="recipes">
    <h1>Sushi Recipes</h1>
    <p><img src="./static/images/recipe.png"></p>
    </div>
    <div id="help">
      <h2>About this game</h2>
      <h2>How to play</h2>
      <p>Select ingredients based on the recipes</p>
      <p>Click on customer to serve the dish to him.</p>
    </div>
  </div>

</template>

上面代码先完成了界面的组件布局,接下来我们添加CSS代码,它涉及到屏幕的适配功能:

<style scoped>
  #game {
  width: 100%;
  float: left;
  }
  #recipes {
    float: right;
    width: 100%;
    background: #ACACAC;
  }
  #status-bar {
    background: #D8D8D8;
    border-bottom: 1px solid #979797;
    width: 100%;
    height: 25px;
    line-height: 25px;
    text-align: center;
  }

  #customer-view {
    width: 100%;
    height: 300px;
  }

  #sushi-area {
    background: #9D7335;
    width: 100%;
    height: 250px;
  }

  #sushi-board {
    background: #913030;
    border: 1px solid #979797;
    width: 50%;
    height: 90%;
    float: right;
  }

  #ingredients {
    width: 50%;
    height: 100%;
    float: left;
    padding: 10px;
    overflow: auto;
  }

  .ingredient {
    width: 33%;
    height: 33%;
    background: #D8D8D8;
    border: 1px solid #979797;
    float: left;
  }

  #phone {
    width: 100%;
    height: 20%;
    background: #D8D8D8;
    float: left;
  }

  /*为手机屏幕做调节*/
  @media screen and (max-width: 500px) {
    #ingredients {
      width: 70%;
    }
    #sushi-board {
      width: 30%;
    }
  }

  /*手机横屏时做相应调节*/
  @media screen and (max-device-width: 550px) and (orientation: landscape) {
    #status-bar {
      float: left;
      width: auto;
      padding-left: 3px;
      padding-right: 3px;
      border-right: 1px solid #979797;
    }
    #customer-view {
      height: 100px;
    }
    #sushi-area {
      height: 200px
    }
  }

  /*为Pad类设备做调节*/
  @media screen and (min-width: 800px) {
    #game {
      width: 60%;
    }
    #recipes {
      width: 40%;
    }
  }
</style>

上面代码中注意@media这样的指令,它指导程序根据运行设备的屏幕大小收缩相应页面组件的大小和布置方式。完成了界面布置和适配工作后,我们可以进入到组件逻辑的开发中,首先对组件进行初始化工作,添加代码如下:


<script>
  export default {
    data () {
      return {
        canvas: null
      }
    },
    mounted () {
      this.init()
    },
    methods: {
      init () {
        this.initCustomerView()
        this.initDOMElements()
        this.initResizeHandler()
      },
      resizeCanvas () {
        var customerView = document.getElementById('customer-view')
        this.canvas = document.getElementById('canvas')
        this.canvas.width = customerView.offsetWidth
        this.canvas.height = customerView.offsetHeight
      },
      repositionCustomer () {
        // todo
      },
      initResizeHandler () {
        window.onresize = function () {
          this.resizeCanvas()
          this.repositionCustomer()
        }.bind(this)
        this.repositionCustomer()
      },
      initDOMElements () {
        // ToDo
      },
      initCustomerView () {
        // ToDo
      }
    }
  }
</script>

完成上面代码后,基本场景的设置工作就可以完成了,运行程序,浏览器中会出现类似开头画面,在后续开发中,我们可以基于现在完成的框架代码上继续对游戏进行下一步的设计。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值