Git Product home page Git Product logo

mygames's Introduction

Hi there 👋

Why I Love Computer science?

Countless times I have thanked the computer, thankful for its openness, fairness, and tolerance. As long as you are willing to learn, with just one computer and an internet connection, you can gain something, have value. No one can hinder your progress but yourself.

mygames's People

Contributors

akira-cn avatar

Watchers

 avatar  avatar

mygames's Issues

canvas图片爆炸笔记

思考阶段

看到这个动效第一反应感觉到有如下几个需要解决的难点:

  • 1.如何提取一张图片的主题色?
  • 2.爆炸颗粒的生成?
  • 3.爆炸颗粒的起始点及运动轨迹的确定?

片刻思考后,我的结论如下:

1.获取图片主题色:
在前端识别一张图——我的反应是啊哈?抱歉目前超出我的认知范围。关于识别图像,我脑海中只想到高大上的机器学习字样...所以直接从图片中得到各个色值这个方案暂时pass。
另寻出路:既然是图片爆炸,能否,真的写个图片爆炸?别笑我说的不是废话。我的意思是能否不纠结主题色的提取,咱们写个“图片切片”然后爆炸的效果?那么问题来了,怎么把图片切成一块一块的?
解决办法:定义爆炸小球的大小为图片的百分之几,然后每个爆炸小球用div生成,他们的起点确定即按行X个按列Y个依次排布下来的,而每个div的背景即由背景图是原图片按一定数值位移得出。

2.让小球动起来及小球的运动轨迹规划:
让每个小球绝对定位,定时改变其top、left值即可实现小球的运动。其次如火焰般的运动轨迹的实现——拆分成两步,先向四面八方发射爆炸,然后遇到边界碰撞改变方向变得向上运动,在运动的过程中慢慢小球变小变淡。
控制小球的运动:结合物理学的知识,给小球x、y轴向两个方向的速度,和两个方向的加速度,Vx决定left偏移值,Vy决定top偏移值,小球的实际运动轨迹由两个方向的合速度决定。
四面八方发射:判断每个小球的位置与中心点的位置,如果在中心点之下则向下运动,在中心点之右则向右移动。我们以运动方程 x=Vx*t,y=kx+b实现小球各个方向的运动,而斜率k即由小球起始点与矩形中心点连线所定。
碰撞改变方向:边界即是原图边缘,碰撞即反弹变为向上运动。分为三边的碰撞:左、右、下。每个方向的碰撞不一。触碰到底部则直接反弹垂直向上,左边的斜右上反弹,右边的反之。期间为了反弹的随机性,会混合一定的方向偏移值。

是否有更好的实现思路?

结合@chokcoco大佬的实现**和自己最初的想法,有了以下几个方面的思考

  • 小球是由div标签改变css样式生成的小圆,这种生成方式有诸多不变:
    • 起点确定问题:
      • 每次定位需要计算大矩形-小矩形,且通过top和left两个值确定小球位置
    • 运动问题:
      • 小球有一定面积不能视为质点,位置的偏移还会涉及到小球长宽的计算,我们需要的是圆心的定位,每次却通过left和top值判断位置,十分别扭
  • 小球的起始点确定太麻烦,并因此限制了小球爆炸的角度
    • 为什么不所有小球在一个中心点汇合?然后随机360°的角度运动?只要初速度够快肉眼发现不粗来就行。

总结:最大的问题就是定位,通过绝对定位的top和left定位确定小球的方位,且小球占据一定面积不能视为质点,而我们思考的时候又习惯以中心点确定小球位置。一言以蔽之:使用div画圆及涉及小球运动特别不方便。我们需要两种更好的编码体验:面积的确定:能通过pi * r * r的方式计算;定位:可以通过圆心定位。
突破:引入canvas

总结收获

  • 1.一睹canvas的强大,原谅我之前对它力量的一无所知..(使用Canvas的getImageData可获得图片颜色信息)
  • 2.实践了回html5的拖拽,之前的拖拽的实现都是由原生写的
  • 3.该背景下的爆炸小块不同实现方案:
    • 1.背景图片位移
    • 2.主题色提取
      • 2.1从Canvas的getImageData获得的图片颜色中随机选择
      • 2.2基于图像算法提取主题色(colorthief.js使用的是中位切分算法)
  • 4.更好的代码:
    • 借鉴jQuery的链式调用
    • 面向对象编程
    • 代码结构,关于canvas的代码依照其函数功能分为两部分

最后,也许你会感兴趣的

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.