首页 > 其他分享 >实现小球在弹射前的拉伸特效和动态障碍物特效

实现小球在弹射前的拉伸特效和动态障碍物特效

时间:2023-06-14 11:37:02浏览次数:25  
标签:特效 鼠标 拉伸 fixDef 小球 箭头 obstacle var


当前我们实现小球弹射时,会先用鼠标点击小球,然后移动鼠标,当松开鼠标时,小球会弹射向鼠标松开的位置。我们按住小球的时间越长,小球弹射的力度就越大,但有一个问题是,玩家并不知道,当前施加在小球上的推力有多大,这节我们就增加一个动画功能,当玩家在小球上点击鼠标时,小球前方会出现一个变动着的箭头,箭头的红色部分越多,表明小球被施加的推力就越大,我们实现功能后,效果如下:

当鼠标在小球身上按下时,有一个箭头出现在小球旁边,箭头的指向根据鼠标的移动来变化,箭头中的红色块根据鼠标按下的时间长短而变化,鼠标按下时间越长,红色块就越长,它表示作用在小球上面的力度就越大。

我们看看相关代码的实现,首先对canvas控件的属性做些修改:

<script>
canvas {
  position: absolute;
  top: 0;
  left: 0;
  border: 1px solid black;
}
</script>

我们把原来在canvas前面的井号去掉,这样两个canvas控件就会重叠在一起。接着我们引入箭头的资源库,在index.html中增加如下代码:

<script  type="text/javascript" src="./static/assets.js">
    </script>
    <script type="text/javascript">
      window.createjs = createjs
      window.Box2D = Box2D
      window.assetsLib = lib
    </script>

assets.js是资源库,我们在页面上绘制的箭头就是从这个库中获得的。接下来在控件初始化时,将资源加载到页面里:

init () {
....
// change 1 引入资源库
        this.assetsLib = window.assetsLib
        this.initPowerIndicator()
}

然后添加代码,实现箭头图片的显示,以及箭头能根据鼠标的移动来转动:

// change2 加载箭头图片资源
      initPowerIndicator () {
        this.power = new this.assetsLib.PowerArrow()
        this.stage.addChild(this.power)
        this.power.visible = false
      },
      showPowerIndicator (x, y) {
        this.power.visible = true
        this.power.x = x
        this.power.y = y
      },
      hidePowerIndicator () {
        this.power.visible = false
      },
      rotatePowerIndicator (rotation) {
        this.power.rotation = rotation
      },
      updatePowerBar (value) {
        this.power.powerBar.scaleY = Math.min(30, value)
      }
    }

上面代码实现了箭头图片的加载和旋转,接着我们修改鼠标消息响应函数,让箭头在小球被点击时出现,并且跟着鼠标的移动而转动:

stageMouseDown (e) {
        if (!this.isPlaying) {
          console.log('mouse down return')
          return
        }
        // change 3
        var position = this.ballPosition()
        this.showPowerIndicator(position.x, position.y)
        var rotation = this.launchAngle(e.stageX, e.stageY)
        this.rotatePowerIndicator(rotation * 180 / Math.PI)
        this.tickWhenDown = this.cjs.Ticker.getTicks()
        this.updatePowerBar(0)
      },
      stageMouseUp (e) {
        if (!this.isPlaying) {
          return
        }
        // change 4
        this.hidePowerIndicator()
        this.tickWhenUp = this.cjs.Ticker.getTicks()
        var ticksDiff = this.tickWhenUp - this.tickWhenDown
        this.shootBall(e.stageX, e.stageY, ticksDiff)
        // 发射后500毫秒再生成一个小球
        setTimeout(this.spawnBall, 500)
      },
      // change 5
      stageMouseMove (e) {
        if (!this.isPlaying) {
          return
        }

        var rotation = this.launchAngle(e.stageX, e.stageY)
        this.rotatePowerIndicator(rotation * 180 / Math.PI)
      },
