效果预览

游戏介绍

● 点击屏幕,根据按住屏幕的时间,进行蓄力,时间越短,发出去的力越小,时间越长,发出去的力越大,超过了最大力,再次从最小里开始,球从篮筐中穿过得1分,否则视为不得分,由于做的是demo,就没有其他限制,可以根据需要尝试修改。

工程结构介绍

● 游戏就1个场景game,所有游戏的元素都放在这个场景上,场景内3D元素主要3个,3个元素都会挂在弹力和摩擦力设置的PhyMat脚本,PhyMat脚本的主要功能就是设置挂在到对应节点上的所有ColliderComponent的弹力和摩擦力。

  • 篮球框,我是直接使用Blake老师提供的3d素材用的,也是直接摆放在场景上的,主要用来添加碰撞,模拟真实投篮效果用的。

● 游戏核心在篮球里,篮球内添加了刚体,因为需要模拟重力效果,添加碰撞体,还有主要的游戏逻辑核心BallCtrl,游戏里的所有核心功能,都在BallCtrl内。

●至于游戏中为什么要自己添加物理材质PhyMat,还有如何添加3D图片的材质,以及需要注意的事项,B老师的视频里都讲的很清楚了,这里就不再赘述。

  修改内容

●主要修改的内容:1.视角调整;2.添加了算分逻辑;3.修改投射角度;4.修改最小最大投掷速度。算分的具体思路是:在篮筐碰撞体正下方放置一个检测是否进球的碰撞体,碰撞体设置小一点,太大了,更容易产生误碰撞,球从篮球框落下的时候,刚好能撞到这个碰撞体,这个需要慢慢调整,本demo里,可能也还有一些问题,可以自行调整。然后检测碰撞体事件,碰撞结束以后,表示得分。

●为了不重复计算,会给篮球添加一个新状态,得分状态,得分检测的碰撞体,在检测到碰撞结束以后,设置为得分状态,下次得分的时候,如果已经是得分状态,就不重复算分。

●球设置有最小最大投掷速度,防止力气过大飞很远,力气很小,球没什么运动距离,这个可以根据观测效果进行调整,为了能够调整投掷力度的大小,到了最大值以后,会重新从最小值开始计算,表现在进度跳上就是,到了最大值以后,又从0往最大值变化。

//------BallCtrl.ts------import { _decorator, Component, Node, systemEvent, RigidBodyComponent, UITransformComponent, Vec3, SpriteComponent, BoxColliderComponent, LabelComponent } from "cc";
const { ccclass, property } = _decorator;enum State{Idle, // 空闲AddForce, // 加力ThrowOut, // 抛出Point, // 得分
}@ccclass("BallCtrl")
export class BallCtrl extends Component {@property(UITransformComponent)private progress: UITransformComponent = null; // 力度显示@property(BoxColliderComponent)private colliderPoint: BoxColliderComponent = null; // 得分碰撞体@property(LabelComponent)private labelPoint: LabelComponent = null; // 得分显示private state: State = State.Idle; // 状态private body: RigidBodyComponent = null; // 刚体private static MIN_SPEED: number = 6; // 最小速度 (7.6,7.5,7.4)private static MAX_SPEED: number = 8; // 最大速度private static ADD_TIME:number = 3; // 加力最长时间private addDelta: number = 0; // 加力时间private growSpeed: number = (BallCtrl.MAX_SPEED - BallCtrl.MIN_SPEED) / BallCtrl.ADD_TIME; // 力变化速度private maxProgress: number = 0; // 最大进度长度值private point: number = 0; // 得分private startPos: Vec3 = null; // 开始位置private testSpeed:number = 7.4;onLoad(): void{this.startPos = cc.v3(this.node.position.x, this.node.position.y, this.node.position.z);this.maxProgress = this.progress.width;this.state = State.Idle;this.body = this.node.getComponent(RigidBodyComponent);this.body.useGravity = false;this.point = 0;this.setPercent(0);        systemEvent.on(Node.EventType.TOUCH_START, this.onTouchStart, this);systemEvent.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);this.colliderPoint.on('onTriggerEnter', this.onTriggerEnter, this);this.colliderPoint.on('onTriggerStay', this.onTriggerStay, this);this.colliderPoint.on('onTriggerExit', this.onTriggerExit, this);}    onTriggerEnter(): void{// cc.log('onTriggerEnter');}onTriggerStay(): void{// cc.log('onTriggerStay');}onTriggerExit():void {if(this.state != State.ThrowOut){return;}this.point++;this.labelPoint.string = `得分:${this.point}`;this.state = State.Point;}setPercent(percent: number): void{this.progress.width = percent * this.maxProgress;}onTouchStart(): void{if(this.state != State.Idle){return;}this.state = State.AddForce;this.addDelta = 0;    }onTouchEnd(): void{if(this.state != State.AddForce){return;}       this.state = State.ThrowOut;this.throwOutBall();}throwOutBall():void{// [7.4, 7.6]let speed: number = BallCtrl.MIN_SPEED + this.addDelta * this.growSpeed;// let speed:number = this.testSpeed;// this.testSpeed += 0.1;cc.log('speed', speed);let r:number = Math.PI / 3;let vy:number = speed * Math.sin(r);let vz:number = -speed * Math.cos(r);this.body.useGravity = true;this.body.setLinearVelocity(cc.v3(0, vy, vz));this.scheduleOnce(this.resetBall.bind(this), 3);}resetBall(): void{this.body.setLinearVelocity(Vec3.ZERO);this.body.setAngularVelocity(Vec3.ZERO);this.body.useGravity = false;this.node.setPosition(this.startPos);this.state = State.Idle;this.setPercent(0);}start (): void {}update (deltaTime: number): void {if(this.state != State.AddForce){return;}this.addDelta += deltaTime;if(this.addDelta > BallCtrl.ADD_TIME){this.addDelta = 0;}// this.addDelta = (this.addDelta > BallCtrl.ADD_TIME)? BallCtrl.ADD_TIME: this.addDelta;let percent: number = this.addDelta / BallCtrl.ADD_TIME;this.setPercent(percent);}
}
//----------PhyMat.ts------------------import { _decorator, Component, Node, RigidBodyComponent, PhysicMaterial, ColliderComponent } from "cc";
const { ccclass, property } = _decorator;@ccclass("PhyMat")
export class PhyMat extends Component {@propertyprivate friction: number = 0; // 摩擦力@propertyprivate restitution: number = 0; // 弹力/* class member could be defined like this */// dummy = '';/* use `property` decorator if your want the member to be serializable */// @property// serializableDummy = 0;onLoad(): void{let comps: Array<ColliderComponent> = this.node.getComponents(ColliderComponent) as Array<ColliderComponent>;let mat = new PhysicMaterial();mat.friction = this.friction;mat.restitution = this.restitution;for(let i = 0; i < comps.length; i++){comps[i].material = mat;}}start () {// Your initialization goes here.}// update (deltaTime: number) {//     // Your update function goes here.// }
}

