用three.js写一个简单的3D射门游戏

这个小游戏很简单,一共由3个部分构成。1个平面(球场),1个球体(足球)还有一个立方体(球门)。

上个图给你们感受一下简陋的画风(掘金最高上传5M图片,原来图片都太大了压缩后很不清晰)

当按下空格键时,可以开始游戏。开始游戏后,视角会切换到球门正面,并且球门会开始左右移动。你所做的就是把足球踢进移动的球门中。J键是射门键,按下J键不松开,足球右侧会出现一个可以伸缩的黄色条状物... 这是模仿其他游戏里控制射门的力度,越长就代表力量越大。只按J是中路低平球射门,W J是中路高球射门,A J向左地平射门,A W J左高球射门,右侧D键同理。这里简述一下这个游戏是怎么运行的。

力量条控制

首先还是keydown事件监听按键。我们设一个变量strong代表力量大小,初始值为0。然后我们考虑一下,进度条不能无限变大,要设定一个最大值假设为15。 我们先来解决控制进度条伸缩也就是实现让strong从0到15再从15到0然后循环效果。 加一个long()方法和一个short()方法。当然方法里还有其他操作,先略过

        function long(){setTimeout(function(){strong  = 1},100)}function short(){setTimeout(function(){strong -= 1},100)}

一开始我想,当按下J键首先执行long()方法,然后当strong大于等于15的时候,再执行short方法就OK了。类似这样

        switch(e.keyCode){case 74:if(strong>=15){short()}else{long()}break;} 

但是测试的时候发现不行,因为当strong等于15后,执行short(),strong变为14后又会继续执行long()了,实际上strong是先从0变成15,然后14 15 14 15循环。所以这里我增加了一个lock状态,初始值为false。

     switch(e.keyCode){case 74:if(strong>=15){lock = trueshort()}else{lock ? short() : long()}break;} 

当strong大于等于15时,lock变为true, 在short方法里增加当strong为0时,修改lock值为false。

然后我们把strong的变化在页面上表现出来,把立方体Z轴设为strong/100动态改变立方体的高度就行了。

球门和足球的移动

球门的移动是固定速度的,通过改变球门的X,Y,Z轴的位置使球门移动,当球门Y轴位置大于某个值时,让它向右移动。当Y轴位置小于某个值时向左移动。足球的移动原理和球门是一样的,但是我增加了力量对足球速度的影响和足球的转动。足球转动很容易,通过改变rotation即可实现。力量对足球的影响我这里也只是做了一小部门,即力量越大足球飞行速度越快,飞行距离越远。添加一个setInterval方法,在这个方法里声明一个变量times,这个times是用来决定这个setInterval执行多少次的。

        let shootBall = setInterval(function(){time = time   0.5if(time == strong){clearInterval(shootBall)}sphere.rotation.x  = 1;sphere.position.x  = strong/100;},100)

这里可以看出,力量越大,方法执行的次数也就越多,这样飞行距离就会变长。力量越大,每次足球移动的距离也会越大,所以速度就会越快。当然,力量对足球的影响不可能像我设计的这么简单,例如足球从加速到减速的过程就很复杂,我这里就直接忽视了。有兴趣的同学可以想一想怎么实现。

射门方式和碰撞检测

射门的方向和高度是通过组合按键控制的,组合按键也就是加keyStatus实现的,这个在我前一篇介绍中有就不说了。声明一个变量shootType,然后不同的射门方式都有自己独有的shootType,在keyup时间中监听射门键,当松开J键时,判断shootType来控制射门的方式。

碰撞检测呢是通过球门和足球X,Y,Z轴位置判断的。在足球飞行的过程中,如果检测到了碰撞则进球。

附上下载地址https://github.com/leslie233/3D-football

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

100份Spring面试问答-最终名单(PDF下载)

上次更新时间:2019年2月11日 这是有关Spring框架的一些最重要问题的摘要,在面试或面试测试过程中可能会要求您回答这些问题! 您无需担心下一次面试的机会,因为Java Code Geeks在这里为您服务! 您可能会被问到的大多数…

3.1 unittest简介

3.1 unittest简介 前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG。python里面也有单元测试框架-unittest,相当于是一个python版的junit。python里面的单元测试框架除了unittest,还有一个pytest框架,这个用的比较少,后面有空再继…

织梦其他模型使用联动类型地区联动

官方模型的联动类型只能模型是在【独立模型】或者官方默认的【分类信息】模型下使用,其他模型下使用无效,我们来让联动类型支持所有模型。 添加联动地区类型字段 内容模型管理 - 文章模型(或者其他模型) - 添加新字段 字段名称 和 数据类型 千万别搞错了…

使用IntelliJ IDEA进行热部署

最近,在PrimeFaces论坛PrimeFaces IDE Poll中进行了投票,以投票赞成用于开发PrimeFaces应用程序的最佳IDE。 最多人投票支持NetBeans。 NetBeans和Eclipse是免费的IDE。 我最喜欢的IDE IntelliJ IDEA Ultimate不是免费的,我认为这就是为什么在…

