java – 绘制的形状在停止后保持振动
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 绘制的形状在停止后保持振动,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2917字,纯文字阅读大概需要5分钟。
内容图文
![java – 绘制的形状在停止后保持振动](/upload/InfoBanner/zyjiaocheng/809/9057a4edfd4c4198a0ec9d7e43401b49.jpg)
我试图通过创造一个从侧面反弹并减速的球来重建一些物理.球在x方向上停止移动,但它在y方向上仅向上和向下振动1个像素.它也会在底部边框上方稍微做一点.
还有,我的代码可读/良好实践吗?
Bouncy.java
package Bouncy;
import javax.swing.*;
public class Bouncy {
private static void createAndShowGui() {
JFrame frame = new JFrame("Bouncy Balls");
Board board = new Board();
frame.getContentPane().add(board);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocation(2000, 50);
board.requestFocusInWindow();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
Board.java
package Bouncy;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Board extends JPanel implements ActionListener {
public static final int BOARDWIDTH = 800;
public static final int BOARDHEIGHT = 800;
private Ball ball;
public Board() {
Dimension preferedDimension = new Dimension(BOARDWIDTH, BOARDHEIGHT);
setPreferredSize(preferedDimension);
ball = new Ball(15, 0);
Timer animationTimer = new Timer(17, this);
animationTimer.start();
}
public void actionPerformed(ActionEvent e) {
ball.applyPhysics();
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(rh);
ball.display(g2d);
g2d.dispose();
}
}
Ball.java
package Bouncy;
import java.awt.*;
public class Ball {
private int xPos;
private int yPos;
private double dx;
private double dy;
private int ballWidth;
private int ballHeight;
public Ball() {
this(0, 0);
}
public Ball(int dx, int dy) {
ballWidth = 50;
ballHeight = ballWidth;
xPos = 0;
yPos = 0;
this.dx = dx;
this.dy = dy;
}
public void applyPhysics() {
bounceX();
applyXFriction();
bounceY();
}
public void bounceX() {
if (xPos > Board.BOARDWIDTH - ballWidth) {
xPos = Board.BOARDWIDTH - ballWidth;
dx = -dx;
} else if (xPos < 0) {
xPos = 0;
dx = -dx;
} else {
xPos += dx;
}
}
public void applyXFriction() {
final double xFriction = .95;
if (yPos == Board.BOARDHEIGHT - ballHeight) {
dx *= xFriction;
if (Math.abs(dx) < .5) {
dx = 0;
}
}
}
public void bounceY() {
final int gravity = 12;
final double energyLoss = .75;
final double dt = .2;
if (yPos > Board.BOARDHEIGHT - ballHeight){
yPos = Board.BOARDHEIGHT - ballHeight;
dy = -dy * energyLoss;
} else if (yPos < 0) {
yPos = 0;
dy *= -energyLoss;
} else {
dy += gravity * dt;
yPos += dy * dt + .5 * gravity * dt * dt;
}
}
public void display(Graphics2D g2d) {
g2d.fillOval(xPos, yPos, ballWidth, ballHeight);
}
}
解决方法:
在你的应用摩擦方法中,你将dx设置为0,同时将dy设置为0.这将阻止球沿X轴和Y轴移动
if (Math.abs(dx) < .5)
{
dx = 0;
dy = 0;
}
这将阻止球振动:
if (Math.abs(dy * dt + .5 * gravity * dt * dt) < 1.5 && yPos == Board.BOARDHEIGHT - ballHeight)
{
dy = 0;
yPos = Board.BOARDHEIGHT - ballHeight;
}
内容总结
以上是互联网集市为您收集整理的java – 绘制的形状在停止后保持振动全部内容,希望文章能够帮你解决java – 绘制的形状在停止后保持振动所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。