Levels são definidos em arquivos XML. Cada Level tem um nome e um conjunto de Sequences e cada Sequence tem um tipo.
Atributos:
- name: apenas para informacão
- type: qual Sequence deve ser usada
Exemplo 1:
Este é um Level simples que tem a Sequence 1 e depois a Sequence 2.
1 2 3 4 5 |
<?xml version="1.0" encoding="utf-8"?> <level name="Example 1"> <sequence type="1" /> <sequence type="2" /> </level> |
Exemplo 2:
Este level tem a Sequence 1, depois a Sequence 2 e então duas Sequences 1.
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <level name="Example 2"> <sequence type="1" /> <sequence type="2" /> <sequence type="1" /> <sequence type="1" /> </level> |
Level.java
Todos os Levels estão definidos em uma única classe, assim como as Sequences e os Shots.
Levels tem um conjunto de Sequences. Esta classe é responsável por carregar os recursos e gerenciar todas as interações dos Levels.
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 156 157 158 159 160 161 162 163 164 |
package br.com.thiagorosa.pingpongmadness.tutorial.game; import java.io.IOException; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParserException; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import android.content.res.XmlResourceParser; import android.util.Log; import br.com.thiagorosa.pingpongmadness.tutorial.R; public class Level { // LOGS private static final String TAG = "[PPMT]"; private static final String TAG_NAME = "[Level] "; // SEQUENCE TYPES public static final int TYPE_NONE = 0; public static final int TYPE_TUTORIAL_001 = 1; // sequences 1,2,3 (37) protected int levelType = TYPE_NONE; // LEVEL MODES public static final int MODE_NONE = 0; public static final int MODE_NORMAL = 1; public static final int MODE_ENDLESS = 2; protected int levelMode = MODE_NONE; // MOVEMENT PATH public ArrayList<Level.Sequences> allLevel = null; private boolean isLevelLoaded = false; public Level(Resources resources, int type) { levelType = type; if (isLevelLoaded == false) { allLevel = loadLevel(resources, getLevelList(type)); if (allLevel != null && allLevel.size() > 0) { if (allLevel.get(0).getSequenceType() != 0) { levelMode = MODE_NORMAL; } else { levelMode = MODE_ENDLESS; } } isLevelLoaded = true; } } private int getLevelList(int type) { switch (type) { case TYPE_TUTORIAL_001: return R.xml.level_001; default: return R.xml.level_001; } } public int getLevelMode() { return levelMode; } public static boolean isTutorial(int level) { boolean tutorial = false; if (level == TYPE_TUTORIAL_001) { tutorial = true; } return tutorial; } /******************************************************************************************* *******************************************************************************************/ protected ArrayList<Level.Sequences> loadLevel(Resources resources, int content) { ArrayList<Level.Sequences> mSequence = new ArrayList<Level.Sequences>(); try { XmlResourceParser xrp = resources.getXml(content); while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) { if (xrp.getEventType() == XmlResourceParser.START_TAG) { String s = xrp.getName(); if (s.equals("level")) { // start level tag } else if (s.equals("sequence")) { // start sequence tag int type = xrp.getAttributeIntValue(null, "type", 0); // add sequence to the level mSequence.add(new Sequences(type)); } } else if (xrp.getEventType() == XmlResourceParser.END_TAG) { String s = xrp.getName(); if (s.equals("level")) { // end level tag } } xrp.next(); } xrp.close(); } catch (XmlPullParserException e) { Log.e(TAG, TAG_NAME + "error - exception / xmlpullparser " + e); } catch (IOException e) { Log.e(TAG, TAG_NAME + "error - exception / io " + e); } catch (NotFoundException e) { Log.e(TAG, TAG_NAME + "error - exception / notfound " + e); } return mSequence; } /******************************************************************************************* *******************************************************************************************/ public class Sequences { private int sequenceType = 0; private int sequenceStart = 0; private int sequenceEnd = 0; private int sequenceSeed = 0; private int sequenceAcceleration = 0; public Sequences(int type) { sequenceType = type; } public Sequences(int start, int end, int seed, int acceleration) { sequenceStart = start; sequenceEnd = end; sequenceSeed = seed; sequenceAcceleration = acceleration; } public int getSequenceType() { return sequenceType; } public int getSequenceStart() { return sequenceStart; } public int getSequenceEnd() { return sequenceEnd; } public int getSequenceSeed() { return sequenceSeed; } public int getSequenceAcceleration() { return sequenceAcceleration; } } } |
level_001.xml
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <level name="Level 001"> <sequence type="1" /> <sequence type="2" /> <sequence type="3" /> </level> |
Projeto SVN:
PingPong Madness Tutorial – Parte 04 SVN
APK:
PingPong Madness Tutorial – Parte 04.apk
Boa Noite, estou aprendendo a fazer jogos em Android e gostei muito do seu, parabéns…. um dia chego a esse nivel…
Então estava utilizando o seu código como base para aprendizagem… porém só vi agora que não está completo…
Você consegue me disponibilizar um exemplo de como posso chamar o Level.java para fazer rodar os level’s ?
Abraço e mais uma vez parabéns.
É verdade, não está completo! =(
Ainda faltam algumas coisas, não adianta chamar apenas o Level!
Vou colocar mais um trecho no próximo final de semana!