Path情報の作成

まずリソースIDを書き換えるのが面倒になってきたので、自動的にできるようにした。

リソースIDを文字列から生成する方法
そのままズバリのエントリがあった。
http://d.hatena.ne.jp/graceful3715/20101208/1291823542
任意(と言ってもres/xml/以下の)XMLから読み込むためには・・・
http://blog.anoncom.net/2010/05/24/334.html

これら参考にしつつ、Android xml を作成してみる。


phase 01
map08

0
0
0
199
199
199
199
0


phase 02
map07

0
0
0
199
199
199
199
0


これは2つの面があり、2つとも0,0-0,199-199,199,199,0 という図形(正方形)がある面を表している。

コードは以下のような感じ。


/**
* エリア情報、パス情報を読み込む
*
* @param i 面数
*/
public void loadPathXML(int i) {
final int S_PHASE = 2;
final int S_PHASE_ATTRIBUTE = 3;
final int S_PATHS = 4;
try {
XmlPullParser parser = getResources().getXml(R.xml.paths);
try {
parser.setInput(getResources().openRawResource(R.xml.paths),
null);
} catch (NotFoundException e) {
Log.e("XML_ERROR 1", e.getMessage());
} catch (XmlPullParserException e) {
Log.e("XML_ERROR 2", e.getMessage());
}
mPhaseMap = new HashMap();
Map phase = null;
Map paths = null;
int phaseNumber = 0;
String phaseMapName = null;
String phaseMap = null;
String flagX = null;
String flagY = null;
int depth = 0;

loop:
for (int e = parser.getEventType(); e != XmlPullParser.END_DOCUMENT; e = parser
.next()) {
// keyword = new Keyword();

if (e == XmlPullParser.START_DOCUMENT) {
// ドキュメント開始
Log.d("XML:DOC", "START");
} else if (e == XmlPullParser.TEXT) {
// エレメントに囲まれている部分
String text = parser.getText();
Log.d("XML:TEXT", text);
switch (depth) {
case S_PHASE: {
Log.d("XML:TEXT", " depth = 2");
break;
}
case S_PHASE_ATTRIBUTE: {
Log.d("XML:TEXT", " depth = 3");
if (phaseMapName != null) {
phase.put(phaseMapName, text);
phaseMapName = null;
} else if (phaseMap != null) {
phase.put(phaseMap, text);
phaseMap = null;
}
break;
}
case S_PATHS: {
Log.d("XML:TEXT", " depth = 4");
if (flagX != null) {
paths.put(flagX, Integer.valueOf(text));
flagX = null;
} else if (flagY != null) {
paths.put(flagY, Integer.valueOf(text));
flagY = null;
}
break;
}
}
} else if (e == XmlPullParser.START_TAG) {
// エレメントの開始
depth++;
Log.d("XML:ELEM", "START " + depth);
// エレメント名
Log.d("XML:ELEM_NAME", parser.getName());

for (int a = 0; a < parser.getAttributeCount(); a++) {
// 属性情報
Log.d("XML:ELEM_ATTR", parser.getAttributeName(a)
+ " = " + parser.getAttributeValue(a));
switch (depth) {
case S_PHASE: {
if (parser.getName().equals("item")
&& parser.getAttributeName(a)
.equals("name")) {
phaseNumber = Integer.valueOf(parser
.getAttributeValue(a));
phase = new HashMap();
}
break;
}
case S_PHASE_ATTRIBUTE: {
if (parser.getAttributeValue(a).equals("mapName")) {
phaseMapName = parser.getAttributeValue(a);
} else if (parser.getAttributeValue(a)
.equals("map")) {
phaseMap = parser.getAttributeValue(a);
} else if (parser.getAttributeValue(a).equals(
"paths")) {
paths = new HashMap();
}
break;
}
case S_PATHS: {
if (parser.getAttributeValue(a).substring(0, 2)
.equals("x_")) {
flagX = parser.getAttributeValue(a)
.substring(2);
} else if (parser.getAttributeName(a)
.substring(0, 2).equals("y_")) {
flagY = parser.getAttributeValue(a)
.substring(2);
}
break;
}
}
}
} else if (e == XmlPullParser.END_TAG) {
// エレメントの終了
Log.d("XML:ELEM", "END " + depth);
switch (depth) {
case S_PHASE: {
// mPhaseMap.put(phaseNumber, (Object) phase);
if (phaseNumber == i) {
mPhaseMap = phase;
break loop;
}
phase = null;
break;
}
case S_PHASE_ATTRIBUTE: {
phase.put("paths", paths);
paths = null;
break;
}
case S_PATHS: {
break;
}
}
depth--;
}
}
} catch (NotFoundException e) {
Log.e("XML", e.getClass().getName() + ": " + e.getMessage());
} catch (XmlPullParserException e) {
Log.d("XML", e.getClass().getName() + ": " + e.getMessage());
for (StackTraceElement s : e.getStackTrace()) {
Log.d("TRACE", s.toString());
}
} catch (IOException e) {
Log.d("XML", e.getClass().getName() + ": " + e.getMessage());
}
}



パス情報には x0,y0 - x1,x2 - ... xn,yn が入っていれば良いので・・・
フリックして周辺にぶつかった時にフラグをオンにし、ぶつかった位置を記録しておく。
次にぶつかった時に、前回ぶつかった場所との距離を測定し、それより長いしかし最短のパスを得ることで切り取る面積が得られる。


・・・複数パスがある場合は・・・
考えていなかったので、次回に考えることにする。