Java Processing鱼缸项目随机位置绘制最多8条鱼实现咨询
问题排查&修改方案
你现有代码存在3个核心问题,对应修改如下:
- 你在
setup()里创建的Random是局部变量,没有给类定义的静态变量randGen赋值,导致全局随机数生成器实际为null - 目前
fishes[0]是固定在屏幕中心生成,没有使用随机坐标 - 没有在
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
相关产品推荐
相关产品推荐