update () {
        this.world.Step(1 / 60, 10, 10)
        if (this.shouldDrawDebug) {
          this.world.DrawDebugData()
        }

        this.world.ClearForces()

        // change 7
        var ticksDiff = this.cjs.Ticker.getTicks() - this.tickWhenDown
        this.updatePowerBar(ticksDiff)
      },

添加完上面代码后,加载页面,点击小球是就可以看到箭头动画了。接下来我们添加代码,为游戏添加一个十字架障碍物,代码如下:

// change 10
      createCross (obstacle) {
        var bodyDef = new this.B2BodyDef()
        var fixDef = new this.B2FixtureDef()

        fixDef.density = 0.2
        fixDef.friction = 0.5
        fixDef.restitution = 0.2
        // 绘制一个交叉十字架物体
        bodyDef.type = this.B2Body.b2_dynamicBody
        bodyDef.position.x = obstacle.position.x / this.pxPerMeter
        bodyDef.position.y = obstacle.position.y / this.pxPerMeter
        fixDef.shape = new this.B2PolygonShape()
        fixDef.shape.SetAsBox(obstacle.length / this.pxPerMeter, obstacle.width / this.pxPerMeter)

        var cross = this.world.CreateBody(bodyDef)
        cross.CreateFixture(fixDef)
        fixDef.shape.SetAsBox(obstacle.width / this.pxPerMeter, obstacle.length / this.pxPerMeter)
        cross.CreateFixture(fixDef)
        // 在交叉处添加一个小圆圈
        bodyDef.type = this.B2Body.b2_staticBody
        fixDef.shape = new this.B2CircleShape(10 / this.pxPerMeter)
        var circle = this.world.CreateBody(bodyDef)
        circle.CreateFixture(fixDef)
        console.log('create cross:', this.B2RevoluteJointDef)
        var revoluteJointDef = new this.B2RevoluteJointDef()
        revoluteJointDef.bodyA = cross
        revoluteJointDef.bodyB = circle
        revoluteJointDef.collideConnected = false

        revoluteJointDef.maxMotorTorque = obstacle.maxTorque
        revoluteJointDef.motorSpeed = obstacle.motorSpeed
        revoluteJointDef.enableMotor = obstacle.enableMotor

        this.world.CreateJoint(revoluteJointDef)
      }

上面代码构造了两个长方体,并将长方体交叉重叠,在交叉处再绘制一个圆形作为固定两个长方体的连接点,最后我们使用B2RevoluteJointDef类把两个长方体和一个圆形结合起来,形成一个整体,最后我们在createObstacles函数中添加调用上面函数的代码:

createObstacles (level) {
   ....
    if (o.type === 'rect') {
            fixDef.shape = new this.B2PolygonShape()
            fixDef.shape.SetAsBox(o.dimension.width / this.pxPerMeter, 
           o.dimension.height / this.pxPerMeter)
            body = this.world.CreateBody(bodyDef)
            body.CreateFixture(fixDef)
          }
          // change 11
          if (o.type === 'cross') {
            this.createCross(o)
          }
}

接着我们生成用于构建十字架障碍物的关卡数据:

levels: [
....
    { // change 12
            hoopPosition: {x: 50, y: 160},
            ballName: 'SlowBall',
            ballPosition: {x: 350, y: 250},
            ballRandomRange: {x: 80, y: 80},
            obstacles: [
              {
                type: 'cross',
                graphicName: 'cross',
                position: {x: 165, y: 140},
                length: 60,
                width: 10,
                enableMotor: true,
                maxTorque: 25,
                motorSpeed: 3.0
              }
            ]
    }
}

然后我们在初始化时,将currentLevel指向上面的数据就大功告成了:

init () {
    ....
    this.currentLevel = this.levels[3]
}

完成上面代码后我们可以看到如下效果:


上图中红色的十字架障碍物是不断转动的。

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


标签:特效,鼠标,拉伸,fixDef,小球,箭头,obstacle,var
From: https://blog.51cto.com/u_16160261/6476515

