You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Processing鱼缸项目随机位置绘制最多8条鱼实现咨询

问题排查&修改方案

你现有代码存在3个核心问题,对应修改如下:

  1. 你在setup()里创建的Random是局部变量,没有给类定义的静态变量randGen赋值,导致全局随机数生成器实际为null
  2. 目前fishes[0]是固定在屏幕中心生成,没有使用随机坐标
  3. 没有在draw()回调里重绘背景,后续鱼移动/刷新会出现画面拖影

具体修改步骤

1. 调整setup()方法逻辑

  • 删除局部Random randGen = new Random()的变量声明,直接给静态变量randGen赋值
  • 生成窗口范围内的随机x/y坐标,赋值给fishes[0]的构造参数

2. 调整draw()方法逻辑

  • 每次绘制鱼之前,先重绘背景,保证画面刷新正常

3. 可选:测试多鱼生成

如果需要测试最多8条鱼的效果,直接在setup()里加循环遍历fishes数组,给每个元素都创建随机坐标的Fish对象即可


修改后完整代码

import java.util.Random;
import java.io.File;
import processing.core.PApplet;
import processing.core.PImage;
public class FishTank {
    private static PApplet processing; // PApplet对象,代表JunglePark应用的图形界面
    private static PImage backgroundImage;  // 代表背景图片的PImage对象
    private static Fish[] fishes;   // 定长数组,存储鱼缸中所有的鱼,这些鱼可以是不同品种
    private static Random randGen;  // 随机数生成器
    public static void main(String[] args) {
        Utility.startApplication();  //启动应用
    }
    /**
     * 定义本应用的初始环境属性
     * @param processingOBJ 本应用图形显示窗口的引用
     */
    public static void setup(PApplet processingOBJ) {   
        processing = processingOBJ;
        // 加载背景图片
        backgroundImage = processing.loadImage("images/background.png");
        // 初始化随机数生成器(给静态变量赋值,不是创建局部变量)
        randGen = new Random();
        // 初始化长度为8的鱼数组,默认元素全为null
        fishes = new Fish[8]; 
        // 生成随机坐标,给第0位创建鱼对象
        float randX = (float)randGen.nextInt(processing.width);
        float randY = (float)randGen.nextInt(processing.height);
        fishes[0] = new Fish(processing, randX, randY);
        
        // --- 要测试8条鱼的话取消注释下面这段代码即可 ---
        // for(int i = 0; i < fishes.length; i++) {
        //     float x = (float)randGen.nextInt(processing.width);
        //     float y = (float)randGen.nextInt(processing.height);
        //     fishes[i] = new Fish(processing, x, y);
        // }
    }
    
    /**
     * 绘制并更新应用显示窗口,该回调方法会被循环调用
     */
    public static void draw() {
        // 每次重绘先画背景,清除上一帧的内容
        processing.image(backgroundImage,  processing.width / 2,  processing.height / 2);
        // 遍历数组绘制所有非空的鱼对象
        for (int i =0; i < fishes.length; i++) {
            if (fishes[i] != null) {
                fishes[i].draw();
            }
        }
    }
    /**
     * 用户每次按下鼠标时调用的回调方法
     */
    public static void mousePressed() {
        
    }
    
    /**
     * 用户每次释放鼠标时调用的回调方法
     */
    public static void mouseReleased() {
        
    }
    
    public static void keyPressed() {
        
    }
    /**
     * 检查鼠标是否位于指定Fish对象上方
     * 
     * @param fish 特定鱼的引用
     * @return 如果鼠标位于指定Fish对象(即鱼的图片)上方则返回true,否则返回false
     */
    public static boolean isMouseOver(Fish fish) {
        float X = fish.getPositionX();
        float Y = fish.getPositionY();
        if ((X - fish.getImage().width/2) < processing.mouseX && processing.mouseX < (X + fish.getImage().width/2) &&
        (Y - fish.getImage().height/2) < processing.mouseY && processing.mouseY < (Y + fish.getImage().height/2))
        {
            return true;  // 如果鼠标在鱼的边界范围内则返回true
        }
        else {
            return false;
        }
    }
}

测试说明

当前代码默认只生成1条随机位置的鱼,其余7个位置为null,符合作业要求。如果需要测试多鱼效果,取消setup()里循环代码的注释即可生成最多8条随机位置的鱼。

内容的提问来源于stack exchange,提问作者Wremmurg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:09:02