Java桌球小游戏

 目标:实现动画,小球沿着水平方向移动并做边界检测

import java.awt.*;
import javax.swing.*;

public class BallGame extends JFrame {

	Image ball=Toolkit.getDefaultToolkit().getImage("images/ball.png");
	Image desk=Toolkit.getDefaultToolkit().getImage("images/desk.jpg");
	
	double x=100;//小球的横坐标
	double y=100;//小球的纵坐标
	boolean right=true;//方向
	
	//画窗口的方法
	public void paint(Graphics g) {
		System.out.println("窗口被画了一次");
		g.drawImage(desk, 0, 0, null);
		g.drawImage(ball, (int)x, (int)y, null);
		
		if(right) {
		x=x+10;
	}else {
		x=x-10;
	}
		if(x>856-40-30) {//856是窗口宽度,40是桌子边框的宽度,30是小球的直径
			right=false;
		}
	if(x<40) {//桌子边框的直径
		right=true;
	}
			
		}
	
	
	//窗口加载
	void launchFrame() {
		setSize(856,500);
		setLocation(400,400);
		setVisible(true);
	
		//重画窗口,每秒画25次
		while(true) {
			repaint();
			try {
				Thread.sleep(100);//40毫秒,1秒=1000毫秒,大约一秒画25次窗口
			}catch(Exception e) {
				e.printStackTrace();
			}
			
		}
	
	}
	
	
//main方法是程序执行的入口
	public static void main(String[] args) {
		System.out.println("这是一个小游戏");
        BallGame game=new BallGame();
        game.launchFrame();
	}

}

目标:实现小球沿着任意角度飞行(三角函数)

import java.awt.*;
import javax.swing.*;

public class BallGame2 extends JFrame {

	Image ball=Toolkit.getDefaultToolkit().getImage("images/ball.png");
	Image desk=Toolkit.getDefaultToolkit().getImage("images/desk.jpg");
	
	double x=100;//小球的横坐标
	double y=100;//小球的纵坐标
	
	double degree =3.14/3;//弧度,此处是:60度
	
	//画窗口的方法
	public void paint(Graphics g) {
		System.out.println("窗口被画了一次");
		g.drawImage(desk, 0, 0, null);
		g.drawImage(ball, (int)x, (int)y, null);
		
		
		x=x+10*Math.cos(degree);
		y=y+10*Math.sin(degree);
		
		if(y>500-40-30||y<80) {//500是窗口高度;40是桌子边框,30是球直径;最后一个40是标题栏的高度
			degree=-degree;
		}
		//碰到左右边界
		if(x<40||x>856-40-30) {
			degree=3.14-degree;
			
		}
        
			
		}
	
	
	//窗口加载
	void launchFrame() {
		setSize(856,500);
		setLocation(400,400);
		setVisible(true);
	
		//重画窗口,每秒画25次
		while(true) {
			repaint();
			try {
				Thread.sleep(100);//40毫秒,1秒=1000毫秒,大约一秒画25次窗口
			}catch(Exception e) {
				e.printStackTrace();
			}
			
		}
	
	}
	
	
//main方法是程序执行的入口
	public static void main(String[] args) {
		System.out.println("这是一个小游戏");
        BallGame2 game=new BallGame2();
        game.launchFrame();
	}

}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java桌球小游戏中,要进行球体碰撞检测并合理分配速度,可以通过以下步骤实现: 1. 碰撞检测:首先需要判断两个球体是否相交,如果相交,则说明发生了碰撞。 2. 合理分配速度:对于每个球体,碰撞后需要重新分配速度,使得碰撞后两个球体的速度满足动量守恒定律和能量守恒定律。具体可以按照以下步骤进行: (1) 计算碰撞前两个球体的动量和能量。 (2) 根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度。 (3) 分别将速度分配给每个球体。 下面是一个简单的示例代码: ```java // 判断两个球体是否相交 public boolean checkCollision(Ball ball1, Ball ball2) { double distance = Math.sqrt(Math.pow(ball1.getX() - ball2.getX(), 2) + Math.pow(ball1.getY() - ball2.getY(), 2)); if (distance <= ball1.getRadius() + ball2.getRadius()) { return true; // 碰撞发生 } return false; // 碰撞未发生 } // 碰撞后重新分配速度 public void collide(Ball ball1, Ball ball2) { // 计算碰撞前两个球体的动量和能量 double m1 = ball1.getMass(); double m2 = ball2.getMass(); double v1x = ball1.getSpeedX(); double v1y = ball1.getSpeedY(); double v2x = ball2.getSpeedX(); double v2y = ball2.getSpeedY(); double p1x = m1 * v1x; double p1y = m1 * v1y; double p2x = m2 * v2x; double p2y = m2 * v2y; double e1 = 0.5 * m1 * (v1x * v1x + v1y * v1y); double e2 = 0.5 * m2 * (v2x * v2x + v2y * v2y); double p1 = Math.sqrt(p1x * p1x + p1y * p1y); double p2 = Math.sqrt(p2x * p2x + p2y * p2y); double e = e1 + e2; // 根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度 double v1x_new = (p1x + p2x - m2 * (v1x - v2x)) / (m1 + m2); double v1y_new = (p1y + p2y - m2 * (v1y - v2y)) / (m1 + m2); double v2x_new = (p1x + p2x - m1 * (v2x - v1x)) / (m1 + m2); double v2y_new = (p1y + p2y - m1 * (v2y - v1y)) / (m1 + m2); // 分别将速度分配给每个球体 ball1.setSpeedX(v1x_new); ball1.setSpeedY(v1y_new); ball2.setSpeedX(v2x_new); ball2.setSpeedY(v2y_new); } ``` 在以上代码中,我们首先判断两个球体是否相交,如果相交,则进行碰撞检测。然后,我们根据动量守恒定律和能量守恒定律,计算碰撞后两个球体的速度,并将速度分配给每个球体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值