正在学习简单的awt,然后我编写了一个球的运动形式,我希望他能够按正方形循环移动,但是他却只是以闪电型向下移动,请问是为什么??

package GameFrame;
/**
 * 关于球运动的项目学习
 */
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameFrame02 extends Frame  {
    /**
     * 加载窗口
     */
    Image img =GameUtil.getImage("image/sun.jpg");
    
    
    public void Frametest() {
        setSize(500,500);//窗口大小
        setLocation(100,100);//窗口位置
        setVisible(true);//窗口可见
        /*
         *关闭该窗口,并且停止该程序
         *(窗口监听器)
         */
        new paintThread().start();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
    }
    private double x=100,y=100;
    private boolean left,down;
    //这是一个回调方法,用的是父类对象,所以无需调用,直接可用
    @Override
    public void paint(Graphics g) {
        g.drawImage(img, (int)x, (int)y, null);//double强制转换int
        //左右移动
        if(left) {
            x -= 3;
        }
        else {
            x+=3;
        }
        if(down) {
            y -= 3;
        }
        else {
            y+=3;
        }
        if(x>500-140) {
            left=true;
            if(y<100&&x>500-140) {
                left=(Boolean) null;
                down=false;
            }
        }
        if(x<100) {
            left=false;
            if(y>500-140&&x<100) {
                left=(Boolean) null;
                down=true;
            }
        }
    }
    
    
    class paintThread extends Thread{
        
        public void run() {
            while (true) {
                repaint();
                //使这个程序无限启动
                try {
                    Thread.sleep(20);
                    //每次启动都停40ms(毫秒)
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    public static void main(String []args) {
        
        FrameFrame02 f =new FrameFrame02();
        f.Frametest();
        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个使用 MATLAB 编写位错运动的例子: ``` % 初始位置 position = 0; % 初始速度 velocity = 1; % 时间间隔 dt = 0.01; % 模拟时间 time = 0:dt:1; % 计算位置 for i = 1:length(time) position = position + velocity * dt; velocity = velocity - position * dt; end % 绘制位置-时间图像 plot(time, position); xlabel('时间'); ylabel('位置'); ``` 该代码模拟了一个位错运动,通过每次更新位置和速度来计算位置。最后,通过绘制位置-时间图像来可视化运动情况。 ### 回答2: 以下是一个使用MATLAB编写的位错运动简单示例: ```matlab % 设置位错的参数 amplitude = 10; % 位错幅度 frequency = 0.5; % 位错频率 offset = 30; % 位错偏移 % 创建时间变量 t = linspace(0, 10, 1000); % 时间范围为0到10,共1000个时间点 % 计算位错运动的位置 position = amplitude * sin(2*pi*frequency*t) + offset; % 绘制位错运动的图像 plot(t, position, 'b', 'LineWidth', 1.5); % 使用蓝色线条绘制 xlabel('时间'); % 设置x轴标签 ylabel('位置'); % 设置y轴标签 title('位错运动'); % 设置图像标题 grid on; % 显示网格 ``` 上述代码中,我们首先设置了位错的参数,包括幅度(amplitude)、频率(frequency)和偏移(offset)。然后,创建一个包含1000个时间点的时间变量(t),范围为0到10。计算位错运动的位置,将其存储在变量`position`中。最后,使用`plot`函数绘制位错运动的图像,并添加标签、标题和网格。运行代码后,会得到一个显示位错运动的图像。 ### 回答3: 你好!下面是一个用MATLAB编写位错运动简单例子: 假设我们有一个正方形晶格,其边长为L。我们可以用一个二维数组表示晶格上的原子位置,其中每个元素为1或0,分别表示该位置是否有原子。我们可以定义一个初始位错,将晶格某一行或某一列的原子位置设为0,形成一个位错线。 首先,我们需要生成初始晶格,并设置位错。下面是生成一个边长为nxn的正方形晶格的代码: n = 10; % 正方形晶格的边长 lattice = ones(n); % 生成全是1的正方形矩阵 lattice(:, 5) = 0; % 设置第5列为位错线 接下来,我们可以显示晶格的图形,以及位错移动后的图形。为了模拟位错运动,我们可以随机选择一个原子,并将其位置设为0,然后将位错线向该原子靠近。 在MATLAB中,我们可以使用imshow函数显示二维图像。下面是显示晶格的代码: imshow(lattice, 'InitialMagnification', 'fit'); 为了模拟位错运动,我们可以编写一个循环,在循环中随机选择一个原子,并将其位置设为0,然后将位错线向该原子靠近。下面是模拟位错运动的代码: iterations = 100; % 模拟的迭代次数 for i = 1:iterations % 随机选择一个原子 row = randi(n); col = randi(n); % 将该原子位置设为0 lattice(row, col) = 0; % 将位错线向该原子靠近 lattice(:, col) = 0; lattice(row, col) = 1; % 显示位错运动后的晶格图像 imshow(lattice, 'InitialMagnification', 'fit'); pause(0.1); % 暂停0.1秒,以便观察每次位错运动 end 通过运行以上代码,你可以观察到位错在晶格中运动的过程。这只是一个简单的例子,你可以根据自己的需求和想象力对代码进行扩展和改进。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值