感谢:

本文转载自 https://mp.weixin.qq.com/s/SBcOnsv9pyIft1QnmdG1lw 这篇文章,这里感谢原作者对于技术的分享。

下载:

本文章源码和资源下载地址

cocos creator实例--Cocos Creator 3D开发 投篮 小游戏相关推荐

  1. 3D跑酷类小游戏开发实战

    今天,带领大家从零开始开发一款完整的3D跑酷类小游戏,主要面向有一定Egret2D开发经验的小伙伴,手把手教你学习EgretPro开发,快速开启您的EgretPro开发之旅. 下面是整个游戏的制作过程 ...

  2. Unity3d C# 开发微信小游戏分享图片、朋友圈等功能实现(含源码)

    广告 通过一段时间的基于minigame-unity-webgl-transform插件的开发,算是稍微完整的一小个游戏已经制作完成,具体大家可以扫码体验一下: 感谢支持!! 前言 之前编写了一篇u3 ...

  3. 如何使用egret开发微信小游戏(一)Hello World

    如何使用egret开发微信小游戏(一)Hello World 微信小游戏上线以来,凭借微信海量的用户,取得了巨大的成功,从跳一跳到大家一起来滑水,从2d游戏到3d游戏,许多游戏开发者都赚的盆满钵满,我 ...

  4. 如何利用C#开发“扫雷”小游戏

    本文详细说明了利用C#语言开发"扫雷"小游戏的开发过程.

  5. 如何不用服务器来开发一个小游戏

    我是代长新,来自上海享物说,主要负责游戏客户端研发. 享物说是一个大家可以互相赠送物品,有趣.不花钱的社区平台.为了创造更好的社区氛围,我们决定通过小游戏来增加社区的趣味性和互动性. <乐享花园 ...

  6. 基于 Blazor 开发五子棋小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  7. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  8. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  9. 微信小游戏申请注册流程+开发微信小游戏类目需要具备条件

    微信小游戏申请注册流程+开发微信小游戏类目需要具备条件 在这里先讲一下,小程序和小游戏前面的注册流程都是一样的,在注册完毕登录小程序后台后选择类目时需要注意一下,我下面讲解的是已经通过认证的服务号进行 ...

最新文章

  1. 前台模板 海豚php_GitHub - cbw1820446/DolphinPHP: 海豚PHP——快速开发框架(基于ThinkPHP5.0.3)...
  2. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签...
  3. 张朝阳:未来文娱重点将拍更多网剧 发展UGC、短视频社交和直播社交
  4. tomcat 启动需要java环境吗?_三分钟教你Windows环境下,如何设置Tomcat随机自动启动?...
  5. 【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码...
  6. angular 点菜_JavaScript实现的select点菜功能示例
  7. priority_queue 优先队列 hdu裸题。
  8. 请求header_Flutter 基于网络请求框架Dio的二次封装
  9. BZOJ1064[NOI2008] 假面舞会
  10. 用 Python 自制成语接龙小游戏!
  11. Linux gzip 压缩/解压 详解
  12. 期权定价公式的推导(欧式)
  13. 2019年云计算发展趋势如何 怎么加入云计算行业
  14. 拉卡拉做社区电商,有这些优劣势
  15. JSON parse error: Unrecognized field “abc“ (class cn.kk.xxxDto), not marked as ignorable;
  16. 实现iframe嵌套bilibili视频
  17. 工作笔记:TrueCrypt编译记录
  18. nginx controller 自定义头
  19. App软著申请过程全记录
  20. qt中文转字节_QT字符编码转换,可用于中文内码传输

热门文章

  1. r5 5600g和i5 12400f哪个好 锐龙r55600g和酷睿i512400f对比
  2. 原生JS的拖拽属性draggable(详解)
  3. esxi 自动给虚拟机打快照(定时快照任务)
  4. Cobalt Strike的多种上线提醒方法
  5. Python使用飞书群机器人发送消息
  6. 传微软2.5亿美元收购输入法应用SwiftKey
  7. 嵌入式Linux驱动笔记(二十七)------中断子系统框架分析
  8. SunOS与Solaris
  9. Android音视频分离和合成
  10. 【转载】discuz自定义表情包