简体   繁体   English

如何在javascript上创建一个简单的重力引擎

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM