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

Processing中WebSocket事件触发后变量更新但背景未切换问题求助

问题分析与解决思路

你的核心问题是背景图片的切换逻辑仅在程序启动时执行了一次:

  • setup()是Processing程序启动时仅运行一次的入口,你在这里初始化了bgEstado,但之后当WebSocket收到消息更新palabraClave时,没有触发任何图片切换逻辑,所以背景始终保持初始的bg2.png。
  • 额外注意:Java/Processing中字符串比较必须用equals()方法,而非==(==比较的是对象引用,不是字符串内容),你初始代码里用==是巧合生效,后续统一用equals()能避免潜在问题。

修复方案

方案1:收到WebSocket消息时直接切换图片

在webSocketServerEvent()回调中,更新palabraClave后立即判断并切换背景图片,实时响应语音输入:

/*
  Simple WebSocketServer example that can receive voice transcripts from Chrome
  Requires WebSockets Library
 */

import websockets.*;
PImage bgEstado;
String palabraClave;
Boolean estado;

WebsocketServer socket;

void setup() {
  socket = new WebsocketServer(this, 1337, "/p5websocket");
  size(600,600);
  palabraClave = "";
  estado = true;
  // 初始化默认背景
  bgEstado = loadImage("bg2.png");
}

void draw() {
  background(0);
  image(bgEstado, 0, 0);
  text(this.palabraClave, 200, 200);
}
 

void webSocketServerEvent(String msg){
 println(msg);
 palabraClave = msg;
 println(palabraClave);
 // 收到消息后立即判断并切换背景
 if(palabraClave.equals("zangolotino")){
   bgEstado = loadImage("bg1.png");
 } else {
   bgEstado = loadImage("bg2.png");
 }
}

方案2:在draw()中实时判断(适合持续检测场景)

如果需要每一帧都检查词汇状态,可把判断逻辑移到draw()中,同时加状态标记避免重复加载图片:

/*
  Simple WebSocketServer example that can receive voice transcripts from Chrome
  Requires WebSockets Library
 */

import websockets.*;
PImage bgEstado;
String palabraClave;
Boolean estado;
String lastPalabra; // 记录上一次词汇,避免重复加载图片

WebsocketServer socket;

void setup() {
  socket = new WebsocketServer(this, 1337, "/p5websocket");
  size(600,600);
  palabraClave = "";
  lastPalabra = "";
  estado = true;
  bgEstado = loadImage("bg2.png");
}

void draw() {
  background(0);
  // 仅当词汇变化时更新图片
  if(!palabraClave.equals(lastPalabra)){
    lastPalabra = palabraClave;
    if(palabraClave.equals("zangolotino")){
      bgEstado = loadImage("bg1.png");
    } else {
      bgEstado = loadImage("bg2.png");
    }
  }
  image(bgEstado, 0, 0);
  text(this.palabraClave, 200, 200);
}
 

void webSocketServerEvent(String msg){
 println(msg);
 palabraClave = msg;
 println(palabraClave);
}

两种方案都能解决问题,方案1更高效(仅收到新消息时加载图片),方案2适合需要持续监控词汇状态的场景。

内容的提问来源于stack exchange,提问作者Leandro Di Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:45:32