处理:KeyPressed并显示新的数据集(使用相同的密钥)?

时间:2018-05-09 01:29:06

标签: processing

我想知道每次按下处理中的KeyPressed相同的键时,我将如何获取一组不同的数据。显示的数据来自导入的文件,因此我正在执行的操作的代码如下:

import java.util.Scanner;
import java.io.*;

PImage cityMap;
FileInputStream in;
int Year=0;

void setup()
{
size(500,500);
cityMap=loadImage("cityMap.png");
background(cityMap);
}

void draw()
{
//EMPTY

}
void keyPressed() {

if(key==CODED)
{
if(keyCode==RIGHT)
{

  //2015 
  String fif[]= loadStrings("2015data.txt");
  for (int i=1; i<fif.length;i++)
  {
  Scanner sc= new Scanner(fif[i]);
  int xValue= sc.nextInt();
  int yValue= sc.nextInt();
  int pixelX= locX2PixX(xValue);
  int pixelY= locY2PixY(yValue);
  stroke(200,200,250);
  point(pixelX,pixelY); 
  }

  //2016
  String six[]= loadStrings("2016data.txt");
  if(
  for (int i=1; i<six.length;i++)
  {
  Scanner sc= new Scanner(six[i]);
  int xValue= sc.nextInt();
  int yValue= sc.nextInt();
  int pixelX2= locX2PixX(xValue);
  int pixelY2= locY2PixY(yValue);
  stroke(250,200,250);
  point(pixelX2,pixelY2);
  }
   //2017
  String seven[]= loadStrings("2017data.txt");
  for (int i=1; i<seven.length;i++)
  {
  Scanner sc= new Scanner(seven[i]);
  int xValue= sc.nextInt();
  int yValue= sc.nextInt();
  int pixelX3= locX2PixX(xValue);
  int pixelY3= locY2PixY(yValue);
  stroke(20,200,250);
  point(pixelX3,pixelY3); 
  }
  }
  }
  }

  int locX2(int locationX)
  {

  return((int)((6*locationX)-8));

  }

  int locY2(int locationY)

  {

  return((int)(8*locationY+8));
  }

我设法让代码运行减去那个功能。 我想我已经把大部分逻辑都解决了,我只想弄清楚这个节目一次只显示一组数据,然后再次按下同一个键后显示下一个数据。我以为我可能需要某种类型的if语句,可以使用我的年份变量?

2 个答案:

答案 0 :(得分:1)

(我不太了解Processing,但在关于通用计算机编程的评论中聊聊真是太傻了......)

听起来你需要维护&#34; state&#34;,这是一种说法变量的奇特方式,你可以在其中存储以前是否做过某些事情的信息,以及那是什么。

首先,你关心多少个州?听起来你有两个不同的选项,所以如果你添加初始状态,这在技术上会产生三个(但是对于只有两个有效状态我们现在可以忽略它)。好的,所以你的启动代码(构造函数或初始化程序,无论是Processing的典型代码)都会将某种变量设置为已知的起始值。

如何做到这一点取决于你。它可以是String或int或类似enum的高级内容。我们的想法是,这是一个可测试的,可设置的,持久的数据块,你知道它的含义。

每次处理&#34;事件&#34;按下按钮你会做两件事:

  1. 测试您之前初始化的状态并做出决定。在初始状态下,您要加载&#34; 2015&#34;数据。好。那样做。
  2. 更改保持状态的变量,使其位于&#34; next&#34;州。在2015年的州,我们希望将其更改为2016年,以便我们为下一个处理的按钮事件做好准备。
  3. 一个简单的例子是创建一个名为int的{​​{1}}或其他东西。在dataState中将此设置为2015.在您的按钮处理程序中有一个setupswitch语句,用于检查if可能的所有可能值,并运行相应的代码州。例如,如果设置为2015年,它将执行您在2015年需要做的任何事情,但最后应将dataState设置为2016,以便下次通过它进行2016年分支。

    2016年分公司对这个州的影响取决于你。如果您的代码需要具备该功能,则可以将其重置为2015年或继续到2017年。

    一些意见:

    • 您会注意到,处理2015数据的代码与处理2016数据的代码几乎相同。这是一个使用接受文件名的函数或方法并根据它做一些工作的机会,然后将状态设置为&#34; next&#34;状态。

    • 一旦你这样做了,那么你在按钮处理程序中的逻辑变成了一组很简短且易于理解的dataState ... if语句,只需调用该状态的相应函数即可。这样可以轻松添加2017年处理。代码总是增加功能,因此提前做好计划是件好事。

    • 一旦你对此非常擅长,你就会开始思考&#34;状态模型&#34;然后在你知道它之前,你想要把你的州作为一个班级进行管理,或者else if用一个大enum语句来推动整个工作。这是一个非常的常见模式,具有处理支持的嵌入式事件驱动代码。

答案 1 :(得分:1)

在变量中跟踪您的年份,并在按下该键时更改它。像这样的东西

    //start off one less than first desired year 
    int Year=2014;

    void keyPressed() { 
        if(key==CODED) { 
        if(keyCode==RIGHT) { 
            //increment year
            Year = Year+1;
            //Clamp year between 2015 and 2017
            Year= Math.max(2015, Math.min(2017, Year));
            String yr[]= loadStrings(Year +"data.txt"); 
                for (int i=1; i<yr.length;i++) { 
                    Scanner sc= new Scanner(yr[i]); 
                    int xValue= sc.nextInt(); 
                    int yValue= sc.nextInt(); 
                    int pixelX= locX2PixX(xValue);
                    int pixelY= locY2PixY(yValue);
                    stroke(200,200,250); 
                    point(pixelX,pixelY); 
                }
            }
        }
   }