- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用processing java 库使用牛顿物理学模拟球在两堵墙之间弹跳;水平速度是一个常数,因为没有加速度。我让模拟正常工作,但我想指定地板的高度。然而,在我的方程中,当我尝试在球距离屏幕底部 10 像素时改变方向时,每次弹跳后,球都会越来越低到“地板”下方。如果我将地板提高到 >20 像素,球不会停止,而是无限期地弹跳。这是相关代码:请注意,处理的坐标系从顶部开始,向下和向右运行。感谢您提前提供的帮助。
public class Testing extends PApplet {
boolean inFloor=false;
float xPosition=500;
float yPosition=200;
float xVelocity=25;
float yVelocity=-80.0f;
float yAccelleration=+10.0f;
float elasticity=0.80f;
public void setup (){
size(displayWidth,displayHeight);
noStroke();
ellipseMode(RADIUS);
frameRate(35);
}
public boolean sketchFullScreen() {
return true;
}
public void draw(){
background(0);
//Changes direction of motion when hitting a wall
if(xPosition>=displayWidth||xPosition<0){
xVelocity=-xVelocity;
}
//supposed to change direction of motion when the ball hits the floor
if(yPosition>=displayHeight-20){
yPosition=(displayHeight-20);
yVelocity=-(yVelocity)*elasticity;
if(yVelocity>=-1 && yVelocity<=0){
xVelocity=xVelocity*elasticity;
yVelocity=0;
yAccelleration=0;
}
}
else{
yVelocity=yVelocity+yAccelleration;
}
yPosition=yVelocity+yPosition;
xPosition=xPosition+xVelocity;
ellipse(xPosition,yPosition,10,10);
}
编辑:这可能是时间问题吗?
编辑:感谢您的所有回复。不幸的是我不能投票给他们中的任何一个(只有 6 名代表)。我结合了 @tobius_k 的答案、@Roberto_Mereghetti 的答案和 OpenProcessing.org 中的一些示例代码。这就解决了它。在下面提供的解决方案中,由于 Canvas 以像素(整数值)为单位进行测量,因此使用浮点来指定坐标会导致处理中的图形故障。因此,我实现了一个系统,其中浮点值被四舍五入,小数值被添加到累加器(“xRounder”和“yRounder”),当大于-1或1时,四舍五入并添加到球的当前位置。这给了我发言权!
最终代码:
import processing.core.*;
//import processing.xml.*;
import java.applet.*;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;
import java.awt.event.FocusEvent;
import java.awt.Image;
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.util.zip.*;
import java.util.regex.*;
public class Testing extends PApplet {
int xPosition=500;
int yPosition=200;
float xRounder=0;
float yRounder=0;
float xVelocity=25;
float yVelocity=-80.0f;
float yAccelleration=+10.0f;
float elasticity=0.80f;
public void setup (){
size(displayWidth,displayHeight);
noStroke();
ellipseMode(RADIUS);
frameRate(15);
}
public boolean sketchFullScreen() {
return true;
}
/* (non-Javadoc)
* @see processing.core.PApplet#draw()
*/
public void draw(){
background(0);
yPosition=round(yVelocity)+yPosition;
yRounder+=(yVelocity-round(yVelocity));
xPosition=round(xVelocity)+xPosition;
xRounder+=(xVelocity-round(xVelocity));
if(xRounder>=1||xRounder<=-1){
xPosition=xPosition+round(xRounder);
xRounder=xRounder-round(xRounder);
}
if(yRounder>=1||yRounder<=-1){
yPosition+=round(yRounder);
yRounder=yRounder-round(yRounder);
}
if(yPosition>displayHeight-50 && yVelocity>0){
yPosition=displayHeight-50;
yVelocity=-(yVelocity)*elasticity;
xVelocity=xVelocity*elasticity;
}
if(xPosition>=displayWidth||xPosition<0){
xVelocity=-xVelocity;
}
yVelocity=yVelocity+yAccelleration;
ellipse(xPosition,yPosition,10,10);
}
static public void main(String args[]) {
PApplet.main(new String[] { "--bgcolor=#ECE9D8", "Testing" });
// new Testing().setVisible(true);
}
}
最佳答案
我不是 100% 确定,但我认为,当球实际到达底线下方几个像素时,通过将球重置到底线,您可以精确地补偿弹性系数,以便球无限期地弹跳。
尝试删除行yPosition=(displayHeight-20);
,然后它应该工作得更好。
这样,球最终会静止下来,但这仍然不正确,因为球落入地面的时间根本没有被计算在内。
更新 好的,我想现在我已经明白了。以下是相关内容:
// first update position, then update velocity
yPosition=yVelocity+yPosition;
if (yPosition >= floor) {
// invert velocity and position w/ elasticity applied
yVelocity = -yVelocity * elasticity;
yPosition = floor - (yPosition - floor) * elasticity;
}
if(Math.abs(yVelocity) <= 2 && Math.abs(yPosition - floor) <= 2){
// stop everything when close to rest
yPosition=floor;
yVelocity=0;
} else {
// otherwise accelerate, even after bounce
yVelocity=yVelocity+yAccelleration;
}
所以主要的变化是你的代码是:
这是它的样子(下限为 500)。不完美,但接近。
更新 2:刚刚发现 this Processing example ,这实际上非常接近您的原始代码,不同之处在于它们总是应用加速,并且它们在碰撞检查之前这样做。看来仅此一点就可以解决问题。
关于java - 加工重力(楼层),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340511/
例如,如果我想记录我按下了 b 键并想记录按下该键的时间长度,我该怎么做? 最佳答案 处理起来 super 简单。看看keyPressed()和 keyReleased() . // create a
我正在为编程课创建一个突破游戏。 import processing.serial.*; //sets the conditions for winning int lose = 1; boolean
有人可以告诉我为什么我会收到此错误吗?基本上这是一个我想模拟基本植物生长的程序。我想以这样的方式做到这一点:花瓣都存储在一个圆圈数组中。 Stem myStem; Circle circles; fl
我想知道如何更改以下代码,以便将形成花瓣的圆圈存储在数组中。所以我可以在另一个函数中使用它。 void setup() { size(400, 400); smooth(
我编写了这段代码来创建速写本。 我确定这是一个简单的错误,但为什么它不会在图像结束时停止播放? 这是代码 import ddf.minim.spi.*; import ddf.minim.si
我的start-yarn.sh无法启动resourcemanager和nodemanager进程 如前所述,我在yarn-env.sh脚本中设置了这些选项。 export YARN_RESOURCEM
我试图让我的粒子系统一个接一个地生成粒子,而不是同时生成所有粒子。我的代码目前将立即生成所有 100 个粒子。 我没有尝试太多,因为我是编码新手。 我有一个设置,可以调用并更新我的粒子类,以及一个包含
我正在尝试为这个程序制作一个重置按钮,我到处都找过了,但找不到有效的方法。我试图在游戏结束时,当你输了时,你按“重新启动”,游戏将从草图的开头开始。该程序工作正常,但一旦按下“重新启动”按钮,我会在控
我有一个移动图像作为背景 PImage background; int x=0; //global variable background location rocket Rocket; void s
我有一个移动图像作为背景 PImage background; int x=0; //global variable background location boolean up; boolean d
我的 Enemy 变量在 GameScene 函数中不“存在”。我正在尝试制作一个正在处理的游戏,但由于某种原因,当我尝试访问一个类时,我收到错误消息“x 无法解析或不是一个字段”,我将在下面发布我的
我正在创建一个程序,通过采用以下输入来计算一顿饭的总费用:meal_cost,tax_rate,tip_rate,number_eating 并通过函数调用将它们打印在字符串中。我查看了 StackO
首先,本文不涉及表单验证(javascript),而是有关数据库约束的验证。 当我通过添加表单添加数据时,由于我在创建数据库时已初始化的数据库限制(例如复制主键),在某些情况下数据库将不会更新。在这种
我是一名优秀的程序员,十分优秀!