-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
LevelLoader.java
155 lines (119 loc) · 4.67 KB
/
LevelLoader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package org.andengine.util.level;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.andengine.util.StreamUtils;
import org.andengine.util.debug.Debug;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import android.content.res.AssetManager;
import android.content.res.Resources;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 14:16:19 - 11.10.2010
*/
public class LevelLoader {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private String mAssetBasePath;
private IEntityLoader mDefaultEntityLoader;
private final HashMap<String, IEntityLoader> mEntityLoaders = new HashMap<String, IEntityLoader>();
// ===========================================================
// Constructors
// ===========================================================
public LevelLoader() {
this("");
}
public LevelLoader(final String pAssetBasePath) {
this.setAssetBasePath(pAssetBasePath);
}
// ===========================================================
// Getter & Setter
// ===========================================================
public IEntityLoader getDefaultEntityLoader() {
return this.mDefaultEntityLoader;
}
public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) {
this.mDefaultEntityLoader = pDefaultEntityLoader;
}
/**
* @param pAssetBasePath must end with '<code>/</code>' or have <code>.length() == 0</code>.
*/
public void setAssetBasePath(final String pAssetBasePath) {
if(pAssetBasePath.endsWith("/") || (pAssetBasePath.length() == 0)) {
this.mAssetBasePath = pAssetBasePath;
} else {
throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero.");
}
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
protected void onAfterLoadLevel() {
}
protected void onBeforeLoadLevel() {
}
// ===========================================================
// Methods
// ===========================================================
public void registerEntityLoader(final String pEntityName, final IEntityLoader pEntityLoader) {
this.mEntityLoaders.put(pEntityName, pEntityLoader);
}
public void registerEntityLoader(final String[] pEntityNames, final IEntityLoader pEntityLoader) {
final HashMap<String, IEntityLoader> entityLoaders = this.mEntityLoaders;
for(int i = pEntityNames.length - 1; i >= 0; i--) {
entityLoaders.put(pEntityNames[i], pEntityLoader);
}
}
public void loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws IOException {
this.loadLevelFromStream(pAssetManager.open(this.mAssetBasePath + pAssetPath));
}
public void loadLevelFromResource(final Resources pResources, final int pRawResourceID) throws IOException {
this.loadLevelFromStream(pResources.openRawResource(pRawResourceID));
}
public void loadLevelFromStream(final InputStream pInputStream) throws IOException {
try{
final SAXParserFactory spf = SAXParserFactory.newInstance();
final SAXParser sp = spf.newSAXParser();
final XMLReader xr = sp.getXMLReader();
this.onBeforeLoadLevel();
final LevelParser levelParser = new LevelParser(this.mDefaultEntityLoader, this.mEntityLoaders);
xr.setContentHandler(levelParser);
xr.parse(new InputSource(new BufferedInputStream(pInputStream)));
this.onAfterLoadLevel();
} catch (final SAXException se) {
Debug.e(se);
/* Doesn't happen. */
} catch (final ParserConfigurationException pe) {
Debug.e(pe);
/* Doesn't happen. */
} finally {
StreamUtils.close(pInputStream);
}
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public static interface IEntityLoader {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public void onLoadEntity(final String pEntityName, final Attributes pAttributes);
}
}