6
6
import android .opengl .GLSurfaceView ;
7
7
import android .hardware .input .InputManager .InputDeviceListener ;
8
8
import android .opengl .Matrix ;
9
- import android .util .Log ;
10
9
import android .view .KeyEvent ;
11
10
import android .view .MotionEvent ;
12
11
13
12
import com .ptrprograms .asteroidbelttv .Objects .Asteroid ;
13
+ import com .ptrprograms .asteroidbelttv .Objects .Bullet ;
14
14
import com .ptrprograms .asteroidbelttv .Objects .Ship ;
15
- import com .ptrprograms .asteroidbelttv .Particles .BaseParticle ;
16
- import com .ptrprograms .asteroidbelttv .Particles .ParticleSystem ;
17
15
import com .ptrprograms .asteroidbelttv .Utils .Constants ;
18
16
import com .ptrprograms .asteroidbelttv .Utils .ShapeBuffer ;
19
17
import com .ptrprograms .asteroidbelttv .Utils .Utils ;
20
18
21
19
import java .util .ArrayList ;
22
20
import java .util .List ;
21
+ import java .util .ListIterator ;
23
22
24
23
import javax .microedition .khronos .egl .EGLConfig ;
25
24
import javax .microedition .khronos .opengles .GL10 ;
@@ -40,9 +39,8 @@ public class GameView extends GLSurfaceView implements GLSurfaceView.Renderer, I
40
39
private int mWindowWidth ;
41
40
private int mWindowHeight ;
42
41
private List <Asteroid > mAsteroids ;
43
- private static final int MAX_BULLET_PARTICLES = 100 ;
44
-
45
- private static ParticleSystem mShots ;
42
+ public List <Bullet > mBullets ;
43
+ private int mLevel = 1 ;
46
44
47
45
private final float [] mMVPMatrix = new float [16 ];
48
46
@@ -57,42 +55,78 @@ public GameView(Context context) {
57
55
58
56
mLastUpdateTimeMillis = System .currentTimeMillis ();
59
57
60
- mShip = new Ship ( this , Utils . Color . WHITE );
58
+ mShip = new Ship ();
61
59
62
60
InputManager inputManager = (InputManager ) context .getSystemService ( Context .INPUT_SERVICE );
63
61
inputManager .registerInputDeviceListener ( this , null );
64
62
mAsteroids = new ArrayList <Asteroid >();
65
-
66
- mShots = new ParticleSystem (MAX_BULLET_PARTICLES , true );
67
-
63
+ mBullets = new ArrayList <Bullet >();
68
64
initLevel ();
69
-
70
65
}
71
66
72
67
public static GameView getInstance () {
73
68
return mInstance ;
74
69
}
75
70
76
71
private void initLevel () {
77
- for ( int i = 0 ; i < 1 ; i ++ ) {
78
- mAsteroids .add (new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_LARGE ));
79
- mAsteroids .add ( new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_MEDIUM ) );
80
- mAsteroids .add ( new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_SMALL ) );
72
+ mShip .reset ();
73
+ if ( mBullets != null ) {
74
+ ListIterator <Bullet > iter = mBullets .listIterator ();
75
+ while ( iter .hasNext () ) {
76
+ iter .next ();
77
+ iter .remove ();
78
+ }
79
+ }
80
+ for ( int i = 0 ; i < mLevel + 2 ; i ++ ) {
81
+ mAsteroids .add ( new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_LARGE ));
81
82
}
82
83
}
83
84
84
85
private void update ( float delta ) {
86
+ if ( mAsteroids .isEmpty () ) {
87
+ mLevel ++;
88
+ initLevel ();
89
+ return ;
90
+ }
91
+
85
92
mShip .update ( delta );
86
- BaseParticle bullet = null ;
87
93
for ( Asteroid asteroid : mAsteroids ) {
88
94
asteroid .update ( delta );
89
- bullet = mShots .checkForCollision ( asteroid .mPositionX , asteroid .mPositionY , Constants .ASTEROID_SIZE_LARGE );
90
- if ( bullet != null ) {
91
- Log .e ("ASTEROIDS" , "bullet hit something" );
92
- bullet = null ;
95
+ }
96
+
97
+ ListIterator <Bullet > bulletIter = mBullets .listIterator ();
98
+ ListIterator <Asteroid > asteroidIter = mAsteroids .listIterator ();
99
+ Bullet bullet ;
100
+ Asteroid asteroid ;
101
+
102
+ while ( bulletIter .hasNext () ) {
103
+ bullet = bulletIter .next ();
104
+ bullet .update ( delta );
105
+ if ( bullet .mLifeTimer == 0 ) {
106
+ bulletIter .remove ();
107
+ }
108
+ }
109
+
110
+ while ( asteroidIter .hasNext () ) {
111
+ asteroid = asteroidIter .next ();
112
+ bulletIter = mBullets .listIterator ();
113
+ while ( bulletIter .hasNext () ) {
114
+ bullet = bulletIter .next ();
115
+ if ((bullet .mPositionX > asteroid .mPositionX && bullet .mPositionX < (asteroid .mPositionX + (2 * asteroid .mAsteroidSize ))
116
+ && (bullet .mPositionY > asteroid .mPositionY && bullet .mPositionY < (asteroid .mPositionY + (2 * asteroid .mAsteroidSize ))))) {
117
+ bulletIter .remove ();
118
+ asteroidIter .remove ();
119
+ if (asteroid .mAsteroidSize == Constants .ASTEROID_SIZE_LARGE ) {
120
+ asteroidIter .add (new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_MEDIUM , asteroid .mPositionX , asteroid .mPositionY ));
121
+ asteroidIter .add (new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_MEDIUM , asteroid .mPositionX , asteroid .mPositionY ));
122
+ } else if (asteroid .mAsteroidSize == Constants .ASTEROID_SIZE_MEDIUM ) {
123
+ asteroidIter .add (new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_SMALL , asteroid .mPositionX , asteroid .mPositionY ));
124
+ asteroidIter .add (new Asteroid (Utils .Color .RED , Constants .ASTEROID_SIZE_SMALL , asteroid .mPositionX , asteroid .mPositionY ));
125
+ }
126
+ break ;
127
+ }
93
128
}
94
129
}
95
- mShots .update ( delta );
96
130
}
97
131
98
132
@ Override
@@ -161,25 +195,21 @@ public void onSurfaceChanged(GL10 unused, int width, int height) {
161
195
}
162
196
163
197
public void draw () {
164
- // Each world element adds triangles to the shape buffer. No OpenGl calls are made
165
- // until after the whole scene has been added to the shape buffer.
166
198
mShapeBuffer .clear ();
167
- if (mShip .isActive ()) {
168
- mShip .draw (mShapeBuffer );
169
- }
199
+ mShip .draw (mShapeBuffer );
170
200
for ( Asteroid asteroid : mAsteroids ) {
171
201
asteroid .draw ( mShapeBuffer );
172
202
}
173
- mShots .draw ( mShapeBuffer );
174
- // Prepare for rendering to the screen.
203
+ for ( Bullet bullet : mBullets ) {
204
+ bullet .draw ( mShapeBuffer );
205
+ }
206
+
175
207
updateViewportAndProjection ();
176
208
177
- // Send the triangles to OpenGl.
178
209
mShapeBuffer .draw ( mMVPMatrix );
179
210
}
180
211
181
212
private void updateViewportAndProjection () {
182
- // Assume a square viewport if the width and height haven't been initialized.
183
213
float viewportAspectRatio = 1.0f ;
184
214
if ((mWindowWidth > 0 ) && (mWindowHeight > 0 )) {
185
215
viewportAspectRatio = (float ) mWindowWidth / (float ) mWindowHeight ;
@@ -237,8 +267,4 @@ public boolean handleKeyEvent(KeyEvent keyEvent) {
237
267
}
238
268
return false ;
239
269
}
240
-
241
- public static ParticleSystem getShots () {
242
- return mShots ;
243
- }
244
270
}
0 commit comments