Subversion Repositories AndroidProjects

Rev

Rev 993 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
838 chris 1
package com.gebauz.burutaru.game.entities;
2
 
880 chris 3
import com.badlogic.gdx.audio.Sound;
868 chris 4
import com.badlogic.gdx.graphics.Texture.TextureFilter;
915 chris 5
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteFrame;
843 chris 6
import com.gebauz.bauzoid.graphics.sprite.AtlasSprite;
977 chris 7
import com.gebauz.bauzoid.graphics.sprite.AtlasSpriteInstance;
863 chris 8
import com.gebauz.bauzoid.graphics.sprite.Sprite;
841 chris 9
import com.gebauz.bauzoid.math.MathUtil;
977 chris 10
import com.gebauz.bauzoid.math.Matrix4;
11
import com.gebauz.bauzoid.math.collision.AABoundingBox;
12
import com.gebauz.bauzoid.math.collision.Shape;
13
import com.gebauz.bauzoid.math.collision.ShapeUtil;
841 chris 14
import com.gebauz.burutaru.GameConsts;
838 chris 15
import com.gebauz.burutaru.game.GameLogic;
16
 
17
public class Ship extends Entity
18
{
848 chris 19
 
20
        // Constants========================================================================================
21
 
879 chris 22
        public static final int SHIP_WIDTH = 64;
23
        public static final int SHIP_HEIGHT = 64;
839 chris 24
 
879 chris 25
        // HACK: for powerup pickup
26
        public static final float SHIP_RADIUS_SQR = SHIP_WIDTH*SHIP_WIDTH * 0.5f;
863 chris 27
 
879 chris 28
        public static final int NUM_UP_FRAMES = 5;
29
        public static final int NUM_DOWN_FRAMES = 5;
30
        public static final int NUM_SHIP_FRAMES = 1 + NUM_UP_FRAMES + NUM_DOWN_FRAMES;
31
        public static final int SHIP_SPRITE_SIZE = 128;
32
        public static final int NUM_SHIP_FRAMES_X = 4;
33
        public static final int NUM_SHIP_FRAMES_Y = 4;
34
        public static final float UPDOWN_ANIM_SPEED = 4.0f;
35
        public static final float UPDOWN_THRESHOLD = 20.0f;
864 chris 36
 
879 chris 37
        public static final float MUZZLEFLASH_DURATION = 0.15f;
38
        public static final float MUZZLEFLASH_SIZE = 40.0f;
865 chris 39
 
879 chris 40
        public static final float EXHAUST_WIDTH = 28;
41
        public static final float EXHAUST_HEIGHT = 16;
42
 
43
        public static final float EXHAUST_BOOST_MAX = 0.3f;
44
        public static final float EXHAUST_BOOST_MIN = -0.1f;
45
        public static final float EXHAUST_BOOST_FACTOR = 11.0f;
46
        public static final float EXHAUST_ANIM_SPEED = 4000.0f;
47
 
48
 
49
        public static final float ENGINE_BOOST_DURATION = 0.5f;
968 chris 50
 
971 chris 51
        public static final float BEAMSHOT_COOLDOWN_TIME = 0.2f;
977 chris 52
 
53
        public static final float DAMAGE_COOLDOWN_TIME = 0.2f;
848 chris 54
 
55
        // Embedded Types===================================================================================
843 chris 56
 
844 chris 57
        public enum MoveDirection
843 chris 58
        {
59
                NONE,
60
                UP,
61
                DOWN
62
        }      
63
 
848 chris 64
        // Fields===========================================================================================
65
 
838 chris 66
        private float mPositionX = 100;
67
        private float mPositionY = 100;
68
 
865 chris 69
        private float mLastMoveX = 0.0f;
70
        private float mLastMoveY = 0.0f;
71
 
843 chris 72
        private AtlasSprite mShipAtlas = null;
915 chris 73
        private AtlasSpriteFrame mShipFrames[] = new AtlasSpriteFrame[NUM_SHIP_FRAMES];
977 chris 74
        private AtlasSpriteInstance mSpriteInstance = null;
75
 
76
        private Shape mShipShape = null;
77
 
843 chris 78
        private int mCurrentShipFrame = 0;
79
        private MoveDirection mMoveDirection = MoveDirection.NONE;     
839 chris 80
 
863 chris 81
        private Sprite mMuzzleFlash = null;
82
        private float mMuzzleFlashTimer = -1.0f;
83
 
968 chris 84
        private float mBeamShotTimer = 0.0f;
85
 
864 chris 86
        private Sprite mEngineExhaust = null;
87
        private float mEngineExhaustScale = 1.0f;
865 chris 88
        private float mEngineExhaustBoost = 0.0f;
864 chris 89
 
843 chris 90
        private float mMoveDirectionCoeff = 0.0f;
845 chris 91
        private float mMoveDirectionCoeffTarget = 0.0f;
879 chris 92
 
93
        private float mEngineBoostTimer = 0.0f;
880 chris 94
 
95
        private Sound mEngineBoostSfx = null;
977 chris 96
 
97
        private float mDamageCoolDown = 0.0f;
864 chris 98
 
848 chris 99
        // Methods==========================================================================================
100
 
838 chris 101
        public Ship(GameLogic gameLogic)
102
        {
103
                super(gameLogic);
860 chris 104
                mShipAtlas = new AtlasSprite(getGraphics(), "data/textures/shipframes.png", "data/textures/ship.txt");
863 chris 105
                mMuzzleFlash = new Sprite(getGraphics(), "data/textures/plasma_muzzleflash.png");
864 chris 106
                mEngineExhaust = new Sprite(getGraphics(), "data/textures/engine_exhaust.png");
838 chris 107
        }
839 chris 108
 
109
        @Override
110
        public void initAsync()
111
        {
843 chris 112
                mShipAtlas.initAsync();
863 chris 113
                mMuzzleFlash.initAsync();
864 chris 114
                mEngineExhaust.initAsync();
839 chris 115
        }
838 chris 116
 
117
        @Override
118
        public void init()
119
        {
880 chris 120
                mEngineBoostSfx = getAudio().newManagedSound("data/sounds/speedup.wav");
121
 
843 chris 122
                mShipAtlas.init();
868 chris 123
                mShipAtlas.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
860 chris 124
                mShipAtlas.createSpriteInstances(mShipFrames);
863 chris 125
                mMuzzleFlash.init();
868 chris 126
                mMuzzleFlash.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
864 chris 127
                mEngineExhaust.init();
868 chris 128
                mEngineExhaust.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
977 chris 129
 
130
                mShipShape = ShapeUtil.createShapeFromFile("data/textures/ship.shape");
131
 
132
                mSpriteInstance = new AtlasSpriteInstance(getGraphics(), mShipAtlas, mShipFrames, mShipShape);
838 chris 133
        }
134
 
135
        @Override
136
        public void exit()
137
        {
977 chris 138
                mShipShape = null;
139
                mSpriteInstance = null;
140
 
843 chris 141
                for (int i = 0; i < NUM_SHIP_FRAMES; i++)
142
                {
143
                        mShipFrames[i] = null;
144
                }
145
 
146
                if (mShipAtlas != null)
147
                {
148
                        mShipAtlas.dispose();
149
                        mShipAtlas = null;
150
                }
863 chris 151
 
152
                if (mMuzzleFlash != null)
153
                {
154
                        mMuzzleFlash.dispose();
155
                        mMuzzleFlash = null;
156
                }
864 chris 157
 
158
                if (mEngineExhaust != null)
159
                {
160
                        mEngineExhaust.dispose();
161
                        mEngineExhaust = null;
162
                }
880 chris 163
 
164
                if (mEngineBoostSfx != null)
165
                {
166
                        getAudio().removeManagedSound(mEngineBoostSfx);
167
                        mEngineBoostSfx = null;
168
                }
838 chris 169
        }
170
 
171
        @Override
172
        public void update(float deltaTime)
839 chris 173
        {
843 chris 174
                if (mMoveDirection == MoveDirection.UP)
175
                {
176
                        // move towards -1
844 chris 177
                        mMoveDirectionCoeff -= deltaTime * UPDOWN_ANIM_SPEED;
846 chris 178
                        if (mMoveDirectionCoeff < mMoveDirectionCoeffTarget)
179
                                mMoveDirectionCoeff = mMoveDirectionCoeffTarget;
843 chris 180
                }
181
                else if (mMoveDirection == MoveDirection.DOWN)
182
                {
183
                        // move towards +1
846 chris 184
                        mMoveDirectionCoeff += deltaTime * UPDOWN_ANIM_SPEED;
185
                        if (mMoveDirectionCoeff > mMoveDirectionCoeffTarget)
186
                                mMoveDirectionCoeff = mMoveDirectionCoeffTarget;
843 chris 187
                }
844 chris 188
                else if (mMoveDirection == MoveDirection.NONE)
843 chris 189
                {
190
                        // move towards 0
191
                        if (mMoveDirectionCoeff > 0)
844 chris 192
                                mMoveDirectionCoeff = MathUtil.clamp(mMoveDirectionCoeff - deltaTime * UPDOWN_ANIM_SPEED, 0, 1);                               
843 chris 193
                        else if (mMoveDirectionCoeff < 0)
844 chris 194
                                mMoveDirectionCoeff = MathUtil.clamp(mMoveDirectionCoeff + deltaTime * UPDOWN_ANIM_SPEED, -1, 0);
843 chris 195
                }
196
 
844 chris 197
                mMoveDirectionCoeff = MathUtil.clamp(mMoveDirectionCoeff, -1, 1);
198
 
199
                if (mMoveDirectionCoeff > 0)
843 chris 200
                {
844 chris 201
                        mCurrentShipFrame = (int)(1 + (NUM_DOWN_FRAMES-1) * (mMoveDirectionCoeff));
843 chris 202
                }
844 chris 203
                else if (mMoveDirectionCoeff < 0)
843 chris 204
                {
844 chris 205
                        mCurrentShipFrame = (int)(1 + NUM_DOWN_FRAMES  + (NUM_UP_FRAMES-1) * (-mMoveDirectionCoeff));                  
843 chris 206
                }
207
                else
208
                {
209
                        mCurrentShipFrame = 0;
210
                }
211
 
845 chris 212
                //Gdx.app.log(GameConsts.LOG_TAG, "coeff = " + mMoveDirectionCoeff + ", frame = " + mCurrentShipFrame + ", dir = " + mMoveDirection);
844 chris 213
 
843 chris 214
                mCurrentShipFrame = MathUtil.clamp(mCurrentShipFrame, 0, NUM_SHIP_FRAMES-1);
864 chris 215
 
865 chris 216
                if (mLastMoveX > 0.0f)
217
                {
218
                        // grow
219
                        float diff = EXHAUST_BOOST_MAX - mEngineExhaustBoost;
220
                        mEngineExhaustBoost += diff * deltaTime * EXHAUST_BOOST_FACTOR;
221
                }
222
                else if (mLastMoveX < 0.0f)
223
                {
224
                        float diff = EXHAUST_BOOST_MIN - mEngineExhaustBoost;
225
                        mEngineExhaustBoost += diff * deltaTime * EXHAUST_BOOST_FACTOR;
226
                }
227
                else
228
                {
229
                        float diff = 0.0f - mEngineExhaustBoost;
230
                        mEngineExhaustBoost += diff * deltaTime * EXHAUST_BOOST_FACTOR;
231
                }
232
                mEngineExhaustScale = 0.9f + MathUtil.sin(getGame().getTime() * EXHAUST_ANIM_SPEED) * 0.05f + mEngineExhaustBoost;
879 chris 233
 
234
                if (mEngineBoostTimer > 0.0f)
235
                {
236
                        mEngineBoostTimer -= deltaTime;
237
                        if (mEngineBoostTimer < 0.0f)
238
                                mEngineBoostTimer = 0.0f;
239
                }
240
 
241
                mEngineExhaustScale += ((mEngineBoostTimer / ENGINE_BOOST_DURATION) * 1.8f);
242
 
855 chris 243
 
863 chris 244
                if (mMuzzleFlashTimer > 0.0f)
245
                        mMuzzleFlashTimer -= deltaTime;
968 chris 246
 
247
                if (mBeamShotTimer > 0.0f)
248
                        mBeamShotTimer -= deltaTime;
977 chris 249
 
250
                if (mDamageCoolDown > 0.0f)
251
                        mDamageCoolDown -= deltaTime;
855 chris 252
        }
253
 
254
        @Override
255
        public void render()
864 chris 256
        {
879 chris 257
 
258
                if (mEngineBoostTimer > 0.0f)
259
                {
955 chris 260
                        mMuzzleFlash.param.x = mPositionX;
900 chris 261
                        mMuzzleFlash.param.y = mPositionY - 1;
262
                        mMuzzleFlash.param.w = MUZZLEFLASH_SIZE * (1 + mEngineBoostTimer / ENGINE_BOOST_DURATION);
263
                        mMuzzleFlash.param.h = MUZZLEFLASH_SIZE * (1 + 0.5f*mEngineBoostTimer / ENGINE_BOOST_DURATION);
955 chris 264
                        mMuzzleFlash.param.pivotX = mMuzzleFlash.param.w;
900 chris 265
                        mMuzzleFlash.param.pivotY = mMuzzleFlash.param.h/2;
266
                        mMuzzleFlash.param.mirrorX = true;
267
                        mMuzzleFlash.param.alpha = (mEngineBoostTimer / ENGINE_BOOST_DURATION);
879 chris 268
                        mMuzzleFlash.render();
269
                }
270
 
900 chris 271
                mEngineExhaust.param.x = mPositionX - EXHAUST_WIDTH/2;
272
                mEngineExhaust.param.y = mPositionY - 1;
273
                mEngineExhaust.param.w = EXHAUST_WIDTH * mEngineExhaustScale;
274
                mEngineExhaust.param.h = EXHAUST_HEIGHT;
275
                mEngineExhaust.param.pivotX = mEngineExhaust.param.w;
276
                mEngineExhaust.param.pivotY = mEngineExhaust.param.h/2;
864 chris 277
                mEngineExhaust.render();
278
 
279
 
977 chris 280
                mSpriteInstance.param.x = mPositionX;
281
                mSpriteInstance.param.y = mPositionY;
282
                mSpriteInstance.param.w = SHIP_WIDTH;
283
                mSpriteInstance.param.h = SHIP_HEIGHT;
284
                mSpriteInstance.param.centerPivot();
285
                mSpriteInstance.renderFrame(mCurrentShipFrame);
286
 
287
                /*mShipFrames[mCurrentShipFrame].param.x = mPositionX;
899 chris 288
                mShipFrames[mCurrentShipFrame].param.y = mPositionY;
289
                mShipFrames[mCurrentShipFrame].param.w = SHIP_WIDTH;
290
                mShipFrames[mCurrentShipFrame].param.h = SHIP_HEIGHT;
864 chris 291
                mShipFrames[mCurrentShipFrame].centerPivot();
977 chris 292
                mShipFrames[mCurrentShipFrame].render();*/
864 chris 293
 
863 chris 294
                if (mMuzzleFlashTimer > 0.0f)
295
                {
900 chris 296
                        mMuzzleFlash.param.x = mPositionX + SHIP_WIDTH/2;
297
                        mMuzzleFlash.param.y = mPositionY;
298
                        mMuzzleFlash.param.w = MUZZLEFLASH_SIZE;
299
                        mMuzzleFlash.param.h = MUZZLEFLASH_SIZE;
300
                        mMuzzleFlash.param.pivotX = mMuzzleFlash.param.w/3 + 1.0f;
301
                        mMuzzleFlash.param.pivotY = mMuzzleFlash.param.h/2;
302
                        mMuzzleFlash.param.mirrorX = false;
303
                        mMuzzleFlash.param.alpha = mMuzzleFlashTimer/MUZZLEFLASH_DURATION;
863 chris 304
                        mMuzzleFlash.render();
305
                }
838 chris 306
        }
840 chris 307
 
844 chris 308
        public void moveBy(float x, float y, float deltaTime)
840 chris 309
        {
844 chris 310
                mPositionX += x*deltaTime;
311
                mPositionY += y*deltaTime;
841 chris 312
 
843 chris 313
                // TODO: scale with amount of y
844 chris 314
                if (y < -UPDOWN_THRESHOLD)
845 chris 315
                {
843 chris 316
                        mMoveDirection = MoveDirection.UP;
846 chris 317
                        //mMoveDirectionCoeffTarget = -1.0f;
318
                        mMoveDirectionCoeffTarget = (y + UPDOWN_THRESHOLD) * 0.01f;
845 chris 319
                }
844 chris 320
                else if (y > UPDOWN_THRESHOLD)
845 chris 321
                {
843 chris 322
                        mMoveDirection = MoveDirection.DOWN;
846 chris 323
                        mMoveDirectionCoeffTarget = (y - UPDOWN_THRESHOLD) * 0.01f;
845 chris 324
                }
843 chris 325
                else
845 chris 326
                {
843 chris 327
                        mMoveDirection = MoveDirection.NONE;
845 chris 328
                        mMoveDirectionCoeffTarget = 0.0f;
329
                }
843 chris 330
 
841 chris 331
                mPositionX = MathUtil.clamp(mPositionX, 0.0f, GameConsts.VIRTUAL_SCREEN_WIDTH);
332
                mPositionY = MathUtil.clamp(mPositionY, 0.0f, GameConsts.VIRTUAL_SCREEN_HEIGHT);
865 chris 333
 
334
                mLastMoveX = x * deltaTime;
335
                mLastMoveY = y * deltaTime;
840 chris 336
        }
844 chris 337
 
845 chris 338
        public void resetNoUpDownMovement()
844 chris 339
        {
340
                mMoveDirection = MoveDirection.NONE;
845 chris 341
                mMoveDirectionCoeffTarget = 0.0f;
844 chris 342
        }
851 chris 343
 
886 chris 344
        public void shoot()
345
        {
974 chris 346
                switch (getGameLogic().getShipParameters().getWeaponType())
347
                {
348
                case PLASMA_SHOT:
349
                        shootPlasma();
350
                        break;
351
                case BEAM_SHOT:
352
                        shootBeamShot();
353
                        break;
354
                case SPREAD_SHOT:
355
                        break;
356
                case NAPALM_SHOT:
357
                        break;
358
                }
359
 
973 chris 360
                shootMissile();
974 chris 361
                shootBomb();           
886 chris 362
        }
363
 
851 chris 364
        public void shootPlasma()
365
        {
366
                getGameLogic().getPlasmaShots().spawnShot(mPositionX + SHIP_WIDTH/2, mPositionY);
863 chris 367
                mMuzzleFlashTimer = MUZZLEFLASH_DURATION;
851 chris 368
        }
879 chris 369
 
886 chris 370
        public void shootMissile()
371
        {
891 chris 372
                if (getGameLogic().getShipParameters().areMissilesEnabled())
373
                        getGameLogic().getPowerUpMissile().launch(mPositionX + SHIP_WIDTH/3, mPositionY);
886 chris 374
        }
375
 
956 chris 376
        public void shootBomb()
377
        {
974 chris 378
                if (getGameLogic().getShipParameters().areBombsEnabled())
379
                        getGameLogic().getPowerUpBomb().launch(mPositionX + SHIP_WIDTH/3, mPositionY);
956 chris 380
        }
381
 
967 chris 382
        public void shootBeamShot()
383
        {
968 chris 384
                if (mBeamShotTimer <= 0.0f)
385
                {
386
                        getGameLogic().getBeamShots().spawnShot(mPositionX + SHIP_WIDTH/2, mPositionY);
387
                        mBeamShotTimer = BEAMSHOT_COOLDOWN_TIME;
388
                }
967 chris 389
        }
390
 
879 chris 391
        public void boostEngine()
392
        {
393
                // boost for speed up powerup
394
                mEngineBoostTimer = ENGINE_BOOST_DURATION;
880 chris 395
                mEngineBoostSfx.play();
879 chris 396
        }
977 chris 397
 
997 chris 398
        public void processHit(ICollidable collidable)
977 chris 399
        {
400
                if (mDamageCoolDown <= 0.0f)
401
                {
402
                        getGameLogic().getExplosions().spawn(mPositionX, mPositionY, 100);
403
                        mDamageCoolDown = DAMAGE_COOLDOWN_TIME;
404
                }
405
        }
838 chris 406
 
848 chris 407
        // Getters/Setters==================================================================================
879 chris 408
        public float getPositionX() { return mPositionX; }
409
        public float getPositionY() { return mPositionY; }
848 chris 410
 
977 chris 411
        public AABoundingBox getBounds() { return mSpriteInstance.param.getBoundingBox(); }
412
 
413
        /** Get the shape of the projectile for testing. */
414
        public Shape getShape() { return mShipShape; }
415
 
416
        /** Get the transformation of the shape for testing. */
417
        public Matrix4 getShapeTransform() { return mSpriteInstance.param.getTransform(); }
418
 
838 chris 419
}
839 chris 420
 
421