当前位置: 首页 > 知识库问答 >
问题:

处理过程中的干扰键%2

后易安
2023-03-14

我试着通过按不同的键来激活不同的视觉效果。例如,当我按下“Z”或“Z”时,特定位置上的一个椭圆向下流动,留下一个痕迹。如果我等待它到达画布边界,没有问题,但当我按“0”激活另一个位置上的另一个椭圆来做同样的事情时,“z”/“z”的椭圆停止流动。当我在椭圆到达画布边框之前按下相同的键时也会发生这种情况。我该怎么解决这个?当我开始编写这个代码的时候,我不知道类和对象,然后我学会了并试图通过创建一个对象来解决它,但是它变得更糟,省略号根本不起作用。我希望第一个椭圆继续到边界,即使我按下另一个键,而它在它的途中。

另一件事是我想让它们在短时间后淡出,所以我在画布上画了半透明的矩形,这在我看来是很原始的。你能建议一个不同的方法吗?这不那么重要,但最好是让它们随着时间的推移完全褪色,而不是留下一丝痕迹。

这是我的代码,我清理了不相关的部分,让它看起来更容易理解:

void setup() {
  size(640, 500);
  background(bgRenk);
  frameRate(60);
  colorMode(HSB);
  noStroke();
}

int bgRenk = #e7e7e7;
int C3Yer;
int C3Y;
int Fd6Yer;
int Fd6Y;

void draw() {

  // This part probably sucks because it's a primitive solution to make ellipses fade out by putting semi-transparent rectangles on the canvas.

  fill(bgRenk, 10);
  rect(0, 0, 640, 500);

  // I basically map x and y positions to hue and opacity.

  float C3Renk= map(C3Yer, 0, width, 0, 255);
  float C3Opak = map(C3Y, height, 0, 0, 200);

  // When z/Z is pressed, an ellipse appears and goes down, leaving trace behind.   
  if (key == 'z' || key == 'Z') {
    C3Yer = 10;
    fill(C3Renk, 255, 255, C3Opak);
    ellipse(C3Yer, C3Y, 20, 20);
    C3Y += 20;
  }


  if (key == '0') {

    // Same mapping and ellipse thing.

    float Fd6Renk= map(Fd6Yer, 0, width, 0, 255);
    float Fd6Opak = map(Fd6Y, height, 0, 0, 200);
    Fd6Yer = 630;
    fill(Fd6Renk, 255, 255, Fd6Opak);
    ellipse(Fd6Yer, Fd6Y, 20, 20);
    Fd6Y += 20;
  }
}

void keyPressed() {


  if (key == 'z' || key == 'Z') {

    // When z/Z is pressed, y position of those ellipses are reset.


    C3Y = 10;
  }


  if (key == '0') {

    // Same reset thing.      

    Fd6Y = 10;
  }
}

共有1个答案

夔光霁
2023-03-14

在其他椭圆仍然流动的情况下创建新椭圆的问题在于变量key,它总是包含最近使用的键的值(有关更多信息,请参阅)。所以当你按下“Z”后的任何键时,你的椭圆将停止被绘制。您可以使用指示应该绘制哪些椭圆的全局变量来避免这种情况。

但我建议使用创建对象,这些对象将定义状态(位置、颜色、不透明度),并将存储在数组或列表中。它也将帮助您的褪色,所以找个时间,阅读更多关于类和对象的内容。在加工网站上,你可以找到像这样的不错的教程

但是,因为你已经尝试过创建对象,而我不工作,所以我将给你一些技巧和这样一个类的基本示例:

class Ball {
  float x, y;       // position of ball
  color col = 10;   // color of ball
  int opac = 255;   // opacity of ball

  Ball(float _x, float _y) {
    x = _x;
    y = _y;
  }

  void move() {    
    y += 20;
    opac -= 10;
  }

  void display() {        
    fill(col, 255, 255, opac);
    ellipse(x, y, 20, 20);
  }
}
void mousePressed() {
  //this will create new ball on mouse position
  balls.add( new Ball(mouseX, mouseY) );
}

并将它们存储到arraylist中,如下所示:

ArrayList<Ball> balls = new ArrayList();

您需要做的最后一件事是显示移动方法中的所有球。

for (Ball b : balls) // for each ball in list
{
  b.display(); // first display ball
  b.move();    // move and change opacity
}

这是一个非常基本的例子,应该改进,但我希望它能帮助你理解类。

 类似资料:
  • 我需要从同一个套接字或者从$*IN中读取多个线程;然而,似乎有错误,因为每个都试图从相同的来源读取(我认为)。解决这个问题的最好方法是什么?谢谢!! 以下是错误: 谢谢!!

  • 3、键盘中断的处理过程 当用户按键时,键盘接口会得到一个代表该按键的键盘扫描码,同时产生一个中断请求。键盘中断服务程序先从键盘接口取得按键的扫描码,然后根据其扫描码判断用户所按的键并作相应的处理,最后通知中断控制器本次中断结束并实现中断返回。 若用户按下双态键(如:Caps Lock、Num Lock和Scroll Lock等),则在键盘上相应LED指示灯的状态将发生改变; 若用户按下控制键(如:

  • 我试图做的是防止用户在我的输入中输入空字符串。现在,用户只能输入数字。然而,没有什么能阻止他们将文本字段留空。我想限制他们在程序空白时按我的按钮启动程序。 现在,我的文本字段最初是空白的,按钮最初是灰色的。但当我输入一些东西时,按钮保持灰色。请记住,所有这些代码都在构造函数中。

  • 我已经编写了一个服务器-客户端(两个程序)结构,它工作正常。。。仅当使用TCP时。我的想法是使用TCP进行文本聊天传输(udp不可靠),但使用udp进行游戏数据包传输(是的,这是一种每秒30帧的动作游戏,所以我需要udp)。 但是,当我在客户端进程中与TCP建立连接时,我开始向服务器程序发送UDP数据包,并从服务器程序接收UDP数据包。客户端在单个线程中使用非阻塞套接字、UDP和TCP。这里没有多

  • 如何监控LMAX Disruptor?假设我有3个环缓冲区,并希望提供一个用户界面来提供环缓冲区的信息。

  • 我想在JavaFX中使用拖放,并有一个功能,您可以直观地看到正在拖动的项目。我已经实现了我认为可行的解决方案,但API似乎存在问题。 根据API start DragAndDrop(TransferMode...)必须在setOnDragDetted中初始化。这是我使用Dragboard存储我想传输到另一个节点的内容的地方。 编辑:这似乎与TrasferMode有关。如果我使用TransferMo