创梦天地关嵩:借力腾讯云,打造文娱新生态——云+未来峰会回顾

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 今年腾讯云未来峰会主题的关键词是“焕启”,这是包含无限希望的两个字,让人倍感振奋。“焕启”是什么意思?在我的理解中,“焕启”本身就是激活,激…

【缓存清理工具】缓存清理软件_电脑缓存清理软件

产品介绍 有很多种比如来自网页和windows等,缓存如果不经常清理会使你的机器运行速度变慢,缓存清理工具可以帮你最多程度的清理垃圾文件而且速度也很快,有了它的帮助让你爱机清理彻底,运行更加顺畅!主要能清理:所有应…

c语言转义字符空格符号,C语言 转义符\t占用几个空格

这个问题,在你学习编程过程中可能会考虑到,有时为了字节对齐而使用转义符中\t,但是到底\t占用几个空格呢?下面我们首先通过程序来体验下,然后在总结#include int main(){printf("123456\t123\t45\n");printf("12\t…

[探索] 利用promise做一个请求锁

在最近开发小程序的过程中,遇到一个需求,就是请求的时候header需要带上accessToken, accessToken是通过登陆接口返回的参数,可能会出现过期的情况,则需要重新登陆,所以每次加载小程序都会进行一次本地储存的accessToke…

【Python】[02]初识Python

Python3的下载安装 根据书上的推荐,我将学习和使用Python3版本,从www.python.org网站,根据对应的操作系统,下载合适的Python版本即可 我的是64位系统,所以我选择的是Windows x86-64 executable installer 下载完成后双…

自己写了一个多行文本溢出文字补全的小库, 说不定你会用得到的

有些时候产品会有这么个需求,希望给文章或者帖子给一个摘要,最多3行,或者其它行数,超出3行会补上...。当然这种很简单,用css可以搞定。但是遇上要求多点的产品,希望补上的是...查看全文,这样的话…

C语言简单程序情话,给你一份程序员的“科技情话”,赶在双十一前脱单吧

说起程序员很多人第一印象都是呆板木讷但你们不知道程序员的浪漫花样给你一份程序员的“科技情话”赶在双十一前,和你暗恋的人表白吧~程序员的情书Void missing_you()For(timemeet_you;;time)Missing_you()自从遇见你,就没有一刻不想你-----------------…

记录好用的软件

【摘要】 平时用的很舒服的软件,做个记录,一直更新。 【Snipaste截图】 一般都会用QQ的截图工具,但是现在很少登QQ,Snipaste截图也很好用,只需要按F1即可截图。 【ScreenToGif】 ScreenToGif可以录制屏幕生成Gif文件。…

阿里90后工程师,如何用AI程序写出双11打call歌?

来自阿里巴巴的90后工程师芦阳,用业余时间开发了一套人工智能作词程序——名字叫做MusicGo,这个程序经过芦阳的“喂养”和设定,可以自己写饶舌歌曲。芦阳加入菜鸟也才仅仅四个月,这是他第一次参加双11备战。作为一名新员工&#x…

编程历史

编程历史: 编程语言的历史早于真正意义的计算机的出现。19世纪就有"可编程的"织布机和钢琴弹奏装置出现,它们都是领域特定语言(DSL)的样例。 从1951年2014年,人类一共发明了256种编程语言,每一种语言的出现都带有某些新…

vue结合ueditor富文本编辑器(换肤分离)

需求 (PC端)做一个可以使用图片上传、视频上传、文件上传功能的富文本组件,简单的文本编辑发布功能,采用socket方式传输, 做法 当时看到这个需求,我觉得是不难的,就去github上找富文本编辑器,因为项目比较急,当时我…

使用MyBatis框架时发现的一些小bug

在大配置MyBatis.xml中: 不能有空节点属性 ,否则启动服务器后点击登录没有反应。 异常问题: ause: java.sql.SQLException: Value 0000-00-00 00:00:00 can not be represented as java.sql.Timestamp: 解决办法: HTT…

JSF Tomcat配置示例

JavaServer Faces (JSF)是一个Web应用程序框架,旨在简化基于Web的用户界面的开发集成。 它用于开发和构建服务器端用户界面组件,并在Web应用程序中使用它们。 JSF技术基于Model-View-Controller (MVC)架构,并且通过在页面中使用可重用的UI组件…

JS加密算法简单分析

这次分析百度音乐的评论请求的加密,首先先看包 看到有两个地方1. param,2. sign,基本可以断定sign是用的MD5加密的 那么我们从html页面分析入手,恰巧看到html代码中有写到这么一段 右键点击open in Source panel 熟悉的配方&…

JS 的平凡之路--学习人气眼中的效果(上)

最近看了看人气眼的界面,感觉到学习的地方有很多呀。这里先带大家看看人气值跳动的实现。本篇代码基于Vue2.x.x。 一、概要 首先看一下效果图: 要想实现上面的效果,我们分为这几个部分: 判断元素是否在可视区域内;函数…

[译] Airbnb 在 React Native 上下的赌注(一):概述

原文地址:React Native at Airbnb原文作者:Gabriel Peal译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO1/react-native-at-airbnb.md译者:ALVINYEH校对者:ChenDo…