[英]How to create a simple gravity engine on javascript
I'm trying to make a simple animation in javascript using P5.js library. 我正在尝试使用P5.js库在javascript中制作一个简单的动画。 I would like to make a ball appear at some height and then let it fall down and make it bounce until it comes to a stop. 我想让球出现在某个高度,然后让它掉下来让它反弹直到它停止。
I'm not looking for a external library, just P5. 我不是在寻找外部库,只是P5。
My code is this: 我的代码是这样的:
function Ball() { this.diameter = 50; this.v_speed = 5; this.ypos = height/2 - 100; this.xpos = width/2; this.update = function(){ this.ypos = this.ypos + this.v_speed; this.ypos = constrain(this.ypos, this.diameter/2, height-this.diameter/2); } this.show = function(){ ellipse(this.xpos, this.ypos, this.diameter); fill(255); } } var ball; function setup() { createCanvas(600, 600); ball = new Ball(); } function draw() { background(0); ball.update(); ball.show(); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.6.1/p5.js"></script>
Can someone help me? 有人能帮我吗? Thanks a lot 非常感谢
First you have to set the starting speed to 0 and define a gravity: 首先,您必须将起始速度设置为0并定义重力:
this.v_speed = 0;
this.gravity = 0.2;
A working update
method, which can be directly applied to your example, looks like this: 可以直接应用于您的示例的工作update
方法如下所示:
this.starty = height/2 - 100;
this.endy = height-this.diameter/2;
this.update = function(){
this.v_speed = this.v_speed + this.gravity;
this.ypos = this.ypos + this.v_speed;
if (this.ypos >= this.endy){
this.ypos = this.endy;
this.v_speed *= -1.0; // change direction
this.v_speed = this.v_speed*0.9;
if ( Math.abs(this.v_speed) < 0.5 ) {
this.ypos = this.starty;
}
}
}
The key is to reduce the speed and to change the direction when the ball bounces on the ground: 关键是当球在地面上反弹时降低速度并改变方向:
this.v_speed *= -1.0;
this.v_speed = this.v_speed*0.9;
See also Bouncing Balls, struggling with getting more than 1 (processing) . 另见Bouncing Balls,努力获得超过1(处理) 。
See the example, where I applied the suggestions to your original code: 请参阅示例,我将建议应用于原始代码:
function Ball() { this.diameter = 50; this.v_speed = 0; this.gravity = 0.2; this.starty = height/2 - 100; this.endy = height-this.diameter/2; this.ypos = this.starty; this.xpos = width/2; this.update = function(){ this.v_speed = this.v_speed + this.gravity; this.ypos = this.ypos + this.v_speed; if (this.ypos >= this.endy){ this.ypos = this.endy; this.v_speed *= -1.0; // change direction this.v_speed = this.v_speed*0.9; if ( Math.abs(this.v_speed) < 0.5 ) { this.ypos = this.starty; } } } this.show = function(){ ellipse(this.xpos, this.ypos, this.diameter); fill(255); } } var ball; function setup() { createCanvas(600, 600); ball = new Ball(); } function draw() { background(0); ball.update(); ball.show(); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script>
This is pretty simple, here is a working(but crude) way of doing it: 这很简单,这是一种工作(但粗略)的方式:
var velY = 0;
var yPos = 0;
draw = function() {
velY += 0.1;//Make this value higher for stronger gravity.
yPos += velY;
if (yPos > 400) {
velY = -velY;
yPos = 400;
}//This may need a little tweaking.
ellipse(300, yPos, this.diameter);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.