相关文章

  • VUE游戏开发:使用Box2D模拟球体的飞行和撞击特效
    本节,我们将利用Box2d引擎在页面中实现球体飞行和撞击效果。在现实中我们向外抛出一个球时,它在重力加速度的情况下会飞出一个弧线,撞到物体后它会反弹折射,我们利用Box2D可以在页面里模拟这些特性。我们将在页面里绘制一个小球,然后设置一些障碍物,我们用鼠标控制小球向外抛出的方向,小球......
  • 直播源码app开发技术特效功能的实现
    网络时代的发展使得直播源码app平台日渐火爆,抖音就是这些火爆的直播源码app平台的其中之一。大家在使用抖音看直播时有没有看见过这样的情况,在某一个直播间里,正在直播的人的脸在屏幕中会变长变宽,甚至是变得扭曲,或者是那个人会带上西瓜贴纸等其他水果贴纸,又或是在屏幕上看见动漫人物......
  • 偷了一个鼠标特效
    js文件地址https://blog-static.cnblogs.com/files/Mxy-cnblog/mouse.min.js可以新建js文件存放到自己的博客园文件里防止源文件被删除*该文件依赖于Jquery使用方法$.shuicheMouse({type:12,color:"rgba(187,67,128,1)"})......
  • H.265流媒体视频播放器EasyPlayer在ios设备上播放出现画面拉伸情况的优化
    EasyPlayer流媒体视频播放器可支持H.264与H.265,性能稳定、播放流畅,能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放,并且已实现网页端实时录像、在iOS上实现低延时直播等功能。在EasyPlayer的使用过程中,有用户反馈,在ios设备中播放视频出现了画面被强制拉伸并且无法调整至......
  • H.265流媒体视频播放器EasyPlayer在ios设备上播放出现画面拉伸情况的优化
    EasyPlayer流媒体视频播放器可支持H.264与H.265,性能稳定、播放流畅,能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放,并且已实现网页端实时录像、在iOS上实现低延时直播等功能。在EasyPlayer的使用过程中,有用户反馈,在ios设备中播放视频出现了画面被强制拉伸并且无法调整至标准......
  • 变老特效软件,变老特效软件分享!​
    变老特效软件,变老特效是一种特殊效果,通过化妆、服装、道具等手段,使得演员或模特在外表上呈现出老化的状态。这种特效常常被应用于电影、电视剧等影视作品中,以增强角色的真实感和戏剧性,当然现在用软件也是可以操作出来了哦,下面小编就给大家分享几款软件吧!选择:智能修复老照片这是一款......
  • NUKE14 mac版电影后期特效合成软件功能强大、速度快
    NUKE14是一款电影后期特效合成软件,功能强大、速度快,拥有非常专业的后期效果。NUKE14Mac版是一款功能强大的电影后期特效合成软件,提供多种强大的电影后期处理效果,包括电影、动画、漫画、建筑等。可以将多个独立的视频文件合并成一个文件;或者将单个文件组合到一起;或者把两个或......
  • 线上初赛1——小球识别
    线上初赛1——小球识别本文转载自python下用OpenCV的圆形检测-CosmosbipinnatusCav-博客园(cnblogs.com)一、简介​ 对于圆形物体识别问题,opencv提供了大量方法。二、检测步骤2.1读取图像调用imread函数即可。img=cv.imread('ball.png')cv.imshow('image',img)......
  • PS特效
    PS制作电影魔法特效[url]http://www.fevte.com/tutorial-7499-1.html[/url]ps教程,如何做特效大片效果[url]https://jingyan.baidu.com/article/76a7e409e7b077fc3b6e151f.html[/url]多图合一,利用溶图技巧把多张图片合成一张奇幻风格图片[url]http:/......
  • Android系统联系人全特效实现(下),字母表快速滚动
    其实ListView本身是有一个快速滚动属性的,可以通过在XML中设置android:fastScrollEnabled="true"来启用。包括以前老版本的Android联系人中都是使用这种方式来进行快速滚动的。效果如下图所示:[img]http://dl2.iteye.com/upload/attachment/0088/8223/48aec4c5......