在Processing 2中,我将如何实现这一点?

在Processing 2中,我将如何实现这一点?,processing,Processing,在Processing 2中,我将如何实现这一点 第一次鼠标左键单击时,应显示鼠标居中的球 第二次鼠标左键单击应显示另一个球,该球位于单击鼠标时鼠标的中心位置 显示两个球后,左键单击将在第二个球处启动第一个球 当第一个球接触到第二个球的边缘时,第一个球应该停止,第二个球应该以相同的速度朝相同的方向移动,并且移动的距离与第一个球移动的距离相同,我不会给出代码,因为这太复杂了(这也不是堆栈溢出的目的)。不过,我将概述一些您需要的原则,希望您可以从中开始 要做的第一件事是跟踪状态。听起来你们的州会是:

在Processing 2中,我将如何实现这一点

第一次鼠标左键单击时,应显示鼠标居中的球

第二次鼠标左键单击应显示另一个球,该球位于单击鼠标时鼠标的中心位置

显示两个球后,左键单击将在第二个球处启动第一个球


当第一个球接触到第二个球的边缘时,第一个球应该停止,第二个球应该以相同的速度朝相同的方向移动,并且移动的距离与第一个球移动的距离相同,我不会给出代码,因为这太复杂了(这也不是堆栈溢出的目的)。不过,我将概述一些您需要的原则,希望您可以从中开始

要做的第一件事是跟踪状态。听起来你们的州会是:

  • 等待第一次点击
  • 正在等待第二次单击
  • 移动第一个球
  • 移动第二个球
  • 这种方法非常常见,有时被称为有限状态机。通常,您会为每个状态定义一个常量整数,并在某个位置存储一个“当前状态”整数。当您想要更改/前进状态时,它将被更新

    在主绘图循环中,您将根据所处的状态执行不同的代码。例如,在第三种状态下,它将绘制两个球,并继续将第一个球移近第二个球,计算它们之间的距离。当它们接触时,它会移动到第四个状态

    显然,您需要一个鼠标处理程序来检测和处理点击。这将存储球的位置并适当地推进状态

    在数学方面,你需要两样东西。首先,您需要熟悉使用向量数学(具体来说,将向量归一化以计算方向,并将其相乘以获得所需的速度)。第二,你需要使用欧几里德距离公式(基本上就是毕达哥拉斯定理)来计算球之间的距离,确定它们何时足够接近彼此。网上有很多关于这些东西的教程,你可能会发现它们很有用


    如果您在编码过程中遇到某个特定问题,请随时发布更具体的问题(尽管请始终记住可能已经有人问过/回答过了)。

    向我们展示您已有的问题。我们想修复你的代码,而不是为你编写代码。你可以从第三部分开始,我需要将主球射向目标球,它的移动距离必须等于主球的移动距离。(单击==4){initialDistance=dist(target.xpos,target.ypos,cue.xpos,cue.ypos);difx=target.xpos-cue.xpos;dify=target.ypos-cue.ypos;text(“3.Aiming Shot!”,20340);target.update();cue.update();}如果(单击==5){currentDistance=dist(target.xpos,target.ypos,cue.xpos,cue.ypos),cue.ypos);如果(currentDistance>cue.ballDiam){//travel仍然远离中间,移动travel cue.xpos+=difx/speed;cue.ypos+=dify/speed;}代码很难在注释中读取。请将其添加到问题中。第一次和第二次单击完成!现在?第三次?否则(单击==4){initialDistance=dist(target.xpos,target.ypos,cue.xpos,cue.ypos,cue.ypos);difx=target.xpos-cue.xpos;dify=target.ypos-cue.ypos;文本(“3.瞄准射击!”,20340);target.update();cue.update();}else if(单击==5){currentDistance=dist(target.xpos,target.ypos,cue.xpos,cue.ypos);if(currentDistance>cue.ballDiam){//travel仍然远离中间位置,移动travel cue.xpos+=difx/speed;cue.ypos+=dify/speed;text(“正在进行”,10360);}}单击+++;}