Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mrmccormack/ea3e71dad75ea480aac31e4fe43d7889 to your computer and use it in GitHub Desktop.
Save mrmccormack/ea3e71dad75ea480aac31e4fe43d7889 to your computer and use it in GitHub Desktop.
BALLS&GRAVITY for Portfolio Course
<!-- thanks to Marco Dell'Anna Forked from: https://codepen.io/plasm/details/vxMYEz -->
<div class="title">
<h3>PLASM.it - 2017</h3>
<h1>BALLS<span>&</span>GRAVITY</h1>
<img width="200" src="https://images.vexels.com/media/users/3/140300/isolated/preview/1428f91a3c80fb853dd20bc4f305d5eb-footballer-defencing-ball-by-vexels.png" alt="">
<h3>Drag to interact</h3>
<h4>by Mr. McCormack</h4>
<br>
<a href="https://gist.github.com/mrmccormack/ea3e71dad75ea480aac31e4fe43d7889" target="_blank"> See Mr. M. Gist on Github</a>
</div>
<div class="more-pens">
<a target="_blank" href="https://codepen.io/plasm/" class="white-mode">VIEW OTHER PENS</a>
<a target="_blank" href="https://codepen.io/collection/nZpPbz/" class="white-mode">VIEW OTHER PARTICLES</a>
</div>
let Engine = Matter.Engine,
Render = Matter.Render,
World = Matter.World,
Mouse = Matter.Mouse,
Bodies = Matter.Bodies,
Common = Matter.Common,
Vertices = Matter.Vertices,
Svg = Matter.Svg,
Constraint = Matter.Constraint,
Composites = Matter.Composites,
MouseConstraint = Matter.MouseConstraint;
// create an engine
let engine = Engine.create();
let idRAF = null;
function init(){
let numm = Math.random();
$("canvas").remove();
cancelAnimationFrame(idRAF);
let width = $(window).width();
let height = $(window).height();
let offset = -1;
// module aliases
engine.events = {};
World.clear(engine.world);
Engine.clear(engine);
engine = Engine.create();
engine.world.gravity.x = 0;
engine.world.gravity.y = 0;
let mouseConstraint = MouseConstraint.create(engine);
World.add(engine.world, mouseConstraint);
// create a renderer
let render = Render.create({
element: document.body,
engine: engine,
options: {
wireframes: false,
background: 'transparent',
width: width,
height: height,
showDebug: false,
showBroadphase: false,
showBounds: false,
showVelocity: true,
showCollisions: true,
showSeparations: false,
showAxes: false,
showPositions: false,
showAngleIndicator: false,
showIds: false,
showShadows: false,
showVertexNumbers: false,
showConvexHulls: false,
showInternalEdges: false,
showMousePosition: false
}
});
// create two boxes and a ground
// add all of the bodies to the world
World.add(engine.world, [
Bodies.rectangle(width / 2, height / 2, 70, 46, {
isStatic: true,
render: {
fillStyle: "transparent"
}
}),
Bodies.rectangle(width / 2, (height / 2) - 40, 180, 20, {
isStatic: true,
render: {
fillStyle: "transparent"
}
}),
Bodies.rectangle(width / 2, (height / 2) + 40, 180, 20, {
isStatic: true,
render: {
fillStyle: "transparent"
}
}),
Bodies.rectangle(width / 2, height - offset, width, 1, {
isStatic: true,
render: {
fillStyle: "#FFFFFF"
}
}),
Bodies.rectangle(width / 2, offset, width, 1, {
isStatic: true,
render: {
fillStyle: "#FFFFFF"
}
}),
Bodies.rectangle(offset, height / 2, 1, height, {
isStatic: true,
render: {
fillStyle: "#FFFFFF"
}
}),
Bodies.rectangle(width - offset, height / 2, 1, height, {
isStatic: true,
render: {
fillStyle: "#FFFFFF"
}
})
]);
for (let i = 0; i < 230; i++) {
let radius = 2 + Math.random() * 20
World.add(engine.world, Bodies.circle(
40 + Math.random() * width - 80,
40 + Math.random() * 100,
radius, {
render: {
fillStyle: ["#4285F4", "#EA4335", "#FBBC05", "#34A853"][Math.round(Math.random() * 3)]
}
}
))
}
// run the engine
Engine.run(engine);
// run the renderer
Render.run(render);
let inc = 0
engine.world.gravity.y = 4
function update() {
if(inc > 8){
engine.world.gravity.x = Math.cos(inc / 55)
engine.world.gravity.y = Math.sin(inc / 55)
}
inc++
idRAF = requestAnimationFrame(update.bind(this))
}
update()
}
init()
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
$(window).on("resize", debounce(function(){
init()
}.bind(this), 200))
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdn.rawgit.com/liabru/matter-js/26c12003/build/matter.js"></script>
@import url('https://fonts.googleapis.com/css?family=Montserrat:200,300,400,600')
.more-pens
position: fixed
left: 20px
bottom: 20px
z-index: 10
font-family: "Montserrat"
font-size: 12px
a.white-mode, a.white-mode:link, a.white-mode:visited, a.white-mode:active
font-family: "Montserrat"
font-size: 12px
text-decoration: none
background: #212121
padding: 4px 8px
color: #f7f7f7
&:hover
background: #edf3f8
color: #212121
body
margin: 0
padding: 0
overflow: hidden
width: 100%
height: 100%
background: #EFEFEF
.title
z-index: 10
position: absolute
left: 50%
top: 50%
transform: translateX(-50%) translateY(-50%)
font-family: "Montserrat"
text-align: center
width: 100%
h1
position: relative
color: #121212
font-weight: 600
font-size: 60px
padding: 0
margin: 0
line-height: 1
span
font-weight: 600
padding: 0
margin: 0
color: #BBB
h3
font-weight: 200
font-size: 20px
padding: 0
margin: 0
line-height: 1
color: #121212
letter-spacing: 2px
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment