Java 如何通过更改标题(即旋转对象)避免与边界或彼此碰撞
实际上,任务是,两辆车移动,这些车必须能够避开 通过更改标题与边界或彼此碰撞 例如:旋转对象** 我犯了一个错误 getRadius()Java 如何通过更改标题(即旋转对象)避免与边界或彼此碰撞,java,javafx,Java,Javafx,实际上,任务是,两辆车移动,这些车必须能够避开 通过更改标题与边界或彼此碰撞 例如:旋转对象** 我犯了一个错误 getRadius() import java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入javafx.animation.KeyFrame; 导入javafx.animation.Timeline; 导入javafx.application.application; 导入javafx.event.ActionEve
import java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Bounds;
导入javafx.scene.scene;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
//导入javafx.scene.shape.Circle;
导入javafx.stage.stage;
导入javafx.util.Duration;
公营车扩展应用{
//公共静态图像车;
公共静态窗格画布;
@凌驾
public void start(final Stage primaryStage)引发FileNotFoundException{
canvas=新窗格();
最终场景=新场景(画布,800600);
场景。设置填充(颜色。浅绿色);
初级阶段。片名(“汽车”);
初级阶段。场景(场景);
primaryStage.show();
//导出图像
Image car1=新图像(新文件输入流(“src/car2.png”);
Image car2=新图像(新文件输入流(“src/car1.png”);
ImageView c1=新的ImageView(car1);
ImageView c2=新的ImageView(car2);
c1.setFitHeight(100);//调整图像大小
c1.设置宽度(100);
c1.搬迁(100100);
c2.setFitHeight(100);//调整图像大小
c2.设置宽度(100);
c2.重新安置(600100);
c2.setImage(car2);
c2.设置可见(真);
//上台
canvas.getChildren().add(c1);
canvas.getChildren().add(c2);
最终时间线循环=新时间线(新关键帧(Duration.millis(10),新EventHandler(){
双deltaX=3;
双三角洲=3;
@凌驾
公共无效句柄(最终操作事件t){
c1.setLayoutX(c1.getLayoutX()+deltaX);
c1.setLayoutY(c1.getLayoutY()+deltaY);
c2.setLayoutX(c2.getLayoutX()+deltaX);
c2.setLayoutY(c2.getLayoutY()+deltaY);
final Bounds=canvas.getBoundsInLocal();
最终布尔值atRightBorder=c1.getLayoutX()>=(bounds.getMaxX()-c1.getRadius());
最终布尔值atLeftBorder=c1.getLayoutX()=(bounds.getMaxY()-c1.getRadius());
最后一个布尔值attoporder=c1.getLayoutY()首先,修复两辆车的移动,使它们保持在画布边界内。
import java.io.FileNotFoundException;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Car extends Application {
private Pane canvas;
private static final String[] CIRCLES_128 = {
"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Green.png",
"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Red.png",
};
@Override
public void start(final Stage primaryStage) throws FileNotFoundException {
canvas = new Pane();
final Scene scene = new Scene(canvas, 800, 600);
scene.setFill(Color.LIGHTGREEN);
primaryStage.setTitle("Car");
primaryStage.setScene(scene);
Image car1Image = new Image(CIRCLES_128[0]);
Image car2Image = new Image(CIRCLES_128[1]);
ImageView car1 = new ImageView(car1Image);
ImageView car2 = new ImageView(car2Image);
car1.setFitHeight(100);//Resize image
car1.setFitWidth(100);
car1.relocate(100,100);
car2.setFitHeight(100);//Resize image
car2.setFitWidth(100);
car2.relocate(600,100);
//add to stage
canvas.getChildren().addAll(car1, car2);
final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), new EventHandler<ActionEvent>() {
double car1DeltaX = 3, car2DeltaX = 3; //each car must have its own deltaX and Y because
double car1DeltaY = 3, car2DeltaY = 3; //only one car has to change direction when hitting the edge
@Override
public void handle(final ActionEvent t) {
car1.setLayoutX(car1.getLayoutX() + car1DeltaX);
car1.setLayoutY(car1.getLayoutY() + car1DeltaY);
car2.setLayoutX(car2.getLayoutX() + car2DeltaX);
car2.setLayoutY(car2.getLayoutY() + car2DeltaY);
final Bounds bounds = canvas.getBoundsInLocal();
final Bounds car1Bounds = car1.getBoundsInParent();
final Bounds car2Bounds = car2.getBoundsInParent();
//check car1
final boolean car1AtRightBorder = car1Bounds.getMaxX() >= bounds.getMaxX() ;//- bounds.getRadius();
final boolean car1AtLeftBorder = car1Bounds.getMinX()<= bounds.getMinX() ;//+ car1.getRadius();
final boolean car1AtBottomBorder = car1Bounds.getMaxY() >= bounds.getMaxY() ;//- car1.getRadius();
final boolean car1AtTopBorder = car1Bounds.getMinY() <= bounds.getMinY() ;//+ car1.getRadius();
if (car1AtRightBorder || car1AtLeftBorder) {
car1DeltaX *= -1;
}
if (car1AtBottomBorder || car1AtTopBorder) {
car1DeltaY *= -1;
}
//check car2
final boolean car2AtRightBorder = car2Bounds.getMaxX() >= bounds.getMaxX() ;
final boolean car2AtLeftBorder = car2Bounds.getMinX()<= bounds.getMinX() ;
final boolean car2AtBottomBorder = car2Bounds.getMaxY() >= bounds.getMaxY() ;
final boolean car2AtTopBorder = car2Bounds.getMinY() <= bounds.getMinY() ;
if (car2AtRightBorder || car2AtLeftBorder) {
car2DeltaX *= -1;
}
if (car2AtBottomBorder || car2AtTopBorder) {
car2DeltaY *= -1;
}
}
}));
primaryStage.show();
loop.setCycleCount(Timeline.INDEFINITE);
loop.play();
}
static void main(String[] args) {
launch(args);
}
}
并在循环中使用它:
public void handle(final ActionEvent t) {
car1.setLayoutX(car1.getLayoutX() + car1DeltaX);
car1.setLayoutY(car1.getLayoutY() + car1DeltaY);
car2.setLayoutX(car2.getLayoutX() + car2DeltaX);
car2.setLayoutY(car2.getLayoutY() + car2DeltaY);
final Bounds bounds = canvas.getBoundsInLocal();
final Bounds car1Bounds = car1.getBoundsInParent();
final Bounds car2Bounds = car2.getBoundsInParent();
if(collisionDetected(car1Bounds, car2Bounds)){
car1DeltaX *= -1; car1DeltaY *= -1;
car2DeltaX *= -1; car2DeltaY *= -1;
}
//check car1
final boolean car1AtRightBorder = car1Bounds.getMaxX() >= bounds.getMaxX() ;
final boolean car1AtLeftBorder = car1Bounds.getMinX()<= bounds.getMinX() ;
final boolean car1AtBottomBorder = car1Bounds.getMaxY() >= bounds.getMaxY() ;
final boolean car1AtTopBorder = car1Bounds.getMinY() <= bounds.getMinY() ;
if (car1AtRightBorder || car1AtLeftBorder) {
car1DeltaX *= -1;
}
if (car1AtBottomBorder || car1AtTopBorder) {
car1DeltaY *= -1;
}
//check car2
final boolean car2AtRightBorder = car2Bounds.getMaxX() >= bounds.getMaxX() ;
final boolean car2AtLeftBorder = car2Bounds.getMinX()<= bounds.getMinX() ;
final boolean car2AtBottomBorder = car2Bounds.getMaxY() >= bounds.getMaxY() ;
final boolean car2AtTopBorder = car2Bounds.getMinY() <= bounds.getMinY() ;
if (car2AtRightBorder || car2AtLeftBorder) {
car2DeltaX *= -1;
}
if (car2AtBottomBorder || car2AtTopBorder) {
car2DeltaY *= -1;
}
}
}));
公共无效句柄(最终操作事件t){
car1.setLayoutX(car1.getLayoutX()+car1DeltaX);
car1.setLayoutY(car1.getLayoutY()+car1DeltaY);
car2.setLayoutX(car2.getLayoutX()+car2DeltaX);
car2.setLayoutY(car2.getLayoutY()+car2DeltaY);
final Bounds=canvas.getBoundsInLocal();
最终边界car1Bounds=car1.getBoundsInParent();
最终边界car2Bounds=car2.getBoundsInParent();
如果(检测到碰撞(车1边界、车2边界)){
car1DeltaX*=-1;car1DeltaY*=-1;
car2DeltaX*=-1;car2DeltaY*=-1;
}
//检查car1
最终布尔值car1AtRightBorder=car1Bounds.getMaxX()>=bounds.getMaxX();
最终布尔值car1AtLeftBorder=car1Bounds.getMinX()=bounds.getMaxY();
最终布尔值car1attoporder=car1Bounds.getMinY()=bounds.getMaxX();
最终布尔值car2AtLeftBorder=car2Bounds.getMinX()=bounds.getMaxY();
最终布尔值car2attoporder=car2Bounds.getMinY(){
//将2辆车移到新位置
位置节点(car1、car1DeltaX、car1DeltaY);
位置节点(car2、car2DeltaX、car2DeltaY);
最终边界canvasBounds=canvas.getBoundsInLocal();
最终边界car1Bounds=car1.getBoundsInParent();
最终边界car2Bounds=car2.getBoundsInParent();
如果(检测到碰撞(车1边界、车2边界)){
手部胶合();
}
//检查画布范围内的car1
if(横向边界(画布边界、车辆边界)){
car1DeltaX*=-1;
}
if(垂直边界(画布边界、汽车边界)){
car1DeltaY*=-1;
}
//检查画布范围内的car2
if(横向边界(画布边界、车辆边界)){
car2DeltaX*=-1;
}
if(垂直边界(画布边界、汽车边界)){
car2DeltaY*=-1;
}
}));
primaryStage.show();
loop.setCycleCount(Timeline.unfinite);
loop.play();
}
私有节点(节点节点、双deltaX、双deltaY){
node.setLayoutX(node.getLayoutX()+deltaX);
node.setLayoutY(node.getLayoutY()+deltaY);
}
检测到私有布尔冲突(边界b1、边界b2){
返回b1.相交(b2);
}
私有布尔atHorizontalEdge(边界封闭,边界封闭){
return enclosed.getMaxX()>=enclosed.getMaxX()| | | enclosed.getMinX()=enclosed.getMaxY()| | enclosed.getMinY()ImageView
没有getRadius()
方法如果您的帖子是关于错误的,总是复制粘贴错误消息(和堆栈跟踪)。因此,每个人都会看到与您相同的内容,有些人可能会立即发现问题。
private boolean collisionDetected(Bounds b1, Bounds b2) {
return b1.intersects(b2);
}
public void handle(final ActionEvent t) {
car1.setLayoutX(car1.getLayoutX() + car1DeltaX);
car1.setLayoutY(car1.getLayoutY() + car1DeltaY);
car2.setLayoutX(car2.getLayoutX() + car2DeltaX);
car2.setLayoutY(car2.getLayoutY() + car2DeltaY);
final Bounds bounds = canvas.getBoundsInLocal();
final Bounds car1Bounds = car1.getBoundsInParent();
final Bounds car2Bounds = car2.getBoundsInParent();
if(collisionDetected(car1Bounds, car2Bounds)){
car1DeltaX *= -1; car1DeltaY *= -1;
car2DeltaX *= -1; car2DeltaY *= -1;
}
//check car1
final boolean car1AtRightBorder = car1Bounds.getMaxX() >= bounds.getMaxX() ;
final boolean car1AtLeftBorder = car1Bounds.getMinX()<= bounds.getMinX() ;
final boolean car1AtBottomBorder = car1Bounds.getMaxY() >= bounds.getMaxY() ;
final boolean car1AtTopBorder = car1Bounds.getMinY() <= bounds.getMinY() ;
if (car1AtRightBorder || car1AtLeftBorder) {
car1DeltaX *= -1;
}
if (car1AtBottomBorder || car1AtTopBorder) {
car1DeltaY *= -1;
}
//check car2
final boolean car2AtRightBorder = car2Bounds.getMaxX() >= bounds.getMaxX() ;
final boolean car2AtLeftBorder = car2Bounds.getMinX()<= bounds.getMinX() ;
final boolean car2AtBottomBorder = car2Bounds.getMaxY() >= bounds.getMaxY() ;
final boolean car2AtTopBorder = car2Bounds.getMinY() <= bounds.getMinY() ;
if (car2AtRightBorder || car2AtLeftBorder) {
car2DeltaX *= -1;
}
if (car2AtBottomBorder || car2AtTopBorder) {
car2DeltaY *= -1;
}
}
}));
public class Car extends Application {
private Pane canvas;
private static final String[] CIRCLES_128 = {
"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Green.png",
"https://cdn3.iconfinder.com/data/icons/softwaredemo/PNG/128x128/Circle_Red.png",
};
private double car1DeltaX = 3, car2DeltaX = 3; //each car must have its own deltaX and Y because
private double car1DeltaY = 3, car2DeltaY = 3; //only one car has to change direction when hitting the edge
@Override
public void start(final Stage primaryStage) throws FileNotFoundException {
canvas = new Pane();
final Scene scene = new Scene(canvas, 800, 600);
scene.setFill(Color.LIGHTGREEN);
primaryStage.setTitle("Car");
primaryStage.setScene(scene);
Image car1Image = new Image(CIRCLES_128[0]);
Image car2Image = new Image(CIRCLES_128[1]);
ImageView car1 = new ImageView(car1Image);
ImageView car2 = new ImageView(car2Image);
car1.setFitHeight(100);//Resize image
car1.setFitWidth(100);
car1.relocate(100,100);
car2.setFitHeight(100);//Resize image
car2.setFitWidth(100);
car2.relocate(600,100);
//add to stage
canvas.getChildren().addAll(car1, car2);
final Timeline loop = new Timeline(new KeyFrame(Duration.millis(10), t -> {
//move 2 cars to new position
positionNode(car1, car1DeltaX, car1DeltaY);
positionNode(car2, car2DeltaX, car2DeltaY);
final Bounds canvasBounds = canvas.getBoundsInLocal();
final Bounds car1Bounds = car1.getBoundsInParent();
final Bounds car2Bounds = car2.getBoundsInParent();
if(collisionDetected(car1Bounds, car2Bounds)){
handleCollision();
}
//check car1 within canvas bounds
if(atHorizontalEdge(canvasBounds,car1Bounds)){
car1DeltaX *= -1;
}
if(atVerticalEdge(canvasBounds,car1Bounds)){
car1DeltaY *= -1;
}
//check car2 within canvas bounds
if(atHorizontalEdge(canvasBounds,car2Bounds)){
car2DeltaX *= -1;
}
if(atVerticalEdge(canvasBounds,car2Bounds)){
car2DeltaY *= -1;
}
}));
primaryStage.show();
loop.setCycleCount(Timeline.INDEFINITE);
loop.play();
}
private void positionNode(Node node, double deltaX, double deltaY) {
node.setLayoutX(node.getLayoutX() + deltaX);
node.setLayoutY(node.getLayoutY() + deltaY);
}
private boolean collisionDetected(Bounds b1, Bounds b2) {
return b1.intersects(b2);
}
private boolean atHorizontalEdge(Bounds enclosing, Bounds enclosed) {
return enclosed.getMaxX() >= enclosing.getMaxX() || enclosed.getMinX()<= enclosing.getMinX() ;
}
private boolean atVerticalEdge(Bounds enclosing, Bounds enclosed) {
return enclosed.getMaxY() >= enclosing.getMaxY() || enclosed.getMinY()<= enclosing.getMinY() ;
}
private void handleCollision() {
//change cars directions
car1DeltaX *= -1; car1DeltaY *= -1;
car2DeltaX *= -1; car2DeltaY *= -1;
}
public static void main(String[] args) {
launch(args);
}
}