我想知道每次按下处理中的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语句,可以使用我的年份变量?
答案 0 :(得分:1)
(我不太了解Processing,但在关于通用计算机编程的评论中聊聊真是太傻了......)
听起来你需要维护&#34; state&#34;,这是一种说法变量的奇特方式,你可以在其中存储以前是否做过某些事情的信息,以及那是什么。
首先,你关心多少个州?听起来你有两个不同的选项,所以如果你添加初始状态,这在技术上会产生三个(但是对于只有两个有效状态我们现在可以忽略它)。好的,所以你的启动代码(构造函数或初始化程序,无论是Processing的典型代码)都会将某种变量设置为已知的起始值。
如何做到这一点取决于你。它可以是String或int或类似enum
的高级内容。我们的想法是,这是一个可测试的,可设置的,持久的数据块,你知道它的含义。
每次处理&#34;事件&#34;按下按钮你会做两件事:
一个简单的例子是创建一个名为int
的{{1}}或其他东西。在dataState
中将此设置为2015.在您的按钮处理程序中有一个setup
或switch
语句,用于检查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);
}
}
}
}