1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.replica.replicaisland; 18 19import java.util.Comparator; 20 21import com.replica.replicaisland.AnimationComponent.PlayerAnimations; 22import com.replica.replicaisland.CollisionParameters.HitType; 23import com.replica.replicaisland.EnemyAnimationComponent.EnemyAnimations; 24import com.replica.replicaisland.GameObject.ActionType; 25import com.replica.replicaisland.GameObject.Team; 26import com.replica.replicaisland.GenericAnimationComponent.Animation; 27 28/** A class for generating game objects at runtime. 29 * This should really be replaced with something that is data-driven, but it is hard to do data 30 * parsing quickly at runtime. For the moment this class is full of large functions that just 31 * patch pointers between objects, but in the future those functions should either be 32 * a) generated from data at compile time, or b) described by data at runtime. 33 */ 34public class GameObjectFactory extends BaseObject { 35 private final static int MAX_GAME_OBJECTS = 384; 36 private final static ComponentPoolComparator sComponentPoolComparator = new ComponentPoolComparator(); 37 private FixedSizeArray<FixedSizeArray<BaseObject>> mStaticData; 38 private FixedSizeArray<GameComponentPool> mComponentPools; 39 private GameComponentPool mPoolSearchDummy; 40 private GameObjectPool mGameObjectPool; 41 42 private float mTightActivationRadius; 43 private float mNormalActivationRadius; 44 private float mWideActivationRadius; 45 private float mAlwaysActive; 46 47 private final static String sRedButtonChannel = "RED BUTTON"; 48 private final static String sBlueButtonChannel = "BLUE BUTTON"; 49 private final static String sGreenButtonChannel = "GREEN BUTTON"; 50 private final static String sSurprisedNPCChannel = "SURPRISED"; 51 52 53 // A list of game objects that can be spawned at runtime. Note that the indicies of these 54 // objects must match the order of the object tileset in the level editor in order for the 55 // level content to make sense. 56 public enum GameObjectType { 57 INVALID(-1), 58 59 PLAYER (0), 60 61 // Collectables 62 COIN (1), 63 RUBY (2), 64 DIARY (3), 65 66 // Characters 67 WANDA (10), 68 KYLE (11), 69 KYLE_DEAD (12), 70 ANDOU_DEAD (13), 71 KABOCHA (26), 72 ROKUDOU_TERMINAL (27), 73 KABOCHA_TERMINAL (28), 74 EVIL_KABOCHA (29), 75 ROKUDOU (30), 76 77 // AI 78 BROBOT (16), 79 SNAILBOMB (17), 80 SHADOWSLIME (18), 81 MUDMAN (19), 82 SKELETON (20), 83 KARAGUIN (21), 84 PINK_NAMAZU (22), 85 TURRET (23), 86 TURRET_LEFT (24), 87 BAT (6), 88 STING(7), 89 ONION(8), 90 91 // Objects 92 DOOR_RED (32), 93 DOOR_BLUE (33), 94 DOOR_GREEN (34), 95 BUTTON_RED (35), 96 BUTTON_BLUE (36), 97 BUTTON_GREEN (37), 98 CANNON (38), 99 BROBOT_SPAWNER (39), 100 BROBOT_SPAWNER_LEFT (40), 101 BREAKABLE_BLOCK(41), 102 THE_SOURCE(42), 103 HINT_SIGN(43), 104 105 // Effects 106 DUST(48), 107 EXPLOSION_SMALL(49), 108 EXPLOSION_LARGE(50), 109 EXPLOSION_GIANT(51), 110 111 112 // Special Spawnable 113 DOOR_RED_NONBLOCKING (52), 114 DOOR_BLUE_NONBLOCKING (53), 115 DOOR_GREEN_NONBLOCKING (54), 116 117 GHOST_NPC(55), 118 119 CAMERA_BIAS(56), 120 121 FRAMERATE_WATCHER(57), 122 INFINITE_SPAWNER(58), 123 CRUSHER_ANDOU(59), 124 125 126 // Projectiles 127 ENERGY_BALL(68), 128 CANNON_BALL(65), 129 TURRET_BULLET(66), 130 BROBOT_BULLET(67), 131 BREAKABLE_BLOCK_PIECE(68), 132 BREAKABLE_BLOCK_PIECE_SPAWNER(69), 133 WANDA_SHOT(70), 134 135 // Special Objects -- Not spawnable normally 136 SMOKE_BIG(-1), 137 SMOKE_SMALL(-1), 138 139 CRUSH_FLASH(-1), 140 FLASH(-1), 141 142 PLAYER_JETS(-1), 143 PLAYER_SPARKS(-1), 144 PLAYER_GLOW(-1), 145 ENEMY_SPARKS(-1), 146 GHOST(-1), 147 SMOKE_POOF(-1), 148 GEM_EFFECT(-1), 149 GEM_EFFECT_SPAWNER(-1), 150 151 152 // End 153 OBJECT_COUNT(-1); 154 155 private final int mIndex; 156 GameObjectType(int index) { 157 this.mIndex = index; 158 } 159 160 public int index() { 161 return mIndex; 162 } 163 164 // TODO: Is there any better way to do this? 165 public static GameObjectType indexToType(int index) { 166 final GameObjectType[] valuesArray = values(); 167 GameObjectType foundType = INVALID; 168 for (int x = 0; x < valuesArray.length; x++) { 169 GameObjectType type = valuesArray[x]; 170 if (type.mIndex == index) { 171 foundType = type; 172 break; 173 } 174 } 175 return foundType; 176 } 177 178 } 179 180 public GameObjectFactory() { 181 super(); 182 183 mGameObjectPool = new GameObjectPool(MAX_GAME_OBJECTS); 184 185 final int objectTypeCount = GameObjectType.OBJECT_COUNT.ordinal(); 186 mStaticData = new FixedSizeArray<FixedSizeArray<BaseObject>>(objectTypeCount); 187 188 for (int x = 0; x < objectTypeCount; x++) { 189 mStaticData.add(null); 190 } 191 192 final ContextParameters context = sSystemRegistry.contextParameters; 193 final float halfHeight2 = (context.gameHeight * 0.5f) * (context.gameHeight * 0.5f); 194 final float halfWidth2 = (context.gameWidth * 0.5f) * (context.gameWidth * 0.5f); 195 final float screenSizeRadius = (float)Math.sqrt(halfHeight2 + halfWidth2); 196 mTightActivationRadius = screenSizeRadius + 128.0f; 197 mNormalActivationRadius = screenSizeRadius * 1.25f; 198 mWideActivationRadius = screenSizeRadius * 2.0f; 199 mAlwaysActive = -1.0f; 200 201 // TODO: I wish there was a way to do this automatically, but the ClassLoader doesn't seem 202 // to provide access to the currently loaded class list. There's some discussion of walking 203 // the actual class file objects and using forName() to instantiate them, but that sounds 204 // really heavy-weight. For now I'll rely on (sucky) manual enumeration. 205 class ComponentClass { 206 public Class<?> type; 207 public int poolSize; 208 public ComponentClass(Class<?> classType, int size) { 209 type = classType; 210 poolSize = size; 211 } 212 } 213 ComponentClass[] componentTypes = { 214 new ComponentClass(AnimationComponent.class, 1), 215 new ComponentClass(AttackAtDistanceComponent.class, 16), 216 new ComponentClass(BackgroundCollisionComponent.class, 192), 217 new ComponentClass(ButtonAnimationComponent.class, 32), 218 new ComponentClass(CameraBiasComponent.class, 8), 219 new ComponentClass(ChangeComponentsComponent.class, 256), 220 new ComponentClass(CrusherAndouComponent.class, 1), 221 new ComponentClass(DoorAnimationComponent.class, 256), //! 222 new ComponentClass(DynamicCollisionComponent.class, 256), 223 new ComponentClass(EnemyAnimationComponent.class, 256), 224 new ComponentClass(FadeDrawableComponent.class, 32), 225 new ComponentClass(FixedAnimationComponent.class, 8), 226 new ComponentClass(FrameRateWatcherComponent.class, 1), 227 new ComponentClass(GenericAnimationComponent.class, 32), 228 new ComponentClass(GhostComponent.class, 256), 229 new ComponentClass(GravityComponent.class, 128), 230 new ComponentClass(HitPlayerComponent.class, 256), 231 new ComponentClass(HitReactionComponent.class, 256), 232 new ComponentClass(InventoryComponent.class, 128), 233 new ComponentClass(LauncherComponent.class, 16), 234 new ComponentClass(LaunchProjectileComponent.class, 128), 235 new ComponentClass(LifetimeComponent.class, 384), 236 new ComponentClass(MotionBlurComponent.class, 1), 237 new ComponentClass(MovementComponent.class, 128), 238 new ComponentClass(NPCAnimationComponent.class, 8), 239 new ComponentClass(NPCComponent.class, 8), 240 new ComponentClass(OrbitalMagnetComponent.class, 1), 241 new ComponentClass(PatrolComponent.class, 256), 242 new ComponentClass(PhysicsComponent.class, 8), 243 new ComponentClass(PlayerComponent.class, 1), 244 new ComponentClass(PlaySingleSoundComponent.class, 128), 245 new ComponentClass(PopOutComponent.class, 32), 246 new ComponentClass(RenderComponent.class, 384), 247 new ComponentClass(ScrollerComponent.class, 8), 248 new ComponentClass(SelectDialogComponent.class, 8), 249 new ComponentClass(SimpleCollisionComponent.class, 32), 250 new ComponentClass(SimplePhysicsComponent.class, 256), 251 new ComponentClass(SleeperComponent.class, 32), 252 new ComponentClass(SolidSurfaceComponent.class, 16), 253 new ComponentClass(SpriteComponent.class, 384), 254 new ComponentClass(TheSourceComponent.class, 1), 255 256 }; 257 258 mComponentPools = new FixedSizeArray<GameComponentPool>(componentTypes.length, sComponentPoolComparator); 259 for (int x = 0; x < componentTypes.length; x++) { 260 ComponentClass component = componentTypes[x]; 261 mComponentPools.add(new GameComponentPool(component.type, component.poolSize)); 262 } 263 mComponentPools.sort(true); 264 265 mPoolSearchDummy = new GameComponentPool(Object.class, 1); 266 267 } 268 269 @Override 270 public void reset() { 271 272 } 273 274 protected GameComponentPool getComponentPool(Class<?> componentType) { 275 GameComponentPool pool = null; 276 mPoolSearchDummy.objectClass = componentType; 277 final int index = mComponentPools.find(mPoolSearchDummy, false); 278 if (index != -1) { 279 pool = mComponentPools.get(index); 280 } 281 return pool; 282 } 283 284 protected GameComponent allocateComponent(Class<?> componentType) { 285 GameComponentPool pool = getComponentPool(componentType); 286 assert pool != null; 287 GameComponent component = null; 288 if (pool != null) { 289 component = pool.allocate(); 290 } 291 return component; 292 } 293 294 protected void releaseComponent(GameComponent component) { 295 GameComponentPool pool = getComponentPool(component.getClass()); 296 assert pool != null; 297 if (pool != null) { 298 component.reset(); 299 component.shared = false; 300 pool.release(component); 301 } 302 } 303 304 protected boolean componentAvailable(Class<?> componentType, int count) { 305 boolean canAllocate = false; 306 GameComponentPool pool = getComponentPool(componentType); 307 assert pool != null; 308 if (pool != null) { 309 canAllocate = pool.getAllocatedCount() + count < pool.getSize(); 310 } 311 return canAllocate; 312 } 313 314 public void preloadEffects() { 315 // These textures appear in every level, so they are long-term. 316 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 317 textureLibrary.allocateTexture(R.drawable.dust01); 318 textureLibrary.allocateTexture(R.drawable.dust02); 319 textureLibrary.allocateTexture(R.drawable.dust03); 320 textureLibrary.allocateTexture(R.drawable.dust04); 321 textureLibrary.allocateTexture(R.drawable.dust05); 322 323 textureLibrary.allocateTexture(R.drawable.effect_energyball01); 324 textureLibrary.allocateTexture(R.drawable.effect_energyball02); 325 textureLibrary.allocateTexture(R.drawable.effect_energyball03); 326 textureLibrary.allocateTexture(R.drawable.effect_energyball04); 327 328 textureLibrary.allocateTexture(R.drawable.effect_explosion_small01); 329 textureLibrary.allocateTexture(R.drawable.effect_explosion_small02); 330 textureLibrary.allocateTexture(R.drawable.effect_explosion_small03); 331 textureLibrary.allocateTexture(R.drawable.effect_explosion_small04); 332 textureLibrary.allocateTexture(R.drawable.effect_explosion_small05); 333 textureLibrary.allocateTexture(R.drawable.effect_explosion_small06); 334 textureLibrary.allocateTexture(R.drawable.effect_explosion_small07); 335 336 textureLibrary.allocateTexture(R.drawable.effect_explosion_big01); 337 textureLibrary.allocateTexture(R.drawable.effect_explosion_big02); 338 textureLibrary.allocateTexture(R.drawable.effect_explosion_big03); 339 textureLibrary.allocateTexture(R.drawable.effect_explosion_big04); 340 textureLibrary.allocateTexture(R.drawable.effect_explosion_big05); 341 textureLibrary.allocateTexture(R.drawable.effect_explosion_big06); 342 textureLibrary.allocateTexture(R.drawable.effect_explosion_big07); 343 textureLibrary.allocateTexture(R.drawable.effect_explosion_big08); 344 textureLibrary.allocateTexture(R.drawable.effect_explosion_big09); 345 346 textureLibrary.allocateTexture(R.drawable.effect_smoke_big01); 347 textureLibrary.allocateTexture(R.drawable.effect_smoke_big02); 348 textureLibrary.allocateTexture(R.drawable.effect_smoke_big03); 349 textureLibrary.allocateTexture(R.drawable.effect_smoke_big04); 350 textureLibrary.allocateTexture(R.drawable.effect_smoke_big05); 351 352 textureLibrary.allocateTexture(R.drawable.effect_smoke_small01); 353 textureLibrary.allocateTexture(R.drawable.effect_smoke_small02); 354 textureLibrary.allocateTexture(R.drawable.effect_smoke_small03); 355 textureLibrary.allocateTexture(R.drawable.effect_smoke_small04); 356 textureLibrary.allocateTexture(R.drawable.effect_smoke_small05); 357 358 textureLibrary.allocateTexture(R.drawable.effect_crush_back01); 359 textureLibrary.allocateTexture(R.drawable.effect_crush_back02); 360 textureLibrary.allocateTexture(R.drawable.effect_crush_back03); 361 textureLibrary.allocateTexture(R.drawable.effect_crush_front01); 362 textureLibrary.allocateTexture(R.drawable.effect_crush_front02); 363 textureLibrary.allocateTexture(R.drawable.effect_crush_front03); 364 textureLibrary.allocateTexture(R.drawable.effect_crush_front04); 365 textureLibrary.allocateTexture(R.drawable.effect_crush_front05); 366 textureLibrary.allocateTexture(R.drawable.effect_crush_front06); 367 textureLibrary.allocateTexture(R.drawable.effect_crush_front07); 368 } 369 370 public void destroy(GameObject object) { 371 object.commitUpdates(); 372 final int componentCount = object.getCount(); 373 for (int x = 0; x < componentCount; x++) { 374 GameComponent component = (GameComponent)object.get(x); 375 if (!component.shared) { 376 releaseComponent(component); 377 } 378 } 379 object.removeAll(); 380 object.commitUpdates(); 381 mGameObjectPool.release(object); 382 } 383 384 public GameObject spawn(GameObjectType type, float x, float y, boolean horzFlip) { 385 GameObject newObject = null; 386 switch(type) { 387 case PLAYER: 388 newObject = spawnPlayer(x, y); 389 break; 390 case COIN: 391 newObject = spawnCoin(x, y); 392 break; 393 case RUBY: 394 newObject = spawnRuby(x, y); 395 break; 396 case DIARY: 397 newObject = spawnDiary(x, y); 398 break; 399 case WANDA: 400 newObject = spawnEnemyWanda(x, y, true); 401 break; 402 case KYLE: 403 newObject = spawnEnemyKyle(x, y, true); 404 break; 405 case KYLE_DEAD: 406 newObject = spawnEnemyKyleDead(x, y); 407 break; 408 case ANDOU_DEAD: 409 newObject = spawnEnemyAndouDead(x, y); 410 break; 411 case KABOCHA: 412 newObject = spawnEnemyKabocha(x, y, true); 413 break; 414 case ROKUDOU_TERMINAL: 415 newObject = spawnRokudouTerminal(x, y); 416 break; 417 case KABOCHA_TERMINAL: 418 newObject = spawnKabochaTerminal(x, y); 419 break; 420 case EVIL_KABOCHA: 421 newObject = spawnEnemyEvilKabocha(x, y, true); 422 break; 423 case ROKUDOU: 424 newObject = spawnEnemyRokudou(x, y, true); 425 break; 426 case BROBOT: 427 newObject = spawnEnemyBrobot(x, y, horzFlip); 428 break; 429 case SNAILBOMB: 430 newObject = spawnEnemySnailBomb(x, y, horzFlip); 431 break; 432 case SHADOWSLIME: 433 newObject = spawnEnemyShadowSlime(x, y, horzFlip); 434 break; 435 case MUDMAN: 436 newObject = spawnEnemyMudman(x, y, horzFlip); 437 break; 438 case SKELETON: 439 newObject = spawnEnemySkeleton(x, y, horzFlip); 440 break; 441 case KARAGUIN: 442 newObject = spawnEnemyKaraguin(x, y, horzFlip); 443 break; 444 case PINK_NAMAZU: 445 newObject = spawnEnemyPinkNamazu(x, y, horzFlip); 446 break; 447 case BAT: 448 newObject = spawnEnemyBat(x, y, horzFlip); 449 break; 450 case STING: 451 newObject = spawnEnemySting(x, y, horzFlip); 452 break; 453 case ONION: 454 newObject = spawnEnemyOnion(x, y, horzFlip); 455 break; 456 case TURRET: 457 case TURRET_LEFT: 458 newObject = spawnObjectTurret(x, y, (type == GameObjectType.TURRET_LEFT)); 459 break; 460 case DOOR_RED: 461 case DOOR_RED_NONBLOCKING: 462 newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_RED, (type == GameObjectType.DOOR_RED)); 463 break; 464 case DOOR_BLUE: 465 case DOOR_BLUE_NONBLOCKING: 466 newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_BLUE, (type == GameObjectType.DOOR_BLUE)); 467 break; 468 case DOOR_GREEN: 469 case DOOR_GREEN_NONBLOCKING: 470 newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_GREEN, (type == GameObjectType.DOOR_GREEN)); 471 break; 472 case BUTTON_RED: 473 newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_RED); 474 break; 475 case BUTTON_BLUE: 476 newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_BLUE); 477 break; 478 case BUTTON_GREEN: 479 newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_GREEN); 480 break; 481 case CANNON: 482 newObject = spawnObjectCannon(x, y); 483 break; 484 case BROBOT_SPAWNER: 485 case BROBOT_SPAWNER_LEFT: 486 newObject = spawnObjectBrobotSpawner(x, y, (type == GameObjectType.BROBOT_SPAWNER_LEFT)); 487 break; 488 case BREAKABLE_BLOCK: 489 newObject = spawnObjectBreakableBlock(x, y); 490 break; 491 case THE_SOURCE: 492 newObject = spawnObjectTheSource(x, y); 493 break; 494 case HINT_SIGN: 495 newObject = spawnObjectSign(x, y); 496 break; 497 case DUST: 498 newObject = spawnDust(x, y, horzFlip); 499 break; 500 case EXPLOSION_SMALL: 501 newObject = spawnEffectExplosionSmall(x, y); 502 break; 503 case EXPLOSION_LARGE: 504 newObject = spawnEffectExplosionLarge(x, y); 505 break; 506 case EXPLOSION_GIANT: 507 newObject = spawnEffectExplosionGiant(x, y); 508 break; 509 case GHOST_NPC: 510 newObject = spawnGhostNPC(x, y); 511 break; 512 case CAMERA_BIAS: 513 newObject = spawnCameraBias(x, y); 514 break; 515 case FRAMERATE_WATCHER: 516 newObject = spawnFrameRateWatcher(x, y); 517 break; 518 case INFINITE_SPAWNER: 519 newObject = spawnObjectInfiniteSpawner(x, y); 520 break; 521 case CRUSHER_ANDOU: 522 newObject = spawnObjectCrusherAndou(x,y); 523 break; 524 case SMOKE_BIG: 525 newObject = spawnEffectSmokeBig(x, y); 526 break; 527 case SMOKE_SMALL: 528 newObject = spawnEffectSmokeSmall(x, y); 529 break; 530 case CRUSH_FLASH: 531 newObject = spawnEffectCrushFlash(x, y); 532 break; 533 case FLASH: 534 newObject = spawnEffectFlash(x, y); 535 break; 536 537 case ENERGY_BALL: 538 newObject = spawnEnergyBall(x, y, horzFlip); 539 break; 540 case CANNON_BALL: 541 newObject = spawnCannonBall(x, y, horzFlip); 542 break; 543 case TURRET_BULLET: 544 newObject = spawnTurretBullet(x, y, horzFlip); 545 break; 546 case BROBOT_BULLET: 547 newObject = spawnBrobotBullet(x, y, horzFlip); 548 break; 549 case BREAKABLE_BLOCK_PIECE: 550 newObject = spawnBreakableBlockPiece(x, y); 551 break; 552 case BREAKABLE_BLOCK_PIECE_SPAWNER: 553 newObject = spawnBreakableBlockPieceSpawner(x, y); 554 break; 555 case WANDA_SHOT: 556 newObject = spawnWandaShot(x, y, horzFlip); 557 break; 558 case SMOKE_POOF: 559 newObject = spawnSmokePoof(x, y); 560 break; 561 case GEM_EFFECT: 562 newObject = spawnGemEffect(x, y); 563 break; 564 case GEM_EFFECT_SPAWNER: 565 newObject = spawnGemEffectSpawner(x, y); 566 break; 567 } 568 569 return newObject; 570 } 571 572 573 574 public void spawnFromWorld(TiledWorld world, int tileWidth, int tileHeight) { 575 // Walk the world and spawn objects based on tile indexes. 576 final float worldHeight = world.getHeight() * tileHeight; 577 GameObjectManager manager = sSystemRegistry.gameObjectManager; 578 if (manager != null) { 579 for (int y = 0; y < world.getHeight(); y++) { 580 for (int x = 0; x < world.getWidth(); x++) { 581 int index = world.getTile(x, y); 582 if (index != -1) { 583 GameObjectType type = GameObjectType.indexToType(index); 584 if (type != GameObjectType.INVALID) { 585 final float worldX = x * tileWidth; 586 final float worldY = worldHeight - ((y + 1) * tileHeight); 587 GameObject object = spawn(type, worldX, worldY, false); 588 if (object != null) { 589 if (object.height < tileHeight) { 590 // make sure small objects are vertically centered in their 591 // tile. 592 object.getPosition().y += (tileHeight - object.height) / 2.0f; 593 } 594 if (object.width < tileWidth) { 595 object.getPosition().x += (tileWidth - object.width) / 2.0f; 596 } else if (object.width > tileWidth) { 597 object.getPosition().x -= (object.width - tileWidth) / 2.0f; 598 } 599 manager.add(object); 600 if (type == GameObjectType.PLAYER) { 601 manager.setPlayer(object); 602 } 603 } 604 } 605 } 606 } 607 } 608 } 609 } 610 611 612 private FixedSizeArray<BaseObject> getStaticData(GameObjectType type) { 613 return mStaticData.get(type.ordinal()); 614 } 615 616 private void setStaticData(GameObjectType type, FixedSizeArray<BaseObject> data) { 617 int index = type.ordinal(); 618 assert mStaticData.get(index) == null; 619 620 final int staticDataCount = data.getCount(); 621 622 for (int x = 0; x < staticDataCount; x++) { 623 BaseObject entry = data.get(x); 624 if (entry instanceof GameComponent) { 625 ((GameComponent) entry).shared = true; 626 } 627 } 628 629 mStaticData.set(index, data); 630 } 631 632 private void addStaticData(GameObjectType type, GameObject object, SpriteComponent sprite) { 633 FixedSizeArray<BaseObject> staticData = getStaticData(type); 634 assert staticData != null; 635 636 if (staticData != null) { 637 final int staticDataCount = staticData.getCount(); 638 639 for (int x = 0; x < staticDataCount; x++) { 640 BaseObject entry = staticData.get(x); 641 if (entry instanceof GameComponent && object != null) { 642 object.add((GameComponent)entry); 643 } else if (entry instanceof SpriteAnimation && sprite != null) { 644 sprite.addAnimation((SpriteAnimation)entry); 645 } 646 } 647 } 648 } 649 650 public void clearStaticData() { 651 final int typeCount = mStaticData.getCount(); 652 for (int x = 0; x < typeCount; x++) { 653 FixedSizeArray<BaseObject> staticData = mStaticData.get(x); 654 if (staticData != null) { 655 final int count = staticData.getCount(); 656 for (int y = 0; y < count; y++) { 657 BaseObject entry = staticData.get(y); 658 if (entry != null) { 659 if (entry instanceof GameComponent) { 660 releaseComponent((GameComponent)entry); 661 } 662 } 663 } 664 staticData.clear(); 665 mStaticData.set(x, null); 666 } 667 } 668 } 669 670 public void sanityCheckPools() { 671 final int outstandingObjects = mGameObjectPool.getAllocatedCount(); 672 if (outstandingObjects != 0) { 673 DebugLog.d("Sanity Check", "Outstanding game object allocations! (" 674 + outstandingObjects + ")"); 675 assert false; 676 } 677 678 final int componentPoolCount = mComponentPools.getCount(); 679 for (int x = 0; x < componentPoolCount; x++) { 680 final int outstandingComponents = mComponentPools.get(x).getAllocatedCount(); 681 682 if (outstandingComponents != 0) { 683 DebugLog.d("Sanity Check", "Outstanding " 684 + mComponentPools.get(x).objectClass.getSimpleName() 685 + " allocations! (" + outstandingComponents + ")"); 686 //assert false; 687 } 688 } 689 } 690 691 public GameObject spawnPlayer(float positionX, float positionY) { 692 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 693 694 GameObject object = mGameObjectPool.allocate(); 695 object.getPosition().set(positionX, positionY); 696 object.activationRadius = mAlwaysActive; 697 object.width = 64; 698 object.height = 64; 699 700 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PLAYER); 701 702 if (staticData == null) { 703 final int staticObjectCount = 13; 704 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 705 706 GameComponent gravity = allocateComponent(GravityComponent.class); 707 GameComponent movement = allocateComponent(MovementComponent.class); 708 PhysicsComponent physics = (PhysicsComponent)allocateComponent(PhysicsComponent.class); 709 710 physics.setMass(9.1f); // ~90kg w/ earth gravity 711 physics.setDynamicFrictionCoeffecient(0.2f); 712 physics.setStaticFrictionCoeffecient(0.01f); 713 714 // Animation Data 715 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 716 new FixedSizeArray<CollisionVolume>(1); 717 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 718 719 FixedSizeArray<CollisionVolume> pressAndCollectVolume = 720 new FixedSizeArray<CollisionVolume>(2); 721 AABoxCollisionVolume collectionVolume = new AABoxCollisionVolume(16, 0, 32, 48); 722 collectionVolume.setHitType(HitType.COLLECT); 723 pressAndCollectVolume.add(collectionVolume); 724 AABoxCollisionVolume pressCollisionVolume = new AABoxCollisionVolume(16, 0, 32, 16); 725 pressCollisionVolume.setHitType(HitType.DEPRESS); 726 pressAndCollectVolume.add(pressCollisionVolume); 727 728 SpriteAnimation idle = new SpriteAnimation(PlayerAnimations.IDLE.ordinal(), 1); 729 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stand), 730 1.0f, pressAndCollectVolume, basicVulnerabilityVolume)); 731 732 SpriteAnimation angle = new SpriteAnimation(PlayerAnimations.MOVE.ordinal(), 1); 733 angle.addFrame( 734 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag01), 735 0.0416f, pressAndCollectVolume, basicVulnerabilityVolume)); 736 737 SpriteAnimation extremeAngle = new SpriteAnimation( 738 PlayerAnimations.MOVE_FAST.ordinal(), 1); 739 extremeAngle.addFrame( 740 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore01), 741 0.0416f, pressAndCollectVolume, basicVulnerabilityVolume)); 742 743 SpriteAnimation up = new SpriteAnimation(PlayerAnimations.BOOST_UP.ordinal(), 2); 744 up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup02), 745 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 746 up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup03), 747 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 748 up.setLoop(true); 749 750 SpriteAnimation boostAngle = new SpriteAnimation(PlayerAnimations.BOOST_MOVE.ordinal(), 2); 751 boostAngle.addFrame( 752 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag02), 753 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 754 boostAngle.addFrame( 755 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag03), 756 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 757 boostAngle.setLoop(true); 758 759 SpriteAnimation boostExtremeAngle = new SpriteAnimation( 760 PlayerAnimations.BOOST_MOVE_FAST.ordinal(), 2); 761 boostExtremeAngle.addFrame( 762 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore02), 763 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 764 boostExtremeAngle.addFrame( 765 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore03), 766 Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume)); 767 boostExtremeAngle.setLoop(true); 768 769 FixedSizeArray<CollisionVolume> stompAttackVolume = 770 new FixedSizeArray<CollisionVolume>(3); 771 stompAttackVolume.add(new AABoxCollisionVolume(16, -5.0f, 32, 37, HitType.HIT)); 772 stompAttackVolume.add(pressCollisionVolume); 773 stompAttackVolume.add(collectionVolume); 774 775 SpriteAnimation stomp = new SpriteAnimation(PlayerAnimations.STOMP.ordinal(), 4); 776 stomp.addFrame( 777 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp01), 778 Utils.framesToTime(24, 1), stompAttackVolume, null)); 779 stomp.addFrame( 780 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp02), 781 Utils.framesToTime(24, 1), stompAttackVolume, null)); 782 stomp.addFrame( 783 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp03), 784 Utils.framesToTime(24, 1), stompAttackVolume, null)); 785 stomp.addFrame( 786 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp04), 787 Utils.framesToTime(24, 1), stompAttackVolume, null)); 788 789 SpriteAnimation hitReactAnim = new SpriteAnimation(PlayerAnimations.HIT_REACT.ordinal(), 1); 790 hitReactAnim.addFrame( 791 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_hit), 792 0.1f, pressAndCollectVolume, null)); 793 794 SpriteAnimation deathAnim = new SpriteAnimation(PlayerAnimations.DEATH.ordinal(), 16); 795 AnimationFrame death1 = 796 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die01), 797 Utils.framesToTime(24, 1), null, null); 798 AnimationFrame death2 = 799 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die02), 800 Utils.framesToTime(24, 1), null, null); 801 deathAnim.addFrame(death1); 802 deathAnim.addFrame(death2); 803 deathAnim.addFrame(death1); 804 deathAnim.addFrame(death2); 805 deathAnim.addFrame( 806 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode01), 807 Utils.framesToTime(24, 1), null, null)); 808 deathAnim.addFrame( 809 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode02), 810 Utils.framesToTime(24, 1), null, null)); 811 deathAnim.addFrame( 812 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode03), 813 Utils.framesToTime(24, 1), null, null)); 814 deathAnim.addFrame( 815 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode04), 816 Utils.framesToTime(24, 1), null, null)); 817 deathAnim.addFrame( 818 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode05), 819 Utils.framesToTime(24, 2), null, null)); 820 deathAnim.addFrame( 821 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode06), 822 Utils.framesToTime(24, 2), null, null)); 823 deathAnim.addFrame( 824 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode07), 825 Utils.framesToTime(24, 2), null, null)); 826 deathAnim.addFrame( 827 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode08), 828 Utils.framesToTime(24, 2), null, null)); 829 deathAnim.addFrame( 830 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode09), 831 Utils.framesToTime(24, 2), null, null)); 832 deathAnim.addFrame( 833 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode10), 834 Utils.framesToTime(24, 2), null, null)); 835 deathAnim.addFrame( 836 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode11), 837 Utils.framesToTime(24, 2), null, null)); 838 deathAnim.addFrame( 839 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12), 840 Utils.framesToTime(24, 2), null, null)); 841 842 843 SpriteAnimation frozenAnim = new SpriteAnimation(PlayerAnimations.FROZEN.ordinal(), 1); 844 // Frozen has no frames! 845 846 847 // Save static data 848 staticData.add(gravity); 849 staticData.add(movement); 850 staticData.add(physics); 851 852 853 staticData.add(idle); 854 staticData.add(angle); 855 staticData.add(extremeAngle); 856 staticData.add(up); 857 staticData.add(boostAngle); 858 staticData.add(boostExtremeAngle); 859 staticData.add(stomp); 860 staticData.add(hitReactAnim); 861 staticData.add(deathAnim); 862 staticData.add(frozenAnim); 863 864 setStaticData(GameObjectType.PLAYER, staticData); 865 } 866 867 868 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 869 render.setPriority(SortConstants.PLAYER); 870 BackgroundCollisionComponent bgcollision 871 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 872 bgcollision.setSize(32, 48); 873 bgcollision.setOffset(16, 0); 874 PlayerComponent player = (PlayerComponent)allocateComponent(PlayerComponent.class); 875 AnimationComponent animation = 876 (AnimationComponent)allocateComponent(AnimationComponent.class); 877 878 animation.setPlayer(player); 879 SoundSystem sound = sSystemRegistry.soundSystem; 880 if (sound != null) { 881 animation.setLandThump(sound.load(R.raw.thump)); 882 animation.setRocketSound(sound.load(R.raw.rockets)); 883 animation.setRubySounds(sound.load(R.raw.gem1), sound.load(R.raw.gem2), sound.load(R.raw.gem3)); 884 animation.setExplosionSound(sound.load(R.raw.sound_explode)); 885 } 886 887 888 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 889 sprite.setSize((int)object.width, (int)object.height); 890 sprite.setRenderComponent(render); 891 animation.setSprite(sprite); 892 893 894 895 DynamicCollisionComponent dynamicCollision 896 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 897 sprite.setCollisionComponent(dynamicCollision); 898 899 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 900 hitReact.setBounceOnHit(true); 901 hitReact.setPauseOnAttack(true); 902 hitReact.setInvincibleTime(3.0f); 903 hitReact.setSpawnOnDealHit(HitType.HIT, GameObjectType.CRUSH_FLASH, false, true); 904 905 if (sound != null) { 906 hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.deep_clang)); 907 } 908 909 dynamicCollision.setHitReactionComponent(hitReact); 910 911 player.setHitReactionComponent(hitReact); 912 913 InventoryComponent inventory = (InventoryComponent)allocateComponent(InventoryComponent.class); 914 915 player.setInventory(inventory); 916 animation.setInventory(inventory); 917 918 ChangeComponentsComponent damageSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 919 animation.setDamageSwap(damageSwap); 920 921 LaunchProjectileComponent smokeGun 922 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 923 smokeGun.setDelayBetweenShots(0.25f); 924 smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG); 925 smokeGun.setOffsetX(32); 926 smokeGun.setOffsetY(15); 927 smokeGun.setVelocityX(-150.0f); 928 smokeGun.setVelocityY(100.0f); 929 smokeGun.setThetaError(0.1f); 930 931 LaunchProjectileComponent smokeGun2 932 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 933 smokeGun2.setDelayBetweenShots(0.35f); 934 smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL); 935 smokeGun2.setOffsetX(16); 936 smokeGun2.setOffsetY(15); 937 smokeGun2.setVelocityX(-150.0f); 938 smokeGun2.setVelocityY(150.0f); 939 smokeGun2.setThetaError(0.1f); 940 941 damageSwap.addSwapInComponent(smokeGun); 942 damageSwap.addSwapInComponent(smokeGun2); 943 damageSwap.setPingPongBehavior(true); 944 945 ChangeComponentsComponent invincibleSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 946 invincibleSwap.setPingPongBehavior(true); 947 player.setInvincibleSwap(invincibleSwap); 948 949 object.life = PlayerComponent.getDifficultyConstants().getMaxPlayerLife(); 950 object.team = Team.PLAYER; 951 952 // Very very basic DDA. Make the game easier if we've died on this level too much. 953 LevelSystem level = sSystemRegistry.levelSystem; 954 if (level != null) { 955 player.adjustDifficulty(object, level.getAttemptsCount()); 956 } 957 958 959 object.add(player); 960 object.add(inventory); 961 object.add(bgcollision); 962 object.add(render); 963 object.add(animation); 964 object.add(sprite); 965 object.add(dynamicCollision); 966 object.add(hitReact); 967 object.add(damageSwap); 968 object.add(invincibleSwap); 969 970 addStaticData(GameObjectType.PLAYER, object, sprite); 971 972 973 974 sprite.playAnimation(PlayerAnimations.IDLE.ordinal()); 975 976 977 // Jets 978 { 979 FixedSizeArray<BaseObject> jetStaticData = getStaticData(GameObjectType.PLAYER_JETS); 980 if (jetStaticData == null) { 981 jetStaticData = new FixedSizeArray<BaseObject>(1); 982 983 SpriteAnimation jetAnim = new SpriteAnimation(0, 2); 984 jetAnim.addFrame( 985 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire01), 986 Utils.framesToTime(24, 1))); 987 jetAnim.addFrame( 988 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire02), 989 Utils.framesToTime(24, 1))); 990 jetAnim.setLoop(true); 991 992 jetStaticData.add(jetAnim); 993 994 setStaticData(GameObjectType.PLAYER_JETS, jetStaticData); 995 } 996 997 RenderComponent jetRender = (RenderComponent)allocateComponent(RenderComponent.class); 998 jetRender.setPriority(SortConstants.PLAYER - 1); 999 jetRender.setDrawOffset(0.0f, -16.0f); 1000 SpriteComponent jetSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1001 jetSprite.setSize(64, 64); 1002 jetSprite.setRenderComponent(jetRender); 1003 1004 object.add(jetRender); 1005 object.add(jetSprite); 1006 1007 addStaticData(GameObjectType.PLAYER_JETS, object, jetSprite); 1008 1009 jetSprite.playAnimation(0); 1010 1011 animation.setJetSprite(jetSprite); 1012 } 1013 // Sparks 1014 { 1015 FixedSizeArray<BaseObject> sparksStaticData = getStaticData(GameObjectType.PLAYER_SPARKS); 1016 1017 if (sparksStaticData == null) { 1018 sparksStaticData = new FixedSizeArray<BaseObject>(1); 1019 1020 SpriteAnimation sparksAnim = new SpriteAnimation(0, 3); 1021 sparksAnim.addFrame( 1022 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01), 1023 Utils.framesToTime(24, 1))); 1024 sparksAnim.addFrame( 1025 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02), 1026 Utils.framesToTime(24, 1))); 1027 sparksAnim.addFrame( 1028 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03), 1029 Utils.framesToTime(24, 1))); 1030 sparksAnim.setLoop(true); 1031 1032 sparksStaticData.add(sparksAnim); 1033 1034 setStaticData(GameObjectType.PLAYER_SPARKS, sparksStaticData); 1035 } 1036 1037 RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class); 1038 sparksRender.setPriority(SortConstants.PLAYER + 1); 1039 SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1040 sparksSprite.setSize(64, 64); 1041 sparksSprite.setRenderComponent(sparksRender); 1042 1043 object.add(sparksRender); 1044 object.add(sparksSprite); 1045 1046 addStaticData(GameObjectType.PLAYER_SPARKS, object, sparksSprite); 1047 1048 sparksSprite.playAnimation(0); 1049 1050 animation.setSparksSprite(sparksSprite); 1051 } 1052 1053 // Glow 1054 { 1055 FixedSizeArray<BaseObject> glowStaticData = getStaticData(GameObjectType.PLAYER_GLOW); 1056 if (glowStaticData == null) { 1057 glowStaticData = new FixedSizeArray<BaseObject>(1); 1058 1059 FixedSizeArray<CollisionVolume> glowAttackVolume = 1060 new FixedSizeArray<CollisionVolume>(1); 1061 glowAttackVolume.add(new SphereCollisionVolume(40, 40, 40, HitType.HIT)); 1062 1063 SpriteAnimation glowAnim = new SpriteAnimation(0, 3); 1064 glowAnim.addFrame( 1065 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow01), 1066 Utils.framesToTime(24, 1), glowAttackVolume, null)); 1067 glowAnim.addFrame( 1068 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow02), 1069 Utils.framesToTime(24, 1), glowAttackVolume, null)); 1070 glowAnim.addFrame( 1071 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow03), 1072 Utils.framesToTime(24, 1), glowAttackVolume, null)); 1073 glowAnim.setLoop(true); 1074 1075 glowStaticData.add(glowAnim); 1076 1077 setStaticData(GameObjectType.PLAYER_GLOW, glowStaticData); 1078 } 1079 1080 RenderComponent glowRender = (RenderComponent)allocateComponent(RenderComponent.class); 1081 glowRender.setPriority(SortConstants.PLAYER + 1); 1082 glowRender.setDrawOffset(0, -5.0f); 1083 SpriteComponent glowSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1084 glowSprite.setSize(64, 64); 1085 glowSprite.setRenderComponent(glowRender); 1086 1087 DynamicCollisionComponent glowCollision 1088 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1089 glowSprite.setCollisionComponent(glowCollision); 1090 1091 FadeDrawableComponent glowFade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 1092 final float glowDuration = PlayerComponent.getDifficultyConstants().getGlowDuration(); 1093 glowFade.setupFade(1.0f, 0.0f, 0.15f, 1094 FadeDrawableComponent.LOOP_TYPE_PING_PONG, 1095 FadeDrawableComponent.FADE_EASE, 1096 glowDuration - 4.0f); // 4 seconds before the glow ends, start flashing 1097 glowFade.setPhaseDuration(glowDuration); 1098 glowFade.setRenderComponent(glowRender); 1099 1100 // HACK 1101 player.setInvincibleFader(glowFade); 1102 1103 invincibleSwap.addSwapInComponent(glowRender); 1104 invincibleSwap.addSwapInComponent(glowSprite); 1105 invincibleSwap.addSwapInComponent(glowCollision); 1106 invincibleSwap.addSwapInComponent(glowFade); 1107 1108 addStaticData(GameObjectType.PLAYER_GLOW, object, glowSprite); 1109 1110 glowSprite.playAnimation(0); 1111 1112 } 1113 1114 CameraSystem camera = sSystemRegistry.cameraSystem; 1115 if (camera != null) { 1116 camera.setTarget(object); 1117 } 1118 1119 return object; 1120 } 1121 1122 1123 // Sparks are used by more than one enemy type, so the setup for them is abstracted. 1124 private void setupEnemySparks() { 1125 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENEMY_SPARKS); 1126 if (staticData == null) { 1127 staticData = new FixedSizeArray<BaseObject>(1); 1128 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1129 1130 SpriteAnimation sparksAnim = new SpriteAnimation(0, 13); 1131 AnimationFrame frame1 = 1132 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01), 1133 Utils.framesToTime(24, 1)); 1134 AnimationFrame frame2 = 1135 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02), 1136 Utils.framesToTime(24, 1)); 1137 AnimationFrame frame3 = 1138 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03), 1139 Utils.framesToTime(24, 1)); 1140 sparksAnim.addFrame(frame1); 1141 sparksAnim.addFrame(frame2); 1142 sparksAnim.addFrame(frame3); 1143 sparksAnim.addFrame(frame1); 1144 sparksAnim.addFrame(frame2); 1145 sparksAnim.addFrame(frame3); 1146 sparksAnim.addFrame(frame1); 1147 sparksAnim.addFrame(frame2); 1148 sparksAnim.addFrame(frame3); 1149 sparksAnim.addFrame(frame1); 1150 sparksAnim.addFrame(frame2); 1151 sparksAnim.addFrame(frame3); 1152 sparksAnim.addFrame(new AnimationFrame(null, 3.0f)); 1153 sparksAnim.setLoop(true); 1154 1155 staticData.add(sparksAnim); 1156 setStaticData(GameObjectType.ENEMY_SPARKS, staticData); 1157 } 1158 1159 } 1160 1161 public GameObject spawnEnemyBrobot(float positionX, float positionY, boolean flipHorizontal) { 1162 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1163 1164 1165 GameObject object = mGameObjectPool.allocate(); 1166 object.getPosition().set(positionX, positionY); 1167 object.activationRadius = mNormalActivationRadius; 1168 object.width = 64; 1169 object.height = 64; 1170 1171 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT); 1172 if (staticData == null) { 1173 final int staticObjectCount = 5; 1174 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 1175 1176 GameComponent gravity = allocateComponent(GravityComponent.class); 1177 GameComponent movement = allocateComponent(MovementComponent.class); 1178 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 1179 physics.setBounciness(0.4f); 1180 1181 1182 // Animations 1183 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 1184 new FixedSizeArray<CollisionVolume>(1); 1185 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 1186 1187 FixedSizeArray<CollisionVolume> basicAttackVolume = 1188 new FixedSizeArray<CollisionVolume>(2); 1189 basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT)); 1190 basicAttackVolume.add(new AABoxCollisionVolume(16, 0, 32, 16, HitType.DEPRESS)); 1191 1192 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4); 1193 idle.addFrame(new AnimationFrame( 1194 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01), 1195 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 1196 idle.addFrame(new AnimationFrame( 1197 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02), 1198 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1199 idle.addFrame(new AnimationFrame( 1200 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03), 1201 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 1202 idle.addFrame(new AnimationFrame( 1203 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02), 1204 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 1205 1206 idle.setLoop(true); 1207 1208 SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3); 1209 walk.addFrame(new AnimationFrame( 1210 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01), 1211 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1212 walk.addFrame(new AnimationFrame( 1213 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02), 1214 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1215 walk.addFrame(new AnimationFrame( 1216 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03), 1217 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1218 walk.setLoop(true); 1219 1220 staticData.add(gravity); 1221 staticData.add(movement); 1222 staticData.add(physics); 1223 staticData.add(idle); 1224 staticData.add(walk); 1225 1226 setStaticData(GameObjectType.BROBOT, staticData); 1227 1228 } 1229 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 1230 render.setPriority(SortConstants.GENERAL_ENEMY); 1231 BackgroundCollisionComponent bgcollision 1232 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 1233 bgcollision.setSize(32, 48); 1234 bgcollision.setOffset(16, 0); 1235 1236 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1237 sprite.setSize((int)object.width, (int)object.height); 1238 sprite.setRenderComponent(render); 1239 1240 EnemyAnimationComponent animation 1241 = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 1242 animation.setSprite(sprite); 1243 1244 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 1245 patrol.setMovementSpeed(50.0f, 1000.0f); 1246 1247 DynamicCollisionComponent collision 1248 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1249 sprite.setCollisionComponent(collision); 1250 1251 HitReactionComponent hitReact 1252 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 1253 collision.setHitReactionComponent(hitReact); 1254 1255 1256 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 1257 lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_GIANT); 1258 lifetime.setVulnerableToDeathTiles(true); 1259 lifetime.setIncrementEventCounter(EventRecorder.COUNTER_ROBOTS_DESTROYED); 1260 1261 GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class); 1262 ghost.setMovementSpeed(500.0f); 1263 ghost.setAcceleration(1000.0f); 1264 ghost.setJumpImpulse(300.0f); 1265 ghost.setKillOnRelease(true); 1266 ghost.setDelayOnRelease(1.5f); 1267 1268 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 1269 if (sound != null) { 1270 ghost.setAmbientSound(sound.load(R.raw.sound_possession)); 1271 } 1272 1273 ChangeComponentsComponent ghostSwap 1274 = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 1275 ghostSwap.addSwapInComponent(ghost); 1276 ghostSwap.addSwapOutComponent(patrol); 1277 1278 SimplePhysicsComponent ghostPhysics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 1279 ghostPhysics.setBounciness(0.0f); 1280 1281 object.add(render); 1282 object.add(sprite); 1283 1284 object.add(bgcollision); 1285 object.add(animation); 1286 object.add(patrol); 1287 object.add(collision); 1288 object.add(hitReact); 1289 object.add(lifetime); 1290 object.add(ghostSwap); 1291 1292 object.team = Team.ENEMY; 1293 1294 if (flipHorizontal) { 1295 object.facingDirection.x = -1.0f; 1296 } 1297 1298 addStaticData(GameObjectType.BROBOT, object, sprite); 1299 1300 object.commitUpdates(); 1301 1302 SimplePhysicsComponent normalPhysics = object.findByClass(SimplePhysicsComponent.class); 1303 if (normalPhysics != null) { 1304 ghostSwap.addSwapOutComponent(normalPhysics); 1305 } 1306 1307 ghostSwap.addSwapInComponent(ghostPhysics); 1308 1309 sprite.playAnimation(0); 1310 1311 // Sparks 1312 setupEnemySparks(); 1313 1314 RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class); 1315 sparksRender.setPriority(render.getPriority() + 1); 1316 SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1317 sparksSprite.setSize(64, 64); 1318 sparksSprite.setRenderComponent(sparksRender); 1319 1320 addStaticData(GameObjectType.ENEMY_SPARKS, object, sparksSprite); 1321 1322 sparksSprite.playAnimation(0); 1323 1324 ghostSwap.addSwapInComponent(sparksSprite); 1325 ghostSwap.addSwapInComponent(sparksRender); 1326 1327 1328 hitReact.setPossessionComponent(ghostSwap); 1329 1330 return object; 1331 } 1332 1333 public GameObject spawnEnemySnailBomb(float positionX, float positionY, boolean flipHorizontal) { 1334 1335 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1336 1337 1338 // Make sure related textures are loaded. 1339 textureLibrary.allocateTexture(R.drawable.snail_bomb); 1340 1341 GameObject object = mGameObjectPool.allocate(); 1342 object.getPosition().set(positionX, positionY); 1343 object.activationRadius = mNormalActivationRadius; 1344 object.width = 64; 1345 object.height = 64; 1346 1347 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SNAILBOMB); 1348 if (staticData == null) { 1349 final int staticObjectCount = 6; 1350 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 1351 1352 GameComponent gravity = allocateComponent(GravityComponent.class); 1353 GameComponent movement = allocateComponent(MovementComponent.class); 1354 GameComponent physics = allocateComponent(SimplePhysicsComponent.class); 1355 1356 // Animations 1357 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 1358 new FixedSizeArray<CollisionVolume>(1); 1359 basicVulnerabilityVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT)); 1360 1361 FixedSizeArray<CollisionVolume> basicAttackVolume = 1362 new FixedSizeArray<CollisionVolume>(1); 1363 basicAttackVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT)); 1364 1365 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1); 1366 idle.addFrame(new AnimationFrame( 1367 textureLibrary.allocateTexture(R.drawable.snailbomb_stand), 1368 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 1369 1370 SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 5); 1371 walk.addFrame(new AnimationFrame( 1372 textureLibrary.allocateTexture(R.drawable.snailbomb_stand), 1373 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume)); 1374 walk.addFrame(new AnimationFrame( 1375 textureLibrary.allocateTexture(R.drawable.snailbomb_walk01), 1376 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume)); 1377 walk.addFrame(new AnimationFrame( 1378 textureLibrary.allocateTexture(R.drawable.snailbomb_walk02), 1379 Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume)); 1380 walk.addFrame(new AnimationFrame( 1381 textureLibrary.allocateTexture(R.drawable.snailbomb_walk01), 1382 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume)); 1383 walk.addFrame(new AnimationFrame( 1384 textureLibrary.allocateTexture(R.drawable.snailbomb_stand), 1385 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume)); 1386 walk.setLoop(true); 1387 1388 SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 2); 1389 attack.addFrame(new AnimationFrame( 1390 textureLibrary.allocateTexture(R.drawable.snailbomb_shoot01), 1391 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 1392 attack.addFrame(new AnimationFrame( 1393 textureLibrary.allocateTexture(R.drawable.snailbomb_shoot02), 1394 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume)); 1395 1396 staticData.add(gravity); 1397 staticData.add(movement); 1398 staticData.add(physics); 1399 staticData.add(idle); 1400 staticData.add(walk); 1401 staticData.add(attack); 1402 1403 1404 setStaticData(GameObjectType.SNAILBOMB, staticData); 1405 } 1406 1407 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 1408 render.setPriority(SortConstants.GENERAL_ENEMY); 1409 BackgroundCollisionComponent bgcollision 1410 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 1411 bgcollision.setSize(32, 48); 1412 bgcollision.setOffset(16, 5); 1413 1414 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1415 sprite.setSize((int)object.width, (int)object.height); 1416 sprite.setRenderComponent(render); 1417 1418 EnemyAnimationComponent animation 1419 = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 1420 animation.setSprite(sprite); 1421 1422 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 1423 patrol.setMovementSpeed(20.0f, 1000.0f); 1424 patrol.setupAttack(300, 1.0f, 4.0f, true); 1425 1426 DynamicCollisionComponent collision 1427 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1428 sprite.setCollisionComponent(collision); 1429 1430 HitReactionComponent hitReact 1431 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 1432 collision.setHitReactionComponent(hitReact); 1433 1434 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 1435 lifetime.setVulnerableToDeathTiles(true); 1436 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 1437 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 1438 if (sound != null) { 1439 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 1440 } 1441 1442 LaunchProjectileComponent gun 1443 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 1444 gun.setSetsPerActivation(1); 1445 gun.setShotsPerSet(3); 1446 gun.setDelayBeforeFirstSet(1.0f); 1447 gun.setDelayBetweenShots(0.25f); 1448 gun.setObjectTypeToSpawn(GameObjectType.CANNON_BALL); 1449 gun.setOffsetX(55); 1450 gun.setOffsetY(21); 1451 gun.setRequiredAction(GameObject.ActionType.ATTACK); 1452 gun.setVelocityX(100.0f); 1453 1454 object.team = Team.ENEMY; 1455 1456 if (flipHorizontal) { 1457 object.facingDirection.x = -1.0f; 1458 } 1459 1460 object.add(render); 1461 object.add(sprite); 1462 object.add(bgcollision); 1463 object.add(animation); 1464 object.add(patrol); 1465 object.add(collision); 1466 object.add(hitReact); 1467 object.add(lifetime); 1468 object.add(gun); 1469 1470 addStaticData(GameObjectType.SNAILBOMB, object, sprite); 1471 1472 final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal()); 1473 if (attack != null) { 1474 gun.setDelayBeforeFirstSet(attack.getLength()); 1475 } 1476 1477 sprite.playAnimation(0); 1478 1479 return object; 1480 } 1481 1482 public GameObject spawnEnemyShadowSlime(float positionX, float positionY, boolean flipHorizontal) { 1483 1484 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1485 1486 1487 // Make sure related textures are loaded. 1488 textureLibrary.allocateTexture(R.drawable.energy_ball01); 1489 textureLibrary.allocateTexture(R.drawable.energy_ball02); 1490 textureLibrary.allocateTexture(R.drawable.energy_ball03); 1491 textureLibrary.allocateTexture(R.drawable.energy_ball04); 1492 1493 GameObject object = mGameObjectPool.allocate(); 1494 object.getPosition().set(positionX, positionY); 1495 object.activationRadius = mTightActivationRadius; 1496 object.width = 64; 1497 object.height = 64; 1498 1499 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SHADOWSLIME); 1500 if (staticData == null) { 1501 final int staticObjectCount = 5; 1502 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 1503 1504 PopOutComponent popOut = (PopOutComponent)allocateComponent(PopOutComponent.class); 1505 // edit: these guys turned out to be really annoying, so I'm changing the values 1506 // here to force them to always be out. 1507 popOut.setAppearDistance(2000); 1508 popOut.setHideDistance(4000); 1509 1510 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1); 1511 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 1512 basicVulnerabilityVolume.get(0).setHitType(HitType.HIT); 1513 1514 FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1); 1515 basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT)); 1516 1517 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2); 1518 AnimationFrame idle1 = new AnimationFrame( 1519 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle01), 1520 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume); 1521 AnimationFrame idle2 = new AnimationFrame( 1522 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle02), 1523 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume); 1524 idle.addFrame(idle1); 1525 idle.addFrame(idle2); 1526 idle.setLoop(true); 1527 1528 1529 SpriteAnimation appear = new SpriteAnimation(EnemyAnimations.APPEAR.ordinal(), 6); 1530 AnimationFrame appear1 = new AnimationFrame( 1531 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate01), 1532 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1533 1534 AnimationFrame appear2 = new AnimationFrame( 1535 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate02), 1536 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1537 AnimationFrame appear3 = new AnimationFrame( 1538 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate03), 1539 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume); 1540 AnimationFrame appear4 = new AnimationFrame( 1541 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate04), 1542 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume); 1543 AnimationFrame appear5 = new AnimationFrame( 1544 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate05), 1545 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1546 AnimationFrame appear6 = new AnimationFrame( 1547 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate06), 1548 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume); 1549 1550 appear.addFrame(appear1); 1551 appear.addFrame(appear2); 1552 appear.addFrame(appear3); 1553 appear.addFrame(appear4); 1554 appear.addFrame(appear5); 1555 appear.addFrame(appear6); 1556 1557 SpriteAnimation hidden = new SpriteAnimation(EnemyAnimations.HIDDEN.ordinal(), 6); 1558 hidden.addFrame(appear6); 1559 hidden.addFrame(appear5); 1560 hidden.addFrame(appear4); 1561 hidden.addFrame(appear3); 1562 hidden.addFrame(appear2); 1563 hidden.addFrame(appear1); 1564 /*hidden.addFrame(new AnimationFrame( 1565 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_stand), 1566 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));*/ 1567 1568 1569 SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 10); 1570 AnimationFrame attack1 = new AnimationFrame( 1571 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack01), 1572 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1573 AnimationFrame attack2 = new AnimationFrame( 1574 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02), 1575 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1576 AnimationFrame attack3 = new AnimationFrame( 1577 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03), 1578 Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume); 1579 AnimationFrame attack4 = new AnimationFrame( 1580 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04), 1581 Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume); 1582 AnimationFrame attackFlash = new AnimationFrame( 1583 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_flash), 1584 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume); 1585 1586 AnimationFrame attack5 = new AnimationFrame( 1587 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03), 1588 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume); 1589 AnimationFrame attack6 = new AnimationFrame( 1590 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02), 1591 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume); 1592 1593 AnimationFrame attack7 = new AnimationFrame( 1594 textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04), 1595 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume); 1596 1597 attack.addFrame(attack1); 1598 attack.addFrame(attack2); 1599 attack.addFrame(attack3); 1600 attack.addFrame(attack4); 1601 attack.addFrame(attackFlash); 1602 attack.addFrame(attack7); 1603 attack.addFrame(attackFlash); 1604 attack.addFrame(attack5); 1605 attack.addFrame(attack6); 1606 attack.addFrame(attack1); 1607 1608 popOut.setupAttack(200, 2.0f, attack.getLength()); 1609 1610 1611 staticData.add(popOut); 1612 staticData.add(idle); 1613 staticData.add(hidden); 1614 staticData.add(appear); 1615 staticData.add(attack); 1616 1617 setStaticData(GameObjectType.SHADOWSLIME, staticData); 1618 } 1619 1620 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 1621 render.setPriority(SortConstants.GENERAL_ENEMY); 1622 BackgroundCollisionComponent bgcollision 1623 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 1624 bgcollision.setSize(32, 48); 1625 bgcollision.setOffset(16, 5); 1626 1627 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1628 sprite.setSize((int)object.width, (int)object.height); 1629 sprite.setRenderComponent(render); 1630 1631 1632 sprite.playAnimation(0); 1633 1634 EnemyAnimationComponent animation 1635 = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 1636 animation.setSprite(sprite); 1637 animation.setFacePlayer(true); 1638 1639 1640 DynamicCollisionComponent collision 1641 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1642 sprite.setCollisionComponent(collision); 1643 1644 HitReactionComponent hitReact 1645 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 1646 collision.setHitReactionComponent(hitReact); 1647 1648 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 1649 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 1650 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 1651 if (sound != null) { 1652 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 1653 } 1654 1655 LaunchProjectileComponent gun 1656 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 1657 1658 1659 gun.setShotsPerSet(1); 1660 gun.setSetsPerActivation(1); 1661 gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL); 1662 gun.setOffsetX(44); 1663 gun.setOffsetY(22); 1664 gun.setRequiredAction(GameObject.ActionType.ATTACK); 1665 gun.setVelocityX(30.0f); 1666 1667 object.team = Team.ENEMY; 1668 1669 if (flipHorizontal) { 1670 object.facingDirection.x = -1.0f; 1671 } 1672 1673 // Hack. Adjusting position lets us avoid giving this character gravity, physics, and 1674 // collision. 1675 1676 object.getPosition().y -= 5; 1677 1678 object.add(render); 1679 object.add(sprite); 1680 object.add(bgcollision); 1681 object.add(animation); 1682 object.add(collision); 1683 object.add(hitReact); 1684 object.add(lifetime); 1685 object.add(gun); 1686 1687 addStaticData(GameObjectType.SHADOWSLIME, object, sprite); 1688 1689 final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal()); 1690 final SpriteAnimation appear = sprite.findAnimation(EnemyAnimations.APPEAR.ordinal()); 1691 if (attack != null && appear != null) { 1692 gun.setDelayBeforeFirstSet(attack.getLength() / 2.0f); 1693 } else { 1694 gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 12)); 1695 } 1696 1697 return object; 1698 } 1699 1700 public GameObject spawnEnemyMudman(float positionX, float positionY, boolean flipHorizontal) { 1701 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1702 1703 1704 GameObject object = mGameObjectPool.allocate(); 1705 object.getPosition().set(positionX, positionY); 1706 object.activationRadius = mNormalActivationRadius; 1707 object.width = 128; 1708 object.height = 128; 1709 1710 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.MUDMAN); 1711 if (staticData == null) { 1712 final int staticObjectCount = 7; 1713 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 1714 1715 GameComponent gravity = allocateComponent(GravityComponent.class); 1716 GameComponent movement = allocateComponent(MovementComponent.class); 1717 1718 GameComponent physics = allocateComponent(SimplePhysicsComponent.class); 1719 1720 SolidSurfaceComponent solidSurface 1721 = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 1722 solidSurface.inititalize(4); 1723 // house shape: 1724 // / \ 1/ \2 1725 // | | 3| |4 1726 Vector2 surface1Start = new Vector2(32, 64); 1727 Vector2 surface1End = new Vector2(64, 96); 1728 Vector2 surface1Normal = new Vector2(-0.707f, 0.707f); 1729 surface1Normal.normalize(); 1730 1731 Vector2 surface2Start = new Vector2(64, 96); 1732 Vector2 surface2End = new Vector2(75, 64); 1733 Vector2 surface2Normal = new Vector2(0.9456f, 0.3250f); 1734 surface2Normal.normalize(); 1735 1736 Vector2 surface3Start = new Vector2(32, 0); 1737 Vector2 surface3End = new Vector2(32, 64); 1738 Vector2 surface3Normal = new Vector2(-1, 0); 1739 1740 Vector2 surface4Start = new Vector2(75, 0); 1741 Vector2 surface4End = new Vector2(75, 64); 1742 Vector2 surface4Normal = new Vector2(1, 0); 1743 1744 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 1745 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 1746 solidSurface.addSurface(surface3Start, surface3End, surface3Normal); 1747 solidSurface.addSurface(surface4Start, surface4End, surface4Normal); 1748 1749 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4); 1750 idle.addFrame(new AnimationFrame( 1751 textureLibrary.allocateTexture(R.drawable.enemy_mud_stand), 1752 Utils.framesToTime(24, 12), null, null)); 1753 AnimationFrame idle1 = new AnimationFrame( 1754 textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01), 1755 Utils.framesToTime(24, 2), null, null); 1756 AnimationFrame idle2 = new AnimationFrame( 1757 textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01), 1758 Utils.framesToTime(24, 7), null, null); 1759 idle.addFrame(idle1); 1760 idle.addFrame(idle2); 1761 idle.addFrame(idle1); 1762 idle.setLoop(true); 1763 1764 1765 SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6); 1766 walk.addFrame(new AnimationFrame( 1767 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk01), 1768 Utils.framesToTime(24, 4), null, null)); 1769 walk.addFrame(new AnimationFrame( 1770 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk02), 1771 Utils.framesToTime(24, 4), null, null)); 1772 walk.addFrame(new AnimationFrame( 1773 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk03), 1774 Utils.framesToTime(24, 5), null, null)); 1775 walk.addFrame(new AnimationFrame( 1776 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk04), 1777 Utils.framesToTime(24, 4), null, null)); 1778 walk.addFrame(new AnimationFrame( 1779 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk05), 1780 Utils.framesToTime(24, 4), null, null)); 1781 walk.addFrame(new AnimationFrame( 1782 textureLibrary.allocateTexture(R.drawable.enemy_mud_walk06), 1783 Utils.framesToTime(24, 5), null, null)); 1784 walk.setLoop(true); 1785 1786 FixedSizeArray<CollisionVolume> crushAttackVolume = 1787 new FixedSizeArray<CollisionVolume>(1); 1788 crushAttackVolume.add(new AABoxCollisionVolume(64, 0, 64, 96, HitType.HIT)); 1789 1790 SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 8); 1791 attack.addFrame(new AnimationFrame( 1792 textureLibrary.allocateTexture(R.drawable.enemy_mud_stand), 1793 Utils.framesToTime(24, 2), null, null)); 1794 attack.addFrame(new AnimationFrame( 1795 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack01), 1796 Utils.framesToTime(24, 2), null, null)); 1797 attack.addFrame(new AnimationFrame( 1798 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack02), 1799 Utils.framesToTime(24, 2), null, null)); 1800 attack.addFrame(new AnimationFrame( 1801 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack03), 1802 Utils.framesToTime(24, 2), null, null)); 1803 attack.addFrame(new AnimationFrame( 1804 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack04), 1805 Utils.framesToTime(24, 1), crushAttackVolume, null)); 1806 attack.addFrame(new AnimationFrame( 1807 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack05), 1808 Utils.framesToTime(24, 1), crushAttackVolume, null)); 1809 attack.addFrame(new AnimationFrame( 1810 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack06), 1811 Utils.framesToTime(24, 8), crushAttackVolume, null)); 1812 attack.addFrame(new AnimationFrame( 1813 textureLibrary.allocateTexture(R.drawable.enemy_mud_attack07), 1814 Utils.framesToTime(24, 5), null, null)); 1815 1816 staticData.add(gravity); 1817 staticData.add(movement); 1818 staticData.add(physics); 1819 staticData.add(solidSurface); 1820 staticData.add(idle); 1821 staticData.add(walk); 1822 staticData.add(attack); 1823 1824 setStaticData(GameObjectType.MUDMAN, staticData); 1825 } 1826 1827 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 1828 render.setPriority(SortConstants.GENERAL_ENEMY); 1829 1830 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 1831 bgcollision.setSize(80, 90); 1832 bgcollision.setOffset(32, 5); 1833 1834 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1835 sprite.setSize((int)object.width, (int)object.height); 1836 sprite.setRenderComponent(render); 1837 1838 1839 sprite.playAnimation(0); 1840 1841 EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 1842 animation.setSprite(sprite); 1843 1844 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 1845 patrol.setMovementSpeed(20.0f, 400.0f); 1846 1847 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1848 sprite.setCollisionComponent(collision); 1849 1850 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 1851 collision.setHitReactionComponent(hitReact); 1852 1853 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 1854 1855 object.team = Team.ENEMY; 1856 object.life = 1; 1857 1858 if (flipHorizontal) { 1859 object.facingDirection.x = -1.0f; 1860 } 1861 1862 object.add(render); 1863 object.add(sprite); 1864 object.add(bgcollision); 1865 object.add(animation); 1866 object.add(patrol); 1867 object.add(collision); 1868 object.add(hitReact); 1869 object.add(lifetime); 1870 1871 addStaticData(GameObjectType.MUDMAN, object, sprite); 1872 1873 final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal()); 1874 if (attack != null) { 1875 patrol.setupAttack(70.0f, attack.getLength(), 0.0f, true); 1876 } 1877 1878 sprite.playAnimation(0); 1879 1880 return object; 1881 } 1882 1883 public GameObject spawnEnemySkeleton(float positionX, float positionY, boolean flipHorizontal) { 1884 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 1885 1886 1887 GameObject object = mGameObjectPool.allocate(); 1888 object.getPosition().set(positionX, positionY); 1889 object.activationRadius = mNormalActivationRadius; 1890 object.width = 64; 1891 object.height = 64; 1892 1893 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SKELETON); 1894 if (staticData == null) { 1895 final int staticObjectCount = 7; 1896 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 1897 1898 GameComponent gravity = allocateComponent(GravityComponent.class); 1899 GameComponent movement = allocateComponent(MovementComponent.class); 1900 1901 GameComponent physics = allocateComponent(SimplePhysicsComponent.class); 1902 1903 SolidSurfaceComponent solidSurface = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 1904 solidSurface.inititalize(4); 1905 1906 Vector2 surface1Start = new Vector2(25, 0); 1907 Vector2 surface1End = new Vector2(25, 64); 1908 Vector2 surface1Normal = new Vector2(-1, 0); 1909 1910 Vector2 surface2Start = new Vector2(40, 0); 1911 Vector2 surface2End = new Vector2(40, 64); 1912 Vector2 surface2Normal = new Vector2(1, 0); 1913 1914 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 1915 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 1916 1917 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 1918 new FixedSizeArray<CollisionVolume>(1); 1919 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 1920 basicVulnerabilityVolume.get(0).setHitType(HitType.HIT); 1921 1922 FixedSizeArray<CollisionVolume> basicAttackVolume = 1923 new FixedSizeArray<CollisionVolume>(1); 1924 basicAttackVolume.add(new SphereCollisionVolume(16, 48, 32, HitType.HIT)); 1925 1926 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1); 1927 idle.addFrame(new AnimationFrame( 1928 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_stand), 1929 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 1930 1931 SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6); 1932 walk.addFrame(new AnimationFrame( 1933 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk01), 1934 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 1935 walk.addFrame(new AnimationFrame( 1936 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk02), 1937 Utils.framesToTime(24, 4), null, basicVulnerabilityVolume)); 1938 walk.addFrame(new AnimationFrame( 1939 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03), 1940 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 1941 walk.addFrame(new AnimationFrame( 1942 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk04), 1943 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 1944 walk.addFrame(new AnimationFrame( 1945 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk05), 1946 Utils.framesToTime(24, 4), null, basicVulnerabilityVolume)); 1947 walk.addFrame(new AnimationFrame( 1948 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03), 1949 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 1950 1951 walk.setLoop(true); 1952 1953 1954 SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 3); 1955 attack.addFrame(new AnimationFrame( 1956 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack01), 1957 Utils.framesToTime(24, 5), null, basicVulnerabilityVolume)); 1958 attack.addFrame(new AnimationFrame( 1959 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack03), 1960 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1961 attack.addFrame(new AnimationFrame( 1962 textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack04), 1963 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 1964 1965 staticData.add(gravity); 1966 staticData.add(movement); 1967 staticData.add(physics); 1968 staticData.add(solidSurface); 1969 staticData.add(idle); 1970 staticData.add(walk); 1971 staticData.add(attack); 1972 1973 setStaticData(GameObjectType.SKELETON, staticData); 1974 } 1975 1976 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 1977 render.setPriority(SortConstants.GENERAL_ENEMY); 1978 1979 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 1980 bgcollision.setSize(32, 48); 1981 bgcollision.setOffset(16, 5); 1982 1983 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 1984 sprite.setSize((int)object.width, (int)object.height); 1985 sprite.setRenderComponent(render); 1986 1987 EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 1988 animation.setSprite(sprite); 1989 1990 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 1991 patrol.setMovementSpeed(20.0f, 1000.0f); 1992 patrol.setTurnToFacePlayer(true); 1993 1994 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 1995 sprite.setCollisionComponent(collision); 1996 1997 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 1998 collision.setHitReactionComponent(hitReact); 1999 2000 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 2001 lifetime.setVulnerableToDeathTiles(true); 2002 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 2003 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 2004 if (sound != null) { 2005 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 2006 } 2007 2008 object.team = Team.ENEMY; 2009 2010 if (flipHorizontal) { 2011 object.facingDirection.x = -1.0f; 2012 } 2013 2014 object.add(render); 2015 object.add(sprite); 2016 object.add(bgcollision); 2017 object.add(animation); 2018 object.add(patrol); 2019 object.add(collision); 2020 object.add(hitReact); 2021 object.add(lifetime); 2022 2023 addStaticData(GameObjectType.SKELETON, object, sprite); 2024 2025 final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal()); 2026 if (attack != null) { 2027 patrol.setupAttack(75.0f, attack.getLength(), 2.0f, true); 2028 } 2029 2030 sprite.playAnimation(0); 2031 2032 return object; 2033 } 2034 2035 2036 public GameObject spawnEnemyKaraguin(float positionX, float positionY, boolean flipHorizontal) { 2037 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2038 2039 2040 GameObject object = mGameObjectPool.allocate(); 2041 object.getPosition().set(positionX, positionY); 2042 object.activationRadius = mNormalActivationRadius; 2043 object.width = 32; 2044 object.height = 32; 2045 2046 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KARAGUIN); 2047 if (staticData == null) { 2048 final int staticObjectCount = 2; 2049 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2050 2051 GameComponent movement = allocateComponent(MovementComponent.class); 2052 2053 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2054 new FixedSizeArray<CollisionVolume>(1); 2055 basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 16, 16)); 2056 basicVulnerabilityVolume.get(0).setHitType(HitType.HIT); 2057 2058 FixedSizeArray<CollisionVolume> basicAttackVolume = 2059 new FixedSizeArray<CollisionVolume>(1); 2060 basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT)); 2061 2062 SpriteAnimation idle = new SpriteAnimation(0, 3); 2063 idle.addFrame(new AnimationFrame( 2064 textureLibrary.allocateTexture(R.drawable.enemy_karaguin01), 2065 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2066 idle.addFrame(new AnimationFrame( 2067 textureLibrary.allocateTexture(R.drawable.enemy_karaguin02), 2068 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2069 idle.addFrame(new AnimationFrame( 2070 textureLibrary.allocateTexture(R.drawable.enemy_karaguin03), 2071 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2072 idle.setLoop(true); 2073 2074 staticData.add(movement); 2075 staticData.add(idle); 2076 2077 2078 setStaticData(GameObjectType.KARAGUIN, staticData); 2079 } 2080 2081 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2082 render.setPriority(SortConstants.GENERAL_ENEMY); 2083 2084 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2085 sprite.setSize((int)object.width, (int)object.height); 2086 sprite.setRenderComponent(render); 2087 2088 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 2089 patrol.setMovementSpeed(50.0f, 1000.0f); 2090 patrol.setTurnToFacePlayer(false); 2091 patrol.setFlying(true); 2092 2093 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2094 sprite.setCollisionComponent(collision); 2095 2096 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2097 collision.setHitReactionComponent(hitReact); 2098 2099 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 2100 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 2101 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 2102 if (sound != null) { 2103 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 2104 } 2105 2106 EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 2107 animation.setSprite(sprite); 2108 2109 object.team = Team.ENEMY; 2110 2111 if (flipHorizontal) { 2112 object.facingDirection.x = -1.0f; 2113 } 2114 // HACK. These guys originally moved on their own, so let's keep them that way. 2115 object.getVelocity().x = 50.0f * object.facingDirection.x; 2116 object.getTargetVelocity().x = 50.0f * object.facingDirection.x; 2117 2118 object.add(render); 2119 object.add(animation); 2120 object.add(sprite); 2121 object.add(patrol); 2122 object.add(collision); 2123 object.add(hitReact); 2124 object.add(lifetime); 2125 2126 addStaticData(GameObjectType.KARAGUIN, object, sprite); 2127 2128 sprite.playAnimation(0); 2129 2130 return object; 2131 } 2132 2133 public GameObject spawnEnemyPinkNamazu(float positionX, float positionY, boolean flipHorizontal) { 2134 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2135 2136 2137 GameObject object = mGameObjectPool.allocate(); 2138 object.getPosition().set(positionX, positionY); 2139 object.activationRadius = mTightActivationRadius; 2140 object.width = 128; 2141 object.height = 128; 2142 2143 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PINK_NAMAZU); 2144 if (staticData == null) { 2145 final int staticObjectCount = 7; 2146 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2147 2148 GameComponent gravity = allocateComponent(GravityComponent.class); 2149 GameComponent movement = allocateComponent(MovementComponent.class); 2150 2151 GameComponent physics = allocateComponent(SimplePhysicsComponent.class); 2152 2153 SolidSurfaceComponent solidSurface 2154 = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 2155 solidSurface.inititalize(5); 2156 // circle shape: 2157 // __ __3 2158 // / \ 2/ \4 2159 // | | 1| |5 2160 /* 2161 0:12,6:22,52:0.98058067569092,-0.19611613513818 2162 0:22,52:50,75:-0.62580046626293,0.77998318983495 2163 0:50,75:81,75:0,1 2164 0:81,75:104,49:0.74038072228541,0.67218776102228 2165 0:104,49:104,6:-0.99997086544204,-0.00763336538505 2166 */ 2167 Vector2 surface1Start = new Vector2(12, 3); 2168 Vector2 surface1End = new Vector2(22, 52); 2169 Vector2 surface1Normal = new Vector2(-0.98058067569092f, -0.19611613513818f); 2170 surface1Normal.normalize(); 2171 2172 Vector2 surface2Start = new Vector2(22, 52); 2173 Vector2 surface2End = new Vector2(50, 75); 2174 Vector2 surface2Normal = new Vector2(-0.62580046626293f, 0.77998318983495f); 2175 surface2Normal.normalize(); 2176 2177 Vector2 surface3Start = new Vector2(50, 75); 2178 Vector2 surface3End = new Vector2(81, 75); 2179 Vector2 surface3Normal = new Vector2(0, 1); 2180 2181 Vector2 surface4Start = new Vector2(81, 75); 2182 Vector2 surface4End = new Vector2(104,49); 2183 Vector2 surface4Normal = new Vector2(0.74038072228541f, 0.67218776102228f); 2184 2185 Vector2 surface5Start = new Vector2(104,49); 2186 Vector2 surface5End = new Vector2(104, 3); 2187 Vector2 surface5Normal = new Vector2(1.0f, 0.0f); 2188 2189 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 2190 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 2191 solidSurface.addSurface(surface3Start, surface3End, surface3Normal); 2192 solidSurface.addSurface(surface4Start, surface4End, surface4Normal); 2193 solidSurface.addSurface(surface5Start, surface5End, surface5Normal); 2194 2195 2196 SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 4); 2197 idle.addFrame(new AnimationFrame( 2198 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand), 2199 Utils.framesToTime(24, 8), null, null)); 2200 AnimationFrame idle1 = new AnimationFrame( 2201 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep01), 2202 Utils.framesToTime(24, 3), null, null); 2203 AnimationFrame idle2 = new AnimationFrame( 2204 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep02), 2205 Utils.framesToTime(24, 8), null, null); 2206 idle.addFrame(idle1); 2207 idle.addFrame(idle2); 2208 idle.addFrame(idle1); 2209 idle.setLoop(true); 2210 2211 2212 SpriteAnimation wake = new SpriteAnimation(GenericAnimationComponent.Animation.MOVE, 4); 2213 AnimationFrame wake1 = new AnimationFrame( 2214 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_eyeopen), 2215 Utils.framesToTime(24, 3), null, null); 2216 AnimationFrame wake2 = new AnimationFrame( 2217 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand), 2218 Utils.framesToTime(24, 3), null, null); 2219 wake.addFrame(wake1); 2220 wake.addFrame(wake2); 2221 wake.addFrame(wake1); 2222 wake.addFrame(wake2); 2223 2224 FixedSizeArray<CollisionVolume> crushAttackVolume = 2225 new FixedSizeArray<CollisionVolume>(1); 2226 crushAttackVolume.add(new AABoxCollisionVolume(32, 0, 64, 32, HitType.HIT)); 2227 2228 SpriteAnimation attack = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1); 2229 attack.addFrame(new AnimationFrame( 2230 textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_jump), 2231 Utils.framesToTime(24, 2), crushAttackVolume, null)); 2232 2233 2234 staticData.add(gravity); 2235 staticData.add(movement); 2236 staticData.add(physics); 2237 staticData.add(solidSurface); 2238 staticData.add(idle); 2239 staticData.add(wake); 2240 staticData.add(attack); 2241 2242 setStaticData(GameObjectType.PINK_NAMAZU, staticData); 2243 } 2244 2245 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2246 render.setPriority(SortConstants.GENERAL_ENEMY); 2247 2248 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 2249 bgcollision.setSize(100, 75); 2250 bgcollision.setOffset(12, 5); 2251 2252 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2253 sprite.setSize((int)object.width, (int)object.height); 2254 sprite.setRenderComponent(render); 2255 2256 GenericAnimationComponent animation = 2257 (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class); 2258 animation.setSprite(sprite); 2259 2260 SleeperComponent sleeper = (SleeperComponent)allocateComponent(SleeperComponent.class); 2261 sleeper.setAttackImpulse(100.0f, 170.0f); 2262 sleeper.setSlam(0.3f, 25.0f); 2263 2264 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2265 sprite.setCollisionComponent(collision); 2266 2267 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2268 collision.setHitReactionComponent(hitReact); 2269 2270 2271 object.team = Team.ENEMY; 2272 object.life = 1; 2273 2274 if (flipHorizontal) { 2275 object.facingDirection.x = -1.0f; 2276 } 2277 2278 object.add(render); 2279 object.add(sprite); 2280 object.add(bgcollision); 2281 object.add(animation); 2282 object.add(collision); 2283 object.add(hitReact); 2284 object.add(sleeper); 2285 2286 2287 addStaticData(GameObjectType.PINK_NAMAZU, object, sprite); 2288 2289 final SpriteAnimation wakeUp = sprite.findAnimation(GenericAnimationComponent.Animation.MOVE); 2290 if (wakeUp != null) { 2291 sleeper.setWakeUpDuration(wakeUp.getLength() + 1.0f); 2292 } 2293 2294 sprite.playAnimation(GenericAnimationComponent.Animation.IDLE); 2295 2296 return object; 2297 } 2298 2299 public GameObject spawnEnemyBat(float positionX, float positionY, boolean flipHorizontal) { 2300 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2301 2302 2303 GameObject object = mGameObjectPool.allocate(); 2304 object.getPosition().set(positionX, positionY); 2305 object.activationRadius = mNormalActivationRadius; 2306 object.width = 64; 2307 object.height = 32; 2308 2309 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BAT); 2310 if (staticData == null) { 2311 final int staticObjectCount = 2; 2312 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2313 2314 GameComponent movement = allocateComponent(MovementComponent.class); 2315 2316 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2317 new FixedSizeArray<CollisionVolume>(1); 2318 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16)); 2319 basicVulnerabilityVolume.get(0).setHitType(HitType.HIT); 2320 2321 FixedSizeArray<CollisionVolume> basicAttackVolume = 2322 new FixedSizeArray<CollisionVolume>(1); 2323 basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT)); 2324 2325 SpriteAnimation idle = new SpriteAnimation(0, 4); 2326 idle.addFrame(new AnimationFrame( 2327 textureLibrary.allocateTexture(R.drawable.enemy_bat01), 2328 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2329 idle.addFrame(new AnimationFrame( 2330 textureLibrary.allocateTexture(R.drawable.enemy_bat02), 2331 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2332 idle.addFrame(new AnimationFrame( 2333 textureLibrary.allocateTexture(R.drawable.enemy_bat03), 2334 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2335 idle.addFrame(new AnimationFrame( 2336 textureLibrary.allocateTexture(R.drawable.enemy_bat04), 2337 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2338 idle.setLoop(true); 2339 2340 staticData.add(movement); 2341 staticData.add(idle); 2342 2343 2344 setStaticData(GameObjectType.BAT, staticData); 2345 } 2346 2347 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2348 render.setPriority(SortConstants.GENERAL_ENEMY); 2349 2350 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2351 sprite.setSize((int)object.width, (int)object.height); 2352 sprite.setRenderComponent(render); 2353 2354 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 2355 patrol.setMovementSpeed(75.0f, 1000.0f); 2356 patrol.setTurnToFacePlayer(false); 2357 patrol.setFlying(true); 2358 2359 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2360 sprite.setCollisionComponent(collision); 2361 2362 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2363 collision.setHitReactionComponent(hitReact); 2364 2365 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 2366 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 2367 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 2368 if (sound != null) { 2369 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 2370 } 2371 2372 EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 2373 animation.setSprite(sprite); 2374 2375 object.team = Team.ENEMY; 2376 2377 if (flipHorizontal) { 2378 object.facingDirection.x = -1.0f; 2379 } 2380 2381 // HACK. These guys originally moved on their own, so let's keep them that way. 2382 object.getVelocity().x = 75.0f * object.facingDirection.x; 2383 object.getTargetVelocity().x = 75.0f * object.facingDirection.x; 2384 2385 object.add(render); 2386 object.add(animation); 2387 object.add(sprite); 2388 object.add(patrol); 2389 object.add(collision); 2390 object.add(hitReact); 2391 object.add(lifetime); 2392 2393 addStaticData(GameObjectType.BAT, object, sprite); 2394 2395 sprite.playAnimation(0); 2396 2397 return object; 2398 } 2399 2400 public GameObject spawnEnemySting(float positionX, float positionY, boolean flipHorizontal) { 2401 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2402 2403 2404 GameObject object = mGameObjectPool.allocate(); 2405 object.getPosition().set(positionX, positionY); 2406 object.activationRadius = mNormalActivationRadius; 2407 object.width = 64; 2408 object.height = 64; 2409 2410 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.STING); 2411 if (staticData == null) { 2412 final int staticObjectCount = 2; 2413 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2414 2415 GameComponent movement = allocateComponent(MovementComponent.class); 2416 2417 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2418 new FixedSizeArray<CollisionVolume>(1); 2419 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16)); 2420 basicVulnerabilityVolume.get(0).setHitType(HitType.HIT); 2421 2422 FixedSizeArray<CollisionVolume> basicAttackVolume = 2423 new FixedSizeArray<CollisionVolume>(1); 2424 basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT)); 2425 2426 SpriteAnimation idle = new SpriteAnimation(0, 3); 2427 idle.addFrame(new AnimationFrame( 2428 textureLibrary.allocateTexture(R.drawable.enemy_sting01), 2429 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2430 idle.addFrame(new AnimationFrame( 2431 textureLibrary.allocateTexture(R.drawable.enemy_sting02), 2432 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2433 idle.addFrame(new AnimationFrame( 2434 textureLibrary.allocateTexture(R.drawable.enemy_sting03), 2435 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2436 2437 idle.setLoop(true); 2438 2439 staticData.add(movement); 2440 staticData.add(idle); 2441 2442 2443 setStaticData(GameObjectType.STING, staticData); 2444 } 2445 2446 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2447 render.setPriority(SortConstants.GENERAL_ENEMY); 2448 2449 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2450 sprite.setSize((int)object.width, (int)object.height); 2451 sprite.setRenderComponent(render); 2452 2453 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 2454 patrol.setMovementSpeed(75.0f, 1000.0f); 2455 patrol.setTurnToFacePlayer(false); 2456 patrol.setFlying(true); 2457 2458 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2459 sprite.setCollisionComponent(collision); 2460 2461 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2462 collision.setHitReactionComponent(hitReact); 2463 2464 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 2465 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 2466 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 2467 if (sound != null) { 2468 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 2469 } 2470 2471 EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 2472 animation.setSprite(sprite); 2473 2474 object.team = Team.ENEMY; 2475 2476 if (flipHorizontal) { 2477 object.facingDirection.x = -1.0f; 2478 } 2479 2480 // HACK. These guys originally moved on their own, so let's keep them that way. 2481 object.getVelocity().x = 25.0f * object.facingDirection.x; 2482 object.getTargetVelocity().x = 25.0f * object.facingDirection.x; 2483 2484 object.add(render); 2485 object.add(animation); 2486 object.add(sprite); 2487 object.add(patrol); 2488 object.add(collision); 2489 object.add(hitReact); 2490 object.add(lifetime); 2491 2492 addStaticData(GameObjectType.STING, object, sprite); 2493 2494 sprite.playAnimation(0); 2495 2496 return object; 2497 } 2498 2499 public GameObject spawnEnemyOnion(float positionX, float positionY, boolean flipHorizontal) { 2500 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2501 2502 GameObject object = mGameObjectPool.allocate(); 2503 object.getPosition().set(positionX, positionY); 2504 object.activationRadius = mNormalActivationRadius; 2505 object.width = 64; 2506 object.height = 64; 2507 2508 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ONION); 2509 if (staticData == null) { 2510 final int staticObjectCount = 5; 2511 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2512 2513 GameComponent gravity = allocateComponent(GravityComponent.class); 2514 GameComponent movement = allocateComponent(MovementComponent.class); 2515 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 2516 physics.setBounciness(0.2f); 2517 2518 2519 // Animations 2520 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2521 new FixedSizeArray<CollisionVolume>(1); 2522 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 2523 2524 FixedSizeArray<CollisionVolume> basicAttackVolume = 2525 new FixedSizeArray<CollisionVolume>(1); 2526 basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT)); 2527 2528 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1); 2529 idle.addFrame(new AnimationFrame( 2530 textureLibrary.allocateTexture(R.drawable.enemy_onion01), 2531 Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume)); 2532 2533 idle.setLoop(true); 2534 2535 SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3); 2536 walk.addFrame(new AnimationFrame( 2537 textureLibrary.allocateTexture(R.drawable.enemy_onion01), 2538 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2539 walk.addFrame(new AnimationFrame( 2540 textureLibrary.allocateTexture(R.drawable.enemy_onion02), 2541 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2542 walk.addFrame(new AnimationFrame( 2543 textureLibrary.allocateTexture(R.drawable.enemy_onion03), 2544 Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume)); 2545 walk.setLoop(true); 2546 2547 staticData.add(gravity); 2548 staticData.add(movement); 2549 staticData.add(physics); 2550 staticData.add(idle); 2551 staticData.add(walk); 2552 2553 setStaticData(GameObjectType.ONION, staticData); 2554 2555 } 2556 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2557 render.setPriority(SortConstants.GENERAL_ENEMY); 2558 2559 BackgroundCollisionComponent bgcollision 2560 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 2561 bgcollision.setSize(32, 48); 2562 bgcollision.setOffset(16, 5); 2563 2564 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2565 sprite.setSize((int)object.width, (int)object.height); 2566 sprite.setRenderComponent(render); 2567 2568 EnemyAnimationComponent animation 2569 = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class); 2570 animation.setSprite(sprite); 2571 2572 PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class); 2573 patrol.setMovementSpeed(50.0f, 1000.0f); 2574 2575 DynamicCollisionComponent collision 2576 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2577 sprite.setCollisionComponent(collision); 2578 2579 HitReactionComponent hitReact 2580 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2581 collision.setHitReactionComponent(hitReact); 2582 2583 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 2584 lifetime.setVulnerableToDeathTiles(true); 2585 lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF); 2586 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 2587 if (sound != null) { 2588 lifetime.setDeathSound(sound.load(R.raw.sound_stomp)); 2589 } 2590 2591 object.add(render); 2592 object.add(sprite); 2593 2594 object.add(bgcollision); 2595 object.add(animation); 2596 object.add(patrol); 2597 object.add(collision); 2598 object.add(hitReact); 2599 object.add(lifetime); 2600 2601 object.team = Team.ENEMY; 2602 2603 2604 if (flipHorizontal) { 2605 object.facingDirection.x = -1.0f; 2606 } 2607 2608 addStaticData(GameObjectType.ONION, object, sprite); 2609 2610 sprite.playAnimation(0); 2611 2612 return object; 2613 } 2614 2615 public GameObject spawnEnemyWanda(float positionX, float positionY, boolean flipHorizontal) { 2616 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2617 2618 2619 // Make sure related textures are loaded. 2620 textureLibrary.allocateTexture(R.drawable.energy_ball01); 2621 textureLibrary.allocateTexture(R.drawable.energy_ball02); 2622 textureLibrary.allocateTexture(R.drawable.energy_ball03); 2623 textureLibrary.allocateTexture(R.drawable.energy_ball04); 2624 2625 GameObject object = mGameObjectPool.allocate(); 2626 object.getPosition().set(positionX, positionY); 2627 object.activationRadius = mAlwaysActive; 2628 object.width = 64; 2629 object.height = 128; 2630 2631 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA); 2632 if (staticData == null) { 2633 final int staticObjectCount = 9; 2634 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2635 2636 GameComponent gravity = allocateComponent(GravityComponent.class); 2637 GameComponent movement = allocateComponent(MovementComponent.class); 2638 2639 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 2640 physics.setBounciness(0.0f); 2641 2642 2643 2644 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2645 new FixedSizeArray<CollisionVolume>(1); 2646 basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT)); 2647 2648 SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1); 2649 idle.addFrame(new AnimationFrame( 2650 textureLibrary.allocateTexture(R.drawable.enemy_wanda_stand), 2651 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2652 2653 2654 2655 AnimationFrame walkFrame1 = new AnimationFrame( 2656 textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk01), 2657 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2658 AnimationFrame walkFrame2 = new AnimationFrame( 2659 textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk02), 2660 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2661 AnimationFrame walkFrame3 = new AnimationFrame( 2662 textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk03), 2663 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2664 AnimationFrame walkFrame4 = new AnimationFrame( 2665 textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk04), 2666 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2667 AnimationFrame walkFrame5 = new AnimationFrame( 2668 textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk05), 2669 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2670 SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 8); 2671 walk.addFrame(walkFrame1); 2672 walk.addFrame(walkFrame2); 2673 walk.addFrame(walkFrame3); 2674 walk.addFrame(walkFrame4); 2675 walk.addFrame(walkFrame5); 2676 walk.addFrame(walkFrame4); 2677 walk.addFrame(walkFrame3); 2678 walk.addFrame(walkFrame2); 2679 walk.setLoop(true); 2680 2681 2682 AnimationFrame runFrame4 = new AnimationFrame( 2683 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04), 2684 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2685 2686 SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 9); 2687 run.addFrame(new AnimationFrame( 2688 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run01), 2689 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2690 run.addFrame(new AnimationFrame( 2691 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run02), 2692 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2693 run.addFrame(new AnimationFrame( 2694 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run03), 2695 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2696 run.addFrame(runFrame4); 2697 run.addFrame(new AnimationFrame( 2698 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run05), 2699 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2700 run.addFrame(new AnimationFrame( 2701 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run06), 2702 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2703 run.addFrame(new AnimationFrame( 2704 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run07), 2705 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2706 run.addFrame(runFrame4); 2707 run.addFrame(new AnimationFrame( 2708 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run08), 2709 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2710 run.setLoop(true); 2711 2712 SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 4); 2713 AnimationFrame jump1 = new AnimationFrame( 2714 textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01), 2715 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2716 AnimationFrame jump2 = new AnimationFrame( 2717 textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01), 2718 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2719 jumpStart.addFrame(new AnimationFrame( 2720 textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04), 2721 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 2722 jumpStart.addFrame(new AnimationFrame( 2723 textureLibrary.allocateTexture(R.drawable.enemy_wanda_crouch), 2724 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2725 jumpStart.addFrame(jump1); 2726 jumpStart.addFrame(jump2); 2727 2728 SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2); 2729 jumpAir.addFrame(jump1); 2730 jumpAir.addFrame(jump2); 2731 jumpAir.setLoop(true); 2732 2733 SpriteAnimation attack = new SpriteAnimation(NPCAnimationComponent.SHOOT, 11); 2734 attack.addFrame(new AnimationFrame( 2735 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01), 2736 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 2737 attack.addFrame(new AnimationFrame( 2738 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02), 2739 Utils.framesToTime(24, 8), null, basicVulnerabilityVolume)); 2740 attack.addFrame(new AnimationFrame( 2741 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot03), 2742 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2743 attack.addFrame(new AnimationFrame( 2744 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot04), 2745 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2746 attack.addFrame(new AnimationFrame( 2747 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot05), 2748 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2749 attack.addFrame(new AnimationFrame( 2750 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot06), 2751 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2752 attack.addFrame(new AnimationFrame( 2753 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot07), 2754 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2755 attack.addFrame(new AnimationFrame( 2756 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot08), 2757 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2758 attack.addFrame(new AnimationFrame( 2759 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot09), 2760 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 2761 attack.addFrame(new AnimationFrame( 2762 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02), 2763 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 2764 attack.addFrame(new AnimationFrame( 2765 textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01), 2766 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume)); 2767 2768 staticData.add(gravity); 2769 staticData.add(movement); 2770 staticData.add(physics); 2771 staticData.add(idle); 2772 staticData.add(walk); 2773 staticData.add(run); 2774 staticData.add(jumpStart); 2775 staticData.add(jumpAir); 2776 staticData.add(attack); 2777 2778 setStaticData(GameObjectType.WANDA, staticData); 2779 } 2780 2781 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2782 render.setPriority(SortConstants.NPC); 2783 2784 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 2785 bgcollision.setSize(32, 82); 2786 bgcollision.setOffset(20, 5); 2787 2788 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2789 sprite.setSize((int)object.width, (int)object.height); 2790 sprite.setRenderComponent(render); 2791 2792 NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class); 2793 animation.setSprite(sprite); 2794 2795 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 2796 2797 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2798 sprite.setCollisionComponent(collision); 2799 2800 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2801 collision.setHitReactionComponent(hitReact); 2802 2803 patrol.setHitReactionComponent(hitReact); 2804 2805 SoundSystem sound = sSystemRegistry.soundSystem; 2806 2807 LaunchProjectileComponent gun 2808 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 2809 gun.setShotsPerSet(1); 2810 gun.setSetsPerActivation(1); 2811 gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 11)); 2812 gun.setObjectTypeToSpawn(GameObjectType.WANDA_SHOT); 2813 gun.setOffsetX(45); 2814 gun.setOffsetY(42); 2815 gun.setRequiredAction(GameObject.ActionType.ATTACK); 2816 gun.setVelocityX(300.0f); 2817 gun.setShootSound(sound.load(R.raw.sound_poing)); 2818 2819 object.team = Team.ENEMY; 2820 object.life = 1; 2821 2822 if (flipHorizontal) { 2823 object.facingDirection.x = -1.0f; 2824 } 2825 2826 object.add(gun); 2827 object.add(render); 2828 object.add(sprite); 2829 object.add(bgcollision); 2830 object.add(animation); 2831 object.add(patrol); 2832 object.add(collision); 2833 object.add(hitReact); 2834 2835 addStaticData(GameObjectType.WANDA, object, sprite); 2836 2837 2838 sprite.playAnimation(0); 2839 2840 return object; 2841 } 2842 2843 2844 public GameObject spawnEnemyKyle(float positionX, float positionY, boolean flipHorizontal) { 2845 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 2846 2847 2848 2849 GameObject object = mGameObjectPool.allocate(); 2850 object.getPosition().set(positionX, positionY); 2851 object.activationRadius = mAlwaysActive; 2852 object.width = 64; 2853 object.height = 128; 2854 2855 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE); 2856 if (staticData == null) { 2857 final int staticObjectCount = 9; 2858 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 2859 2860 GameComponent gravity = allocateComponent(GravityComponent.class); 2861 GameComponent movement = allocateComponent(MovementComponent.class); 2862 2863 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 2864 physics.setBounciness(0.0f); 2865 2866 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 2867 new FixedSizeArray<CollisionVolume>(1); 2868 basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT)); 2869 2870 SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1); 2871 idle.addFrame(new AnimationFrame( 2872 textureLibrary.allocateTexture(R.drawable.enemy_kyle_stand), 2873 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 2874 2875 AnimationFrame walkFrame1 = new AnimationFrame( 2876 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk01), 2877 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2878 AnimationFrame walkFrame2 = new AnimationFrame( 2879 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk02), 2880 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2881 AnimationFrame walkFrame3 = new AnimationFrame( 2882 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk03), 2883 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2884 AnimationFrame walkFrame4 = new AnimationFrame( 2885 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk04), 2886 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2887 AnimationFrame walkFrame5 = new AnimationFrame( 2888 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk05), 2889 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2890 AnimationFrame walkFrame6 = new AnimationFrame( 2891 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk06), 2892 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2893 AnimationFrame walkFrame7 = new AnimationFrame( 2894 textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk07), 2895 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 2896 SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 12); 2897 walk.addFrame(walkFrame1); 2898 walk.addFrame(walkFrame2); 2899 walk.addFrame(walkFrame3); 2900 walk.addFrame(walkFrame4); 2901 walk.addFrame(walkFrame3); 2902 walk.addFrame(walkFrame2); 2903 walk.addFrame(walkFrame1); 2904 walk.addFrame(walkFrame5); 2905 walk.addFrame(walkFrame6); 2906 walk.addFrame(walkFrame7); 2907 walk.addFrame(walkFrame6); 2908 walk.addFrame(walkFrame5); 2909 2910 walk.setLoop(true); 2911 2912 AnimationFrame crouch1 = new AnimationFrame( 2913 textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch01), 2914 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2915 AnimationFrame crouch2 = new AnimationFrame( 2916 textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch02), 2917 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 2918 2919 SpriteAnimation runStart = new SpriteAnimation(NPCAnimationComponent.RUN_START, 2); 2920 runStart.addFrame(crouch1); 2921 runStart.addFrame(crouch2); 2922 2923 FixedSizeArray<CollisionVolume> attackVolume = 2924 new FixedSizeArray<CollisionVolume>(2); 2925 attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.HIT)); 2926 attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.COLLECT)); 2927 2928 SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 2); 2929 run.addFrame(new AnimationFrame( 2930 textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash01), 2931 Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume)); 2932 run.addFrame(new AnimationFrame( 2933 textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash02), 2934 Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume)); 2935 run.setLoop(true); 2936 2937 SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 2); 2938 jumpStart.addFrame(crouch1); 2939 jumpStart.addFrame(crouch2); 2940 2941 SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2); 2942 AnimationFrame jump1 = new AnimationFrame( 2943 textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01), 2944 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2945 AnimationFrame jump2 = new AnimationFrame( 2946 textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01), 2947 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 2948 jumpAir.addFrame(jump1); 2949 jumpAir.addFrame(jump2); 2950 jumpAir.setLoop(true); 2951 2952 2953 2954 staticData.add(gravity); 2955 staticData.add(movement); 2956 staticData.add(physics); 2957 staticData.add(idle); 2958 staticData.add(walk); 2959 staticData.add(runStart); 2960 staticData.add(run); 2961 staticData.add(jumpStart); 2962 staticData.add(jumpAir); 2963 2964 setStaticData(GameObjectType.KYLE, staticData); 2965 } 2966 2967 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 2968 render.setPriority(SortConstants.NPC); 2969 2970 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 2971 bgcollision.setSize(32, 90); 2972 bgcollision.setOffset(20, 5); 2973 2974 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 2975 sprite.setSize((int)object.width, (int)object.height); 2976 sprite.setRenderComponent(render); 2977 2978 NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class); 2979 animation.setSprite(sprite); 2980 animation.setStopAtWalls(false); // Kyle can run through walls 2981 2982 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 2983 patrol.setSpeeds(350.0f, 50.0f, 400.0f, -10.0f, 400.0f); 2984 patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KYLE_DEATH, false); 2985 2986 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 2987 sprite.setCollisionComponent(collision); 2988 2989 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 2990 collision.setHitReactionComponent(hitReact); 2991 2992 patrol.setHitReactionComponent(hitReact); 2993 2994 MotionBlurComponent motionBlur = (MotionBlurComponent)allocateComponent(MotionBlurComponent.class); 2995 motionBlur.setTarget(render); 2996 2997 LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class); 2998 launcher.setup((float)(Math.PI * 0.45f), 1000.0f, 0.0f, 0.0f, false); 2999 launcher.setLaunchEffect(GameObjectType.FLASH, 70.0f, 50.0f); 3000 hitReact.setLauncherComponent(launcher, HitType.HIT); 3001 3002 object.team = Team.NONE; 3003 object.life = 1; 3004 3005 if (flipHorizontal) { 3006 object.facingDirection.x = -1.0f; 3007 } 3008 3009 object.add(render); 3010 object.add(sprite); 3011 object.add(bgcollision); 3012 object.add(animation); 3013 object.add(patrol); 3014 object.add(collision); 3015 object.add(hitReact); 3016 object.add(motionBlur); 3017 object.add(launcher); 3018 3019 addStaticData(GameObjectType.KYLE, object, sprite); 3020 3021 3022 sprite.playAnimation(0); 3023 3024 return object; 3025 } 3026 3027 public GameObject spawnEnemyKyleDead(float positionX, float positionY) { 3028 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3029 3030 3031 GameObject object = mGameObjectPool.allocate(); 3032 object.getPosition().set(positionX, positionY); 3033 object.activationRadius = mTightActivationRadius; 3034 object.width = 128; 3035 object.height = 32; 3036 3037 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE_DEAD); 3038 if (staticData == null) { 3039 final int staticObjectCount = 1; 3040 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3041 3042 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 3043 new FixedSizeArray<CollisionVolume>(1); 3044 basicVulnerabilityVolume.add(new AABoxCollisionVolume(32, 5, 64, 32, HitType.COLLECT)); 3045 3046 SpriteAnimation idle = new SpriteAnimation(0, 1); 3047 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.enemy_kyle_dead), 3048 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3049 3050 idle.addFrame(frame1); 3051 3052 idle.setLoop(true); 3053 3054 staticData.add(idle); 3055 3056 setStaticData(GameObjectType.KYLE_DEAD, staticData); 3057 } 3058 3059 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3060 render.setPriority(SortConstants.GENERAL_OBJECT); 3061 3062 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3063 sprite.setSize((int)object.width, (int)object.height); 3064 sprite.setRenderComponent(render); 3065 3066 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3067 sprite.setCollisionComponent(dynamicCollision); 3068 3069 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3070 dynamicCollision.setHitReactionComponent(hitReact); 3071 hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0); 3072 3073 SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class); 3074 dialogSelect.setHitReact(hitReact); 3075 3076 // Since this object doesn't have gravity or background collision, adjust down to simulate the position 3077 // at which a bounding volume would rest. 3078 3079 object.getPosition().y -= 5.0f; 3080 3081 object.add(dialogSelect); 3082 object.add(render); 3083 object.add(sprite); 3084 object.add(dynamicCollision); 3085 object.add(hitReact); 3086 3087 addStaticData(GameObjectType.KYLE_DEAD, object, sprite); 3088 sprite.playAnimation(0); 3089 3090 return object; 3091 } 3092 3093 public GameObject spawnEnemyAndouDead(float positionX, float positionY) { 3094 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3095 3096 3097 GameObject object = mGameObjectPool.allocate(); 3098 object.getPosition().set(positionX, positionY); 3099 object.activationRadius = mTightActivationRadius; 3100 object.width = 64; 3101 object.height = 64; 3102 3103 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ANDOU_DEAD); 3104 if (staticData == null) { 3105 final int staticObjectCount = 1; 3106 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3107 3108 SpriteAnimation idle = new SpriteAnimation(0, 1); 3109 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12), 3110 Utils.framesToTime(24, 1), null, null); 3111 3112 idle.addFrame(frame1); 3113 3114 idle.setLoop(true); 3115 3116 staticData.add(idle); 3117 3118 setStaticData(GameObjectType.ANDOU_DEAD, staticData); 3119 } 3120 3121 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3122 render.setPriority(SortConstants.GENERAL_OBJECT); 3123 3124 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3125 sprite.setSize((int)object.width, (int)object.height); 3126 sprite.setRenderComponent(render); 3127 3128 LaunchProjectileComponent smokeGun 3129 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 3130 smokeGun.setDelayBetweenShots(0.25f); 3131 smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG); 3132 smokeGun.setOffsetX(32); 3133 smokeGun.setOffsetY(15); 3134 smokeGun.setVelocityX(-150.0f); 3135 smokeGun.setVelocityY(100.0f); 3136 smokeGun.setThetaError(0.1f); 3137 3138 LaunchProjectileComponent smokeGun2 3139 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 3140 smokeGun2.setDelayBetweenShots(0.35f); 3141 smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL); 3142 smokeGun2.setOffsetX(16); 3143 smokeGun2.setOffsetY(15); 3144 smokeGun2.setVelocityX(-150.0f); 3145 smokeGun2.setVelocityY(150.0f); 3146 smokeGun2.setThetaError(0.1f); 3147 3148 object.add(render); 3149 object.add(sprite); 3150 object.add(smokeGun); 3151 object.add(smokeGun2); 3152 3153 object.facingDirection.x = -1.0f; 3154 3155 addStaticData(GameObjectType.ANDOU_DEAD, object, sprite); 3156 sprite.playAnimation(0); 3157 3158 return object; 3159 } 3160 3161 public GameObject spawnEnemyKabocha(float positionX, float positionY, boolean flipHorizontal) { 3162 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3163 3164 3165 GameObject object = mGameObjectPool.allocate(); 3166 object.getPosition().set(positionX, positionY); 3167 object.activationRadius = mAlwaysActive; 3168 object.width = 64; 3169 object.height = 128; 3170 3171 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA); 3172 if (staticData == null) { 3173 final int staticObjectCount = 5; 3174 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3175 3176 GameComponent gravity = allocateComponent(GravityComponent.class); 3177 GameComponent movement = allocateComponent(MovementComponent.class); 3178 3179 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 3180 physics.setBounciness(0.0f); 3181 3182 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 3183 new FixedSizeArray<CollisionVolume>(1); 3184 basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT)); 3185 3186 SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1); 3187 idle.addFrame(new AnimationFrame( 3188 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_stand), 3189 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 3190 3191 AnimationFrame walkFrame1 = new AnimationFrame( 3192 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk01), 3193 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3194 AnimationFrame walkFrame2 = new AnimationFrame( 3195 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk02), 3196 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3197 AnimationFrame walkFrame3 = new AnimationFrame( 3198 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk03), 3199 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3200 AnimationFrame walkFrame4 = new AnimationFrame( 3201 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk04), 3202 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3203 AnimationFrame walkFrame5 = new AnimationFrame( 3204 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk05), 3205 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3206 AnimationFrame walkFrame6 = new AnimationFrame( 3207 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk06), 3208 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3209 3210 SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6); 3211 walk.addFrame(walkFrame1); 3212 walk.addFrame(walkFrame2); 3213 walk.addFrame(walkFrame3); 3214 walk.addFrame(walkFrame4); 3215 walk.addFrame(walkFrame5); 3216 walk.addFrame(walkFrame6); 3217 3218 3219 walk.setLoop(true); 3220 3221 staticData.add(gravity); 3222 staticData.add(movement); 3223 staticData.add(physics); 3224 staticData.add(idle); 3225 staticData.add(walk); 3226 3227 setStaticData(GameObjectType.KABOCHA, staticData); 3228 } 3229 3230 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3231 render.setPriority(SortConstants.NPC); 3232 3233 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 3234 bgcollision.setSize(38, 82); 3235 bgcollision.setOffset(16, 5); 3236 3237 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3238 sprite.setSize((int)object.width, (int)object.height); 3239 sprite.setRenderComponent(render); 3240 3241 NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class); 3242 animation.setSprite(sprite); 3243 3244 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 3245 3246 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3247 sprite.setCollisionComponent(collision); 3248 3249 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3250 collision.setHitReactionComponent(hitReact); 3251 3252 patrol.setHitReactionComponent(hitReact); 3253 3254 object.team = Team.ENEMY; 3255 object.life = 1; 3256 3257 if (flipHorizontal) { 3258 object.facingDirection.x = -1.0f; 3259 } 3260 3261 object.add(render); 3262 object.add(sprite); 3263 object.add(bgcollision); 3264 object.add(animation); 3265 object.add(patrol); 3266 object.add(collision); 3267 object.add(hitReact); 3268 3269 addStaticData(GameObjectType.KABOCHA, object, sprite); 3270 3271 3272 sprite.playAnimation(0); 3273 3274 return object; 3275 } 3276 3277 public GameObject spawnRokudouTerminal(float positionX, float positionY) { 3278 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3279 3280 3281 GameObject object = mGameObjectPool.allocate(); 3282 object.getPosition().set(positionX, positionY); 3283 object.activationRadius = mTightActivationRadius; 3284 object.width = 64; 3285 object.height = 64; 3286 3287 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU_TERMINAL); 3288 if (staticData == null) { 3289 final int staticObjectCount = 1; 3290 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3291 3292 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1); 3293 basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64)); 3294 basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT); 3295 3296 3297 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01), 3298 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3299 AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02), 3300 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3301 AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal03), 3302 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3303 AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01), 3304 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 3305 AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02), 3306 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 3307 AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01), 3308 1.0f, null, basicVulnerabilityVolume); 3309 3310 SpriteAnimation idle = new SpriteAnimation(0, 12); 3311 idle.addFrame(frame1); 3312 idle.addFrame(frame5); 3313 idle.addFrame(frame4); 3314 idle.addFrame(frame3); 3315 idle.addFrame(frame2); 3316 idle.addFrame(frame6); 3317 idle.addFrame(frame6); 3318 idle.addFrame(frame3); 3319 idle.addFrame(frame2); 3320 idle.addFrame(frame1); 3321 idle.addFrame(frame2); 3322 idle.addFrame(frame6); 3323 3324 idle.setLoop(true); 3325 3326 3327 staticData.add(idle); 3328 3329 setStaticData(GameObjectType.ROKUDOU_TERMINAL, staticData); 3330 } 3331 3332 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3333 render.setPriority(SortConstants.GENERAL_OBJECT); 3334 3335 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3336 sprite.setSize((int)object.width, (int)object.height); 3337 sprite.setRenderComponent(render); 3338 3339 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3340 sprite.setCollisionComponent(dynamicCollision); 3341 3342 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3343 hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0); 3344 3345 SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class); 3346 dialogSelect.setHitReact(hitReact); 3347 3348 dynamicCollision.setHitReactionComponent(hitReact); 3349 3350 object.add(dialogSelect); 3351 object.add(render); 3352 object.add(sprite); 3353 object.add(dynamicCollision); 3354 object.add(hitReact); 3355 3356 addStaticData(GameObjectType.ROKUDOU_TERMINAL, object, sprite); 3357 sprite.playAnimation(0); 3358 3359 return object; 3360 } 3361 3362 3363 public GameObject spawnKabochaTerminal(float positionX, float positionY) { 3364 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3365 3366 3367 GameObject object = mGameObjectPool.allocate(); 3368 object.getPosition().set(positionX, positionY); 3369 object.activationRadius = mTightActivationRadius; 3370 object.width = 64; 3371 object.height = 64; 3372 3373 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA_TERMINAL); 3374 if (staticData == null) { 3375 final int staticObjectCount = 1; 3376 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3377 3378 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1); 3379 basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64)); 3380 basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT); 3381 3382 3383 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01), 3384 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3385 AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02), 3386 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3387 AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha03), 3388 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 3389 AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01), 3390 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 3391 AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02), 3392 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 3393 AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01), 3394 1.0f, null, basicVulnerabilityVolume); 3395 3396 SpriteAnimation idle = new SpriteAnimation(0, 12); 3397 idle.addFrame(frame1); 3398 idle.addFrame(frame5); 3399 idle.addFrame(frame4); 3400 idle.addFrame(frame3); 3401 idle.addFrame(frame2); 3402 idle.addFrame(frame6); 3403 idle.addFrame(frame6); 3404 idle.addFrame(frame3); 3405 idle.addFrame(frame2); 3406 idle.addFrame(frame1); 3407 idle.addFrame(frame2); 3408 idle.addFrame(frame6); 3409 3410 idle.setLoop(true); 3411 3412 3413 staticData.add(idle); 3414 3415 setStaticData(GameObjectType.KABOCHA_TERMINAL, staticData); 3416 } 3417 3418 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3419 render.setPriority(SortConstants.GENERAL_OBJECT); 3420 3421 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3422 sprite.setSize((int)object.width, (int)object.height); 3423 sprite.setRenderComponent(render); 3424 3425 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3426 sprite.setCollisionComponent(dynamicCollision); 3427 3428 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3429 hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0); 3430 3431 SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class); 3432 dialogSelect.setHitReact(hitReact); 3433 3434 dynamicCollision.setHitReactionComponent(hitReact); 3435 3436 object.add(dialogSelect); 3437 object.add(render); 3438 object.add(sprite); 3439 object.add(dynamicCollision); 3440 object.add(hitReact); 3441 3442 addStaticData(GameObjectType.KABOCHA_TERMINAL, object, sprite); 3443 sprite.playAnimation(0); 3444 3445 return object; 3446 } 3447 3448 public GameObject spawnEnemyEvilKabocha(float positionX, float positionY, boolean flipHorizontal) { 3449 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3450 3451 3452 GameObject object = mGameObjectPool.allocate(); 3453 object.getPosition().set(positionX, positionY); 3454 object.activationRadius = mNormalActivationRadius; 3455 object.width = 128; 3456 object.height = 128; 3457 3458 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EVIL_KABOCHA); 3459 if (staticData == null) { 3460 final int staticObjectCount = 8; 3461 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3462 3463 GameComponent gravity = allocateComponent(GravityComponent.class); 3464 GameComponent movement = allocateComponent(MovementComponent.class); 3465 3466 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 3467 physics.setBounciness(0.0f); 3468 3469 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 3470 new FixedSizeArray<CollisionVolume>(1); 3471 basicVulnerabilityVolume.add(new AABoxCollisionVolume(52, 5, 26, 80, HitType.HIT)); 3472 3473 SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1); 3474 idle.addFrame(new AnimationFrame( 3475 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand), 3476 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 3477 3478 AnimationFrame walkFrame1 = new AnimationFrame( 3479 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk01), 3480 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3481 AnimationFrame walkFrame2 = new AnimationFrame( 3482 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk02), 3483 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3484 AnimationFrame walkFrame3 = new AnimationFrame( 3485 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk03), 3486 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3487 AnimationFrame walkFrame4 = new AnimationFrame( 3488 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk04), 3489 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3490 AnimationFrame walkFrame5 = new AnimationFrame( 3491 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk05), 3492 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3493 AnimationFrame walkFrame6 = new AnimationFrame( 3494 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk06), 3495 Utils.framesToTime(24, 3), null, basicVulnerabilityVolume); 3496 3497 SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6); 3498 walk.addFrame(walkFrame1); 3499 walk.addFrame(walkFrame2); 3500 walk.addFrame(walkFrame3); 3501 walk.addFrame(walkFrame4); 3502 walk.addFrame(walkFrame5); 3503 walk.addFrame(walkFrame6); 3504 3505 walk.setLoop(true); 3506 3507 3508 SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1); 3509 surprised.addFrame(new AnimationFrame( 3510 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_surprised), 3511 4.0f, null, null)); 3512 3513 3514 SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 2); 3515 hit.addFrame(new AnimationFrame( 3516 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit01), 3517 Utils.framesToTime(24, 1), null, null)); 3518 hit.addFrame(new AnimationFrame( 3519 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit02), 3520 Utils.framesToTime(24, 10), null, null)); 3521 3522 SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5); 3523 die.addFrame(new AnimationFrame( 3524 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die01), 3525 Utils.framesToTime(24, 6), null, null)); 3526 die.addFrame(new AnimationFrame( 3527 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand), 3528 Utils.framesToTime(24, 2), null, null)); 3529 die.addFrame(new AnimationFrame( 3530 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die02), 3531 Utils.framesToTime(24, 2), null, null)); 3532 die.addFrame(new AnimationFrame( 3533 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die03), 3534 Utils.framesToTime(24, 2), null, null)); 3535 die.addFrame(new AnimationFrame( 3536 textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die04), 3537 Utils.framesToTime(24, 6), null, null)); 3538 3539 staticData.add(gravity); 3540 staticData.add(movement); 3541 staticData.add(physics); 3542 staticData.add(idle); 3543 staticData.add(walk); 3544 staticData.add(surprised); 3545 staticData.add(hit); 3546 staticData.add(die); 3547 3548 setStaticData(GameObjectType.EVIL_KABOCHA, staticData); 3549 } 3550 3551 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3552 render.setPriority(SortConstants.NPC); 3553 3554 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 3555 bgcollision.setSize(38, 82); 3556 bgcollision.setOffset(45, 5); 3557 3558 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3559 sprite.setSize((int)object.width, (int)object.height); 3560 sprite.setRenderComponent(render); 3561 3562 NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class); 3563 animation.setSprite(sprite); 3564 3565 ChannelSystem.Channel surpriseChannel = null; 3566 ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem; 3567 surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel); 3568 animation.setChannel(surpriseChannel); 3569 animation.setChannelTrigger(NPCAnimationComponent.SURPRISED); 3570 3571 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 3572 patrol.setSpeeds(50.0f, 50.0f, 0.0f, -10.0f, 200.0f); 3573 patrol.setReactToHits(true); 3574 patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.ROKUDOU_ENDING, true); 3575 3576 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3577 sprite.setCollisionComponent(collision); 3578 3579 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3580 collision.setHitReactionComponent(hitReact); 3581 3582 SoundSystem sound = sSystemRegistry.soundSystem; 3583 if (sound != null) { 3584 hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_kabocha_hit)); 3585 } 3586 3587 patrol.setHitReactionComponent(hitReact); 3588 3589 object.team = Team.ENEMY; 3590 object.life = 3; 3591 3592 if (flipHorizontal) { 3593 object.facingDirection.x = -1.0f; 3594 } 3595 3596 object.add(render); 3597 object.add(sprite); 3598 object.add(bgcollision); 3599 object.add(animation); 3600 object.add(patrol); 3601 object.add(collision); 3602 object.add(hitReact); 3603 3604 addStaticData(GameObjectType.EVIL_KABOCHA, object, sprite); 3605 3606 3607 sprite.playAnimation(0); 3608 3609 return object; 3610 } 3611 3612 public GameObject spawnEnemyRokudou(float positionX, float positionY, boolean flipHorizontal) { 3613 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3614 3615 // Make sure related textures are loaded. 3616 textureLibrary.allocateTexture(R.drawable.energy_ball01); 3617 textureLibrary.allocateTexture(R.drawable.energy_ball02); 3618 textureLibrary.allocateTexture(R.drawable.energy_ball03); 3619 textureLibrary.allocateTexture(R.drawable.energy_ball04); 3620 3621 textureLibrary.allocateTexture(R.drawable.effect_bullet01); 3622 textureLibrary.allocateTexture(R.drawable.effect_bullet02); 3623 3624 3625 GameObject object = mGameObjectPool.allocate(); 3626 object.getPosition().set(positionX, positionY); 3627 object.activationRadius = mNormalActivationRadius; 3628 object.width = 128; 3629 object.height = 128; 3630 3631 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU); 3632 if (staticData == null) { 3633 final int staticObjectCount = 8; 3634 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3635 3636 GameComponent movement = allocateComponent(MovementComponent.class); 3637 3638 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 3639 physics.setBounciness(0.0f); 3640 3641 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 3642 new FixedSizeArray<CollisionVolume>(1); 3643 basicVulnerabilityVolume.add(new AABoxCollisionVolume(45, 23, 42, 75, HitType.HIT)); 3644 3645 SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1); 3646 idle.addFrame(new AnimationFrame( 3647 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand), 3648 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 3649 3650 SpriteAnimation fly = new SpriteAnimation(NPCAnimationComponent.WALK, 2); 3651 fly.addFrame(new AnimationFrame( 3652 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly01), 3653 1.0f, null, basicVulnerabilityVolume)); 3654 fly.addFrame(new AnimationFrame( 3655 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly02), 3656 1.0f, null, basicVulnerabilityVolume)); 3657 fly.setLoop(true); 3658 3659 SpriteAnimation shoot = new SpriteAnimation(NPCAnimationComponent.SHOOT, 2); 3660 shoot.addFrame(new AnimationFrame( 3661 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot01), 3662 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 3663 shoot.addFrame(new AnimationFrame( 3664 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot02), 3665 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 3666 shoot.setLoop(true); 3667 3668 3669 SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1); 3670 surprised.addFrame(new AnimationFrame( 3671 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_surprise), 3672 4.0f, null, null)); 3673 3674 3675 SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 7); 3676 AnimationFrame hitFrame1 = new AnimationFrame( 3677 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit01), 3678 Utils.framesToTime(24, 2), null, null); 3679 AnimationFrame hitFrame2 = new AnimationFrame( 3680 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit02), 3681 Utils.framesToTime(24, 1), null, null); 3682 AnimationFrame hitFrame3 = new AnimationFrame( 3683 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit03), 3684 Utils.framesToTime(24, 1), null, null); 3685 3686 hit.addFrame(hitFrame1); 3687 hit.addFrame(hitFrame2); 3688 hit.addFrame(hitFrame3); 3689 hit.addFrame(hitFrame2); 3690 hit.addFrame(hitFrame3); 3691 hit.addFrame(hitFrame2); 3692 hit.addFrame(hitFrame3); 3693 3694 SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5); 3695 die.addFrame(new AnimationFrame( 3696 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand), 3697 Utils.framesToTime(24, 6), null, null)); 3698 die.addFrame(new AnimationFrame( 3699 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die01), 3700 Utils.framesToTime(24, 2), null, null)); 3701 die.addFrame(new AnimationFrame( 3702 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die02), 3703 Utils.framesToTime(24, 4), null, null)); 3704 die.addFrame(new AnimationFrame( 3705 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die03), 3706 Utils.framesToTime(24, 6), null, null)); 3707 die.addFrame(new AnimationFrame( 3708 textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die04), 3709 Utils.framesToTime(24, 6), null, null)); 3710 3711 staticData.add(movement); 3712 staticData.add(physics); 3713 staticData.add(idle); 3714 staticData.add(fly); 3715 staticData.add(surprised); 3716 staticData.add(hit); 3717 staticData.add(die); 3718 staticData.add(shoot); 3719 3720 setStaticData(GameObjectType.ROKUDOU, staticData); 3721 } 3722 3723 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3724 render.setPriority(SortConstants.NPC); 3725 3726 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 3727 bgcollision.setSize(45, 75); 3728 bgcollision.setOffset(45, 23); 3729 3730 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3731 sprite.setSize((int)object.width, (int)object.height); 3732 sprite.setRenderComponent(render); 3733 3734 3735 3736 NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class); 3737 animation.setSprite(sprite); 3738 animation.setFlying(true); 3739 3740 ChannelSystem.Channel surpriseChannel = null; 3741 ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem; 3742 surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel); 3743 animation.setChannel(surpriseChannel); 3744 animation.setChannelTrigger(NPCAnimationComponent.SURPRISED); 3745 3746 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 3747 patrol.setSpeeds(500.0f, 100.0f, 100.0f, -100.0f, 400.0f); 3748 patrol.setFlying(true); 3749 patrol.setReactToHits(true); 3750 patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KABOCHA_ENDING, true); 3751 patrol.setPauseOnAttack(false); 3752 3753 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3754 sprite.setCollisionComponent(collision); 3755 3756 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3757 collision.setHitReactionComponent(hitReact); 3758 3759 SoundSystem sound = sSystemRegistry.soundSystem; 3760 if (sound != null) { 3761 hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_rokudou_hit)); 3762 } 3763 3764 patrol.setHitReactionComponent(hitReact); 3765 3766 ChangeComponentsComponent deathSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 3767 deathSwap.addSwapInComponent(allocateComponent(GravityComponent.class)); 3768 deathSwap.setSwapAction(ActionType.DEATH); 3769 3770 LaunchProjectileComponent gun 3771 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 3772 gun.setShotsPerSet(1); 3773 gun.setSetsPerActivation(-1); 3774 gun.setDelayBetweenSets(1.5f); 3775 gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL); 3776 gun.setOffsetX(75); 3777 gun.setOffsetY(42); 3778 gun.setRequiredAction(GameObject.ActionType.ATTACK); 3779 gun.setVelocityX(300.0f); 3780 gun.setVelocityY(-300.0f); 3781 gun.setShootSound(sound.load(R.raw.sound_poing)); 3782 3783 3784 LaunchProjectileComponent gun2 3785 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 3786 gun2.setShotsPerSet(5); 3787 gun2.setDelayBetweenShots(0.1f); 3788 gun2.setSetsPerActivation(-1); 3789 gun2.setDelayBetweenSets(2.5f); 3790 gun2.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET); 3791 gun2.setOffsetX(75); 3792 gun2.setOffsetY(42); 3793 gun2.setRequiredAction(GameObject.ActionType.ATTACK); 3794 gun2.setVelocityX(300.0f); 3795 gun2.setVelocityY(-300.0f); 3796 gun.setShootSound(sound.load(R.raw.sound_gun)); 3797 3798 3799 object.team = Team.ENEMY; 3800 object.life = 3; 3801 3802 if (flipHorizontal) { 3803 object.facingDirection.x = -1.0f; 3804 } 3805 3806 // HACK! Since there's no gravity and this is a big character, align him to the floor 3807 // manually. 3808 object.getPosition().y -= 23; 3809 3810 object.add(render); 3811 object.add(sprite); 3812 object.add(bgcollision); 3813 object.add(animation); 3814 object.add(patrol); 3815 object.add(collision); 3816 object.add(hitReact); 3817 object.add(deathSwap); 3818 object.add(gun); 3819 object.add(gun2); 3820 3821 addStaticData(GameObjectType.ROKUDOU, object, sprite); 3822 3823 3824 sprite.playAnimation(0); 3825 3826 return object; 3827 } 3828 3829 3830 public GameObject spawnPlayerGhost(float positionX, float positionY, GameObject player, float lifeTime) { 3831 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 3832 3833 3834 GameObject object = mGameObjectPool.allocate(); 3835 object.getPosition().set(positionX, positionY); 3836 object.activationRadius = mAlwaysActive; 3837 object.width = 64; 3838 object.height = 64; 3839 3840 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST); 3841 if (staticData == null) { 3842 final int staticObjectCount = 4; 3843 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3844 3845 //GravityComponent gravity = (GravityComponent)allocateComponent(GravityComponent.class); 3846 //gravity.setGravityMultiplier(0.1f); 3847 3848 GameComponent movement = allocateComponent(MovementComponent.class); 3849 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 3850 physics.setBounciness(0.6f); 3851 3852 GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class); 3853 ghost.setMovementSpeed(2000.0f); 3854 ghost.setAcceleration(700.0f); //300 3855 ghost.setUseOrientationSensor(true); 3856 ghost.setKillOnRelease(true); 3857 3858 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 3859 if (sound != null) { 3860 ghost.setAmbientSound(sound.load(R.raw.sound_possession)); 3861 } 3862 3863 FixedSizeArray<CollisionVolume> basicAttackVolume = 3864 new FixedSizeArray<CollisionVolume>(1); 3865 basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.POSSESS)); 3866 3867 SpriteAnimation idle = new SpriteAnimation(0, 4); 3868 idle.addFrame(new AnimationFrame( 3869 textureLibrary.getTextureByResource(R.drawable.effect_energyball01), 3870 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3871 idle.addFrame(new AnimationFrame( 3872 textureLibrary.getTextureByResource(R.drawable.effect_energyball02), 3873 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3874 idle.addFrame(new AnimationFrame( 3875 textureLibrary.getTextureByResource(R.drawable.effect_energyball03), 3876 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3877 idle.addFrame(new AnimationFrame( 3878 textureLibrary.getTextureByResource(R.drawable.effect_energyball04), 3879 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3880 idle.setLoop(true); 3881 3882 //staticData.add(gravity); 3883 staticData.add(movement); 3884 staticData.add(physics); 3885 staticData.add(ghost); 3886 staticData.add(idle); 3887 3888 setStaticData(GameObjectType.GHOST, staticData); 3889 } 3890 3891 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3892 render.setPriority(SortConstants.PROJECTILE); 3893 3894 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 3895 bgcollision.setSize(64, 64); 3896 bgcollision.setOffset(0, 0); 3897 3898 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3899 sprite.setSize((int)object.width, (int)object.height); 3900 sprite.setRenderComponent(render); 3901 3902 3903 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3904 sprite.setCollisionComponent(dynamicCollision); 3905 3906 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3907 hitReact.setDieOnAttack(true); 3908 3909 dynamicCollision.setHitReactionComponent(hitReact); 3910 LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 3911 // when the ghost dies it either releases itself or passes control to another object, so we 3912 // don't want control to return to the player. 3913 3914 life.setReleaseGhostOnDeath(false); 3915 3916 3917 object.life = 1; 3918 3919 object.add(bgcollision); 3920 object.add(render); 3921 object.add(sprite); 3922 object.add(dynamicCollision); 3923 object.add(hitReact); 3924 object.add(life); 3925 3926 addStaticData(GameObjectType.GHOST, object, sprite); 3927 3928 object.commitUpdates(); 3929 3930 GhostComponent ghost = object.findByClass(GhostComponent.class); 3931 if (ghost != null) { 3932 ghost.setLifeTime(lifeTime); 3933 } 3934 sprite.playAnimation(0); 3935 3936 return object; 3937 } 3938 3939 public GameObject spawnEnergyBall(float positionX, float positionY, boolean flipHorizontal) { 3940 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 3941 3942 3943 GameObject object = mGameObjectPool.allocate(); 3944 object.getPosition().set(positionX, positionY); 3945 object.activationRadius = mTightActivationRadius; 3946 object.width = 32; 3947 object.height = 32; 3948 3949 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENERGY_BALL); 3950 if (staticData == null) { 3951 final int staticObjectCount = 2; 3952 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 3953 3954 GameComponent movement = allocateComponent(MovementComponent.class); 3955 3956 FixedSizeArray<CollisionVolume> basicAttackVolume = 3957 new FixedSizeArray<CollisionVolume>(1); 3958 basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT)); 3959 3960 SpriteAnimation idle = new SpriteAnimation(0, 4); 3961 idle.addFrame(new AnimationFrame( 3962 textureLibrary.allocateTexture(R.drawable.energy_ball01), 3963 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3964 idle.addFrame(new AnimationFrame( 3965 textureLibrary.allocateTexture(R.drawable.energy_ball02), 3966 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3967 idle.addFrame(new AnimationFrame( 3968 textureLibrary.allocateTexture(R.drawable.energy_ball03), 3969 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3970 idle.addFrame(new AnimationFrame( 3971 textureLibrary.allocateTexture(R.drawable.energy_ball04), 3972 Utils.framesToTime(24, 1), basicAttackVolume, null)); 3973 idle.setLoop(true); 3974 3975 staticData.add(movement); 3976 staticData.add(idle); 3977 3978 setStaticData(GameObjectType.ENERGY_BALL, staticData); 3979 3980 } 3981 3982 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 3983 render.setPriority(SortConstants.PROJECTILE); 3984 3985 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 3986 lifetime.setTimeUntilDeath(5.0f); 3987 3988 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 3989 sprite.setSize((int)object.width, (int)object.height); 3990 sprite.setRenderComponent(render); 3991 3992 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 3993 sprite.setCollisionComponent(dynamicCollision); 3994 3995 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 3996 hitReact.setDieOnAttack(true); 3997 3998 dynamicCollision.setHitReactionComponent(hitReact); 3999 4000 object.life = 1; 4001 object.team = Team.ENEMY; 4002 object.destroyOnDeactivation = true; 4003 4004 if (flipHorizontal) { 4005 object.facingDirection.x = -1.0f; 4006 } 4007 4008 object.add(lifetime); 4009 object.add(render); 4010 object.add(sprite); 4011 object.add(dynamicCollision); 4012 object.add(hitReact); 4013 4014 addStaticData(GameObjectType.ENERGY_BALL, object, sprite); 4015 4016 sprite.playAnimation(0); 4017 4018 return object; 4019 } 4020 4021 public GameObject spawnWandaShot(float positionX, float positionY, boolean flipHorizontal) { 4022 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4023 4024 4025 GameObject object = mGameObjectPool.allocate(); 4026 object.getPosition().set(positionX, positionY); 4027 object.activationRadius = mTightActivationRadius; 4028 object.width = 32; 4029 object.height = 32; 4030 4031 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA_SHOT); 4032 if (staticData == null) { 4033 final int staticObjectCount = 2; 4034 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4035 4036 GameComponent movement = allocateComponent(MovementComponent.class); 4037 4038 FixedSizeArray<CollisionVolume> basicAttackVolume = 4039 new FixedSizeArray<CollisionVolume>(1); 4040 basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT)); 4041 4042 SpriteAnimation idle = new SpriteAnimation(0, 4); 4043 idle.addFrame(new AnimationFrame( 4044 textureLibrary.allocateTexture(R.drawable.energy_ball01), 4045 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4046 idle.addFrame(new AnimationFrame( 4047 textureLibrary.allocateTexture(R.drawable.energy_ball02), 4048 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4049 idle.addFrame(new AnimationFrame( 4050 textureLibrary.allocateTexture(R.drawable.energy_ball03), 4051 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4052 idle.addFrame(new AnimationFrame( 4053 textureLibrary.allocateTexture(R.drawable.energy_ball04), 4054 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4055 idle.setLoop(true); 4056 4057 staticData.add(movement); 4058 staticData.add(idle); 4059 4060 setStaticData(GameObjectType.WANDA_SHOT, staticData); 4061 4062 } 4063 4064 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4065 render.setPriority(SortConstants.PROJECTILE); 4066 4067 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4068 lifetime.setTimeUntilDeath(5.0f); 4069 4070 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4071 sprite.setSize((int)object.width, (int)object.height); 4072 sprite.setRenderComponent(render); 4073 4074 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4075 sprite.setCollisionComponent(dynamicCollision); 4076 4077 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4078 //hitReact.setDieOnAttack(true); 4079 4080 dynamicCollision.setHitReactionComponent(hitReact); 4081 4082 object.life = 1; 4083 object.team = Team.NONE; 4084 object.destroyOnDeactivation = true; 4085 4086 if (flipHorizontal) { 4087 object.facingDirection.x = -1.0f; 4088 } 4089 4090 object.add(lifetime); 4091 object.add(render); 4092 object.add(sprite); 4093 object.add(dynamicCollision); 4094 object.add(hitReact); 4095 4096 addStaticData(GameObjectType.WANDA_SHOT, object, sprite); 4097 4098 sprite.playAnimation(0); 4099 4100 return object; 4101 } 4102 4103 public GameObject spawnCannonBall(float positionX, float positionY, boolean flipHorizontal) { 4104 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4105 4106 4107 GameObject object = mGameObjectPool.allocate(); 4108 object.getPosition().set(positionX, positionY); 4109 object.activationRadius = mTightActivationRadius; 4110 object.width = 32; 4111 object.height = 32; 4112 4113 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON_BALL); 4114 if (staticData == null) { 4115 final int staticObjectCount = 2; 4116 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4117 4118 GameComponent movement = allocateComponent(MovementComponent.class); 4119 4120 FixedSizeArray<CollisionVolume> basicAttackVolume = 4121 new FixedSizeArray<CollisionVolume>(1); 4122 basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT)); 4123 4124 SpriteAnimation idle = new SpriteAnimation(0, 1); 4125 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.snail_bomb), 4126 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4127 4128 staticData.add(movement); 4129 staticData.add(idle); 4130 4131 setStaticData(GameObjectType.CANNON_BALL, staticData); 4132 } 4133 4134 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4135 render.setPriority(SortConstants.PROJECTILE); 4136 4137 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4138 lifetime.setTimeUntilDeath(3.0f); 4139 lifetime.setDieOnHitBackground(true); 4140 4141 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4142 sprite.setSize((int)object.width, (int)object.height); 4143 sprite.setRenderComponent(render); 4144 4145 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4146 sprite.setCollisionComponent(dynamicCollision); 4147 4148 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4149 hitReact.setDieOnAttack(true); 4150 4151 dynamicCollision.setHitReactionComponent(hitReact); 4152 4153 SimpleCollisionComponent collision = (SimpleCollisionComponent)allocateComponent(SimpleCollisionComponent.class); 4154 4155 4156 object.life = 1; 4157 object.team = Team.ENEMY; 4158 object.destroyOnDeactivation = true; 4159 4160 if (flipHorizontal) { 4161 object.facingDirection.x = -1.0f; 4162 } 4163 4164 object.add(lifetime); 4165 object.add(render); 4166 object.add(sprite); 4167 object.add(dynamicCollision); 4168 object.add(hitReact); 4169 object.add(collision); 4170 4171 addStaticData(GameObjectType.CANNON_BALL, object, sprite); 4172 4173 sprite.playAnimation(0); 4174 4175 return object; 4176 } 4177 4178 public GameObject spawnTurretBullet(float positionX, float positionY, boolean flipHorizontal) { 4179 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4180 4181 4182 GameObject object = mGameObjectPool.allocate(); 4183 object.getPosition().set(positionX, positionY); 4184 object.activationRadius = mTightActivationRadius; 4185 object.width = 16; 4186 object.height = 16; 4187 4188 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET_BULLET); 4189 if (staticData == null) { 4190 final int staticObjectCount = 2; 4191 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4192 4193 GameComponent movement = allocateComponent(MovementComponent.class); 4194 4195 FixedSizeArray<CollisionVolume> basicAttackVolume = 4196 new FixedSizeArray<CollisionVolume>(1); 4197 basicAttackVolume.add(new SphereCollisionVolume(8, 8, 8, HitType.HIT)); 4198 4199 SpriteAnimation idle = new SpriteAnimation(0, 2); 4200 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet01), 4201 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4202 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet02), 4203 Utils.framesToTime(24, 1), basicAttackVolume, null)); 4204 idle.setLoop(true); 4205 4206 staticData.add(movement); 4207 staticData.add(idle); 4208 4209 setStaticData(GameObjectType.TURRET_BULLET, staticData); 4210 } 4211 4212 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4213 render.setPriority(SortConstants.PROJECTILE); 4214 4215 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4216 lifetime.setTimeUntilDeath(3.0f); 4217 4218 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4219 sprite.setSize((int)object.width, (int)object.height); 4220 sprite.setRenderComponent(render); 4221 4222 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4223 sprite.setCollisionComponent(dynamicCollision); 4224 4225 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4226 hitReact.setDieOnAttack(true); 4227 4228 dynamicCollision.setHitReactionComponent(hitReact); 4229 4230 4231 object.life = 1; 4232 object.team = Team.ENEMY; 4233 object.destroyOnDeactivation = true; 4234 4235 if (flipHorizontal) { 4236 object.facingDirection.x = -1.0f; 4237 } 4238 4239 object.add(lifetime); 4240 object.add(render); 4241 object.add(sprite); 4242 object.add(dynamicCollision); 4243 object.add(hitReact); 4244 4245 addStaticData(GameObjectType.TURRET_BULLET, object, sprite); 4246 4247 sprite.playAnimation(0); 4248 4249 return object; 4250 } 4251 4252 public GameObject spawnBrobotBullet(float positionX, float positionY, boolean flipHorizontal) { 4253 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4254 4255 4256 GameObject object = mGameObjectPool.allocate(); 4257 object.getPosition().set(positionX, positionY); 4258 object.activationRadius = mTightActivationRadius; 4259 object.width = 64; 4260 object.height = 64; 4261 4262 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_BULLET); 4263 if (staticData == null) { 4264 final int staticObjectCount = 2; 4265 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4266 4267 GameComponent movement = allocateComponent(MovementComponent.class); 4268 4269 SpriteAnimation idle = new SpriteAnimation(0, 3); 4270 idle.addFrame(new AnimationFrame( 4271 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01), 4272 Utils.framesToTime(24, 1), null, null)); 4273 idle.addFrame(new AnimationFrame( 4274 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02), 4275 Utils.framesToTime(24, 1), null, null)); 4276 idle.addFrame(new AnimationFrame( 4277 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03), 4278 Utils.framesToTime(24, 1), null, null)); 4279 idle.setLoop(true); 4280 4281 staticData.add(movement); 4282 staticData.add(idle); 4283 4284 setStaticData(GameObjectType.BROBOT_BULLET, staticData); 4285 } 4286 4287 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4288 render.setPriority(SortConstants.PROJECTILE); 4289 4290 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4291 lifetime.setTimeUntilDeath(3.0f); 4292 4293 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4294 sprite.setSize((int)object.width, (int)object.height); 4295 sprite.setRenderComponent(render); 4296 4297 object.life = 1; 4298 object.team = Team.ENEMY; 4299 object.destroyOnDeactivation = true; 4300 4301 if (flipHorizontal) { 4302 object.facingDirection.x = -1.0f; 4303 } 4304 4305 object.add(lifetime); 4306 object.add(render); 4307 object.add(sprite); 4308 4309 4310 addStaticData(GameObjectType.BROBOT_BULLET, object, sprite); 4311 4312 sprite.playAnimation(0); 4313 4314 return object; 4315 } 4316 4317 public GameObject spawnCoin(float positionX, float positionY) { 4318 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4319 4320 4321 GameObject object = mGameObjectPool.allocate(); 4322 object.getPosition().set(positionX, positionY); 4323 object.activationRadius = mTightActivationRadius; 4324 object.width = 16; 4325 object.height = 16; 4326 4327 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.COIN); 4328 if (staticData == null) { 4329 final int staticObjectCount = 2; 4330 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4331 4332 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = null; /*new FixedSizeArray<CollisionVolume>(1); 4333 basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 8, 8)); 4334 basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);*/ 4335 4336 SpriteAnimation idle = new SpriteAnimation(0, 5); 4337 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin01), 4338 Utils.framesToTime(24, 30), null, basicVulnerabilityVolume)); 4339 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin02), 4340 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4341 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin03), 4342 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4343 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin04), 4344 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 4345 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin05), 4346 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4347 idle.setLoop(true); 4348 4349 InventoryComponent.UpdateRecord addCoin = new InventoryComponent.UpdateRecord(); 4350 addCoin.coinCount = 1; 4351 4352 staticData.add(addCoin); 4353 staticData.add(idle); 4354 4355 setStaticData(GameObjectType.COIN, staticData); 4356 } 4357 4358 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4359 render.setPriority(SortConstants.GENERAL_OBJECT); 4360 4361 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4362 sprite.setSize((int)object.width, (int)object.height); 4363 sprite.setRenderComponent(render); 4364 4365 //DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4366 //sprite.setCollisionComponent(dynamicCollision); 4367 4368 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4369 hitReact.setDieWhenCollected(true); 4370 hitReact.setInvincible(true); 4371 4372 HitPlayerComponent hitPlayer = (HitPlayerComponent)allocateComponent(HitPlayerComponent.class); 4373 hitPlayer.setup(32, hitReact, HitType.COLLECT, false); 4374 4375 SoundSystem sound = sSystemRegistry.soundSystem; 4376 if (sound != null) { 4377 hitReact.setTakeHitSound(HitType.COLLECT, sound.load(R.raw.ding)); 4378 } 4379 4380 // TODO: this is pretty dumb. The static data binding needs to be made generic. 4381 final int staticDataSize = staticData.getCount(); 4382 for (int x = 0; x < staticDataSize; x++) { 4383 final BaseObject entry = staticData.get(x); 4384 if (entry instanceof InventoryComponent.UpdateRecord) { 4385 hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry); 4386 break; 4387 } 4388 } 4389 4390 //dynamicCollision.setHitReactionComponent(hitReact); 4391 4392 LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4393 life.setIncrementEventCounter(EventRecorder.COUNTER_PEARLS_COLLECTED); 4394 4395 object.life = 1; 4396 4397 object.add(render); 4398 object.add(sprite); 4399 //object.add(dynamicCollision); 4400 object.add(hitPlayer); 4401 object.add(hitReact); 4402 object.add(life); 4403 4404 addStaticData(GameObjectType.COIN, object, sprite); 4405 sprite.playAnimation(0); 4406 4407 EventRecorder recorder = sSystemRegistry.eventRecorder; 4408 recorder.incrementEventCounter(EventRecorder.COUNTER_PEARLS_TOTAL); 4409 4410 return object; 4411 } 4412 4413 public GameObject spawnRuby(float positionX, float positionY) { 4414 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4415 4416 4417 GameObject object = mGameObjectPool.allocate(); 4418 object.getPosition().set(positionX, positionY); 4419 object.activationRadius = mTightActivationRadius; 4420 object.width = 32; 4421 object.height = 32; 4422 4423 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.RUBY); 4424 if (staticData == null) { 4425 final int staticObjectCount = 2; 4426 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4427 4428 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1); 4429 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16)); 4430 basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT); 4431 4432 SpriteAnimation idle = new SpriteAnimation(0, 5); 4433 idle.addFrame(new AnimationFrame( 4434 textureLibrary.allocateTexture(R.drawable.object_ruby01), 4435 2.0f, null, basicVulnerabilityVolume)); 4436 idle.addFrame(new AnimationFrame( 4437 textureLibrary.allocateTexture(R.drawable.object_ruby02), 4438 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4439 idle.addFrame(new AnimationFrame( 4440 textureLibrary.allocateTexture(R.drawable.object_ruby03), 4441 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 4442 idle.addFrame(new AnimationFrame( 4443 textureLibrary.allocateTexture(R.drawable.object_ruby04), 4444 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 4445 idle.addFrame(new AnimationFrame( 4446 textureLibrary.allocateTexture(R.drawable.object_ruby05), 4447 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4448 idle.setLoop(true); 4449 4450 InventoryComponent.UpdateRecord addRuby = new InventoryComponent.UpdateRecord(); 4451 addRuby.rubyCount = 1; 4452 4453 staticData.add(addRuby); 4454 4455 staticData.add(idle); 4456 setStaticData(GameObjectType.RUBY, staticData); 4457 } 4458 4459 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4460 render.setPriority(SortConstants.GENERAL_OBJECT); 4461 4462 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4463 sprite.setSize((int)object.width, (int)object.height); 4464 sprite.setRenderComponent(render); 4465 4466 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4467 sprite.setCollisionComponent(dynamicCollision); 4468 4469 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4470 hitReact.setDieWhenCollected(true); 4471 hitReact.setInvincible(true); 4472 // TODO: this is pretty dumb. The static data binding needs to be made generic. 4473 final int staticDataSize = staticData.getCount(); 4474 for (int x = 0; x < staticDataSize; x++) { 4475 final BaseObject entry = staticData.get(x); 4476 if (entry instanceof InventoryComponent.UpdateRecord) { 4477 hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry); 4478 break; 4479 } 4480 } 4481 4482 dynamicCollision.setHitReactionComponent(hitReact); 4483 4484 LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4485 life.setObjectToSpawnOnDeath(GameObjectType.GEM_EFFECT_SPAWNER); 4486 4487 object.life = 1; 4488 4489 object.add(render); 4490 object.add(sprite); 4491 object.add(dynamicCollision); 4492 object.add(hitReact); 4493 object.add(life); 4494 4495 addStaticData(GameObjectType.RUBY, object, sprite); 4496 4497 sprite.playAnimation(0); 4498 4499 return object; 4500 } 4501 4502 public GameObject spawnDiary(float positionX, float positionY) { 4503 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4504 4505 LevelSystem level = sSystemRegistry.levelSystem; 4506 if (level != null) { 4507 final LevelTree.Level currentLevel = level.getCurrentLevel(); 4508 if (currentLevel != null && currentLevel.diaryCollected) { 4509 return null; 4510 } 4511 } 4512 4513 GameObject object = mGameObjectPool.allocate(); 4514 object.getPosition().set(positionX, positionY); 4515 object.activationRadius = mTightActivationRadius; 4516 object.width = 32; 4517 object.height = 32; 4518 4519 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DIARY); 4520 if (staticData == null) { 4521 final int staticObjectCount = 2; 4522 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4523 4524 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1); 4525 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16)); 4526 basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT); 4527 4528 SpriteAnimation idle = new SpriteAnimation(0, 8); 4529 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01), 4530 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 4531 AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary02), 4532 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume); 4533 4534 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01), 4535 1.0f, null, basicVulnerabilityVolume)); 4536 idle.addFrame(frame2); 4537 idle.addFrame(frame1); 4538 idle.addFrame(frame2); 4539 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary03), 4540 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4541 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary04), 4542 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4543 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary05), 4544 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4545 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary06), 4546 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 4547 4548 idle.setLoop(true); 4549 4550 InventoryComponent.UpdateRecord addDiary = new InventoryComponent.UpdateRecord(); 4551 addDiary.diaryCount = 1; 4552 4553 staticData.add(addDiary); 4554 4555 staticData.add(idle); 4556 4557 setStaticData(GameObjectType.DIARY, staticData); 4558 } 4559 4560 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4561 render.setPriority(SortConstants.GENERAL_OBJECT); 4562 4563 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4564 sprite.setSize((int)object.width, (int)object.height); 4565 sprite.setRenderComponent(render); 4566 4567 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4568 sprite.setCollisionComponent(dynamicCollision); 4569 4570 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4571 hitReact.setDieWhenCollected(true); 4572 hitReact.setInvincible(true); 4573 hitReact.setSpawnGameEventOnHit(CollisionParameters.HitType.COLLECT, 4574 GameFlowEvent.EVENT_SHOW_DIARY, 0); 4575 // TODO: this is pretty dumb. The static data binding needs to be made generic. 4576 final int staticDataSize = staticData.getCount(); 4577 for (int x = 0; x < staticDataSize; x++) { 4578 final BaseObject entry = staticData.get(x); 4579 if (entry instanceof InventoryComponent.UpdateRecord) { 4580 hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry); 4581 break; 4582 } 4583 } 4584 4585 dynamicCollision.setHitReactionComponent(hitReact); 4586 4587 LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 4588 4589 object.life = 1; 4590 4591 object.add(render); 4592 object.add(sprite); 4593 object.add(dynamicCollision); 4594 object.add(hitReact); 4595 object.add(life); 4596 4597 addStaticData(GameObjectType.DIARY, object, sprite); 4598 sprite.playAnimation(0); 4599 4600 return object; 4601 } 4602 4603 public GameObject spawnObjectDoor(float positionX, float positionY, GameObjectType type, boolean solid) { 4604 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4605 4606 GameObject object = mGameObjectPool.allocate(); 4607 object.getPosition().set(positionX, positionY); 4608 object.activationRadius = mTightActivationRadius; 4609 object.width = 32; 4610 object.height = 64; 4611 4612 FixedSizeArray<BaseObject> staticData = getStaticData(type); 4613 if (staticData == null) { 4614 final int staticObjectCount = 5; 4615 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4616 4617 final int red_frames[] = { 4618 R.drawable.object_door_red01, 4619 R.drawable.object_door_red02, 4620 R.drawable.object_door_red03, 4621 R.drawable.object_door_red04, 4622 }; 4623 4624 final int blue_frames[] = { 4625 R.drawable.object_door_blue01, 4626 R.drawable.object_door_blue02, 4627 R.drawable.object_door_blue03, 4628 R.drawable.object_door_blue04, 4629 }; 4630 4631 final int green_frames[] = { 4632 R.drawable.object_door_green01, 4633 R.drawable.object_door_green02, 4634 R.drawable.object_door_green03, 4635 R.drawable.object_door_green04, 4636 }; 4637 4638 int frames[] = red_frames; 4639 4640 if (type == GameObjectType.DOOR_GREEN) { 4641 frames = green_frames; 4642 } else if (type == GameObjectType.DOOR_BLUE) { 4643 frames = blue_frames; 4644 } 4645 4646 FixedSizeArray<CollisionVolume> vulnerabilityVolume = null; 4647 4648 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]), 4649 Utils.framesToTime(24, 1), null, vulnerabilityVolume); 4650 AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]), 4651 Utils.framesToTime(24, 2)); 4652 AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(frames[2]), 4653 Utils.framesToTime(24, 2)); 4654 AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(frames[3]), 4655 Utils.framesToTime(24, 1)); 4656 4657 // one frame of closing is deadly 4658 4659 FixedSizeArray<CollisionVolume> attackVolume = 4660 new FixedSizeArray<CollisionVolume>(1); 4661 attackVolume.add(new AABoxCollisionVolume(12, 8, 8, 56)); 4662 attackVolume.get(0).setHitType(HitType.DEATH); 4663 4664 4665 4666 AnimationFrame closeFrame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]), 4667 Utils.framesToTime(24, 2), attackVolume, vulnerabilityVolume); 4668 4669 SpriteAnimation idle_closed = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSED, 1); 4670 idle_closed.addFrame(frame1); 4671 4672 SpriteAnimation idle_open = new SpriteAnimation(DoorAnimationComponent.Animation.OPEN, 1); 4673 idle_open.addFrame(frame4); 4674 4675 SpriteAnimation open = new SpriteAnimation(DoorAnimationComponent.Animation.OPENING, 2); 4676 open.addFrame(frame2); 4677 open.addFrame(frame3); 4678 4679 SpriteAnimation close = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSING, 2); 4680 close.addFrame(frame3); 4681 close.addFrame(closeFrame2); 4682 4683 SolidSurfaceComponent solidSurface 4684 = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 4685 solidSurface.inititalize(4); 4686 // box shape: 4687 // ___ ___1 4688 // | | 2| |3 4689 // --- ---4 4690 Vector2 surface1Start = new Vector2(0, object.height); 4691 Vector2 surface1End = new Vector2(object.width, object.height); 4692 Vector2 surface1Normal = new Vector2(0.0f, -1.0f); 4693 surface1Normal.normalize(); 4694 4695 Vector2 surface2Start = new Vector2(0, object.height); 4696 Vector2 surface2End = new Vector2(0, 0); 4697 Vector2 surface2Normal = new Vector2(-1.0f, 0.0f); 4698 surface2Normal.normalize(); 4699 4700 Vector2 surface3Start = new Vector2(object.width, object.height); 4701 Vector2 surface3End = new Vector2(object.width, 0); 4702 Vector2 surface3Normal = new Vector2(1.0f, 0); 4703 4704 Vector2 surface4Start = new Vector2(0, 0); 4705 Vector2 surface4End = new Vector2(object.width, 0); 4706 Vector2 surface4Normal = new Vector2(0, 1.0f); 4707 4708 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 4709 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 4710 solidSurface.addSurface(surface3Start, surface3End, surface3Normal); 4711 solidSurface.addSurface(surface4Start, surface4End, surface4Normal); 4712 4713 staticData.add(idle_open); 4714 staticData.add(idle_closed); 4715 staticData.add(open); 4716 staticData.add(close); 4717 staticData.add(solidSurface); 4718 setStaticData(type, staticData); 4719 } 4720 4721 4722 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4723 render.setPriority(SortConstants.FOREGROUND_OBJECT); 4724 4725 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4726 sprite.setSize((int)object.width, (int)object.height); 4727 sprite.setRenderComponent(render); 4728 4729 DoorAnimationComponent doorAnim = (DoorAnimationComponent)allocateComponent(DoorAnimationComponent.class); 4730 doorAnim.setSprite(sprite); 4731 4732 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 4733 if (sound != null) { 4734 doorAnim.setSounds(sound.load(R.raw.sound_open), sound.load(R.raw.sound_close)); 4735 } 4736 4737 ChannelSystem.Channel doorChannel = null; 4738 ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem; 4739 switch (type) { 4740 case DOOR_RED: 4741 doorChannel = channelSystem.registerChannel(sRedButtonChannel); 4742 break; 4743 case DOOR_BLUE: 4744 doorChannel = channelSystem.registerChannel(sBlueButtonChannel); 4745 break; 4746 case DOOR_GREEN: 4747 doorChannel = channelSystem.registerChannel(sGreenButtonChannel); 4748 break; 4749 } 4750 doorAnim.setChannel(doorChannel); 4751 4752 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4753 sprite.setCollisionComponent(dynamicCollision); 4754 4755 HitReactionComponent hitReact 4756 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4757 dynamicCollision.setHitReactionComponent(hitReact); 4758 4759 4760 4761 object.add(render); 4762 object.add(sprite); 4763 object.add(doorAnim); 4764 object.add(dynamicCollision); 4765 object.add(hitReact); 4766 addStaticData(type, object, sprite); 4767 4768 object.commitUpdates(); 4769 4770 SolidSurfaceComponent solidSurface = object.findByClass(SolidSurfaceComponent.class); 4771 if (solid) { 4772 doorAnim.setSolidSurface(solidSurface); 4773 } else { 4774 object.remove(solidSurface); 4775 object.commitUpdates(); 4776 } 4777 4778 4779 sprite.playAnimation(0); 4780 4781 return object; 4782 } 4783 4784 public GameObject spawnObjectButton(float positionX, float positionY, GameObjectType type) { 4785 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4786 4787 GameObject object = mGameObjectPool.allocate(); 4788 object.getPosition().set(positionX, positionY); 4789 object.activationRadius = mTightActivationRadius; 4790 object.width = 32; 4791 object.height = 32; 4792 4793 FixedSizeArray<BaseObject> staticData = getStaticData(type); 4794 if (staticData == null) { 4795 final int staticObjectCount = 2; 4796 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4797 4798 final int red_frames[] = { 4799 R.drawable.object_button_red, 4800 R.drawable.object_button_pressed_red, 4801 }; 4802 4803 final int blue_frames[] = { 4804 R.drawable.object_button_blue, 4805 R.drawable.object_button_pressed_blue, 4806 }; 4807 4808 final int green_frames[] = { 4809 R.drawable.object_button_green, 4810 R.drawable.object_button_pressed_green, 4811 }; 4812 4813 int frames[] = red_frames; 4814 4815 if (type == GameObjectType.BUTTON_GREEN) { 4816 frames = green_frames; 4817 } else if (type == GameObjectType.BUTTON_BLUE) { 4818 frames = blue_frames; 4819 } 4820 4821 FixedSizeArray<CollisionVolume> vulnerabilityVolume = 4822 new FixedSizeArray<CollisionVolume>(1); 4823 vulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 32, 16)); 4824 vulnerabilityVolume.get(0).setHitType(HitType.DEPRESS); 4825 4826 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]), 4827 Utils.framesToTime(24, 1), null, vulnerabilityVolume); 4828 AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]), 4829 Utils.framesToTime(24, 1), null, vulnerabilityVolume); 4830 4831 SpriteAnimation idle = new SpriteAnimation(ButtonAnimationComponent.Animation.UP, 1); 4832 idle.addFrame(frame1); 4833 4834 SpriteAnimation pressed = new SpriteAnimation(ButtonAnimationComponent.Animation.DOWN, 1); 4835 pressed.addFrame(frame2); 4836 4837 staticData.add(idle); 4838 staticData.add(pressed); 4839 4840 setStaticData(type, staticData); 4841 } 4842 4843 4844 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4845 render.setPriority(SortConstants.GENERAL_OBJECT); 4846 4847 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4848 sprite.setSize((int)object.width, (int)object.height); 4849 sprite.setRenderComponent(render); 4850 4851 ButtonAnimationComponent button = (ButtonAnimationComponent)allocateComponent(ButtonAnimationComponent.class); 4852 button.setSprite(sprite); 4853 4854 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 4855 if (sound != null) { 4856 button.setDepressSound(sound.load(R.raw.sound_button)); 4857 } 4858 4859 ChannelSystem.Channel buttonChannel = null; 4860 ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem; 4861 switch (type) { 4862 case BUTTON_RED: 4863 buttonChannel = channelSystem.registerChannel(sRedButtonChannel); 4864 break; 4865 case BUTTON_BLUE: 4866 buttonChannel = channelSystem.registerChannel(sBlueButtonChannel); 4867 break; 4868 case BUTTON_GREEN: 4869 buttonChannel = channelSystem.registerChannel(sGreenButtonChannel); 4870 break; 4871 } 4872 button.setChannel(buttonChannel); 4873 4874 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4875 sprite.setCollisionComponent(dynamicCollision); 4876 4877 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4878 hitReact.setInvincible(false); 4879 4880 4881 4882 dynamicCollision.setHitReactionComponent(hitReact); 4883 4884 object.team = Team.NONE; 4885 4886 object.add(render); 4887 object.add(sprite); 4888 object.add(button); 4889 object.add(dynamicCollision); 4890 object.add(hitReact); 4891 4892 addStaticData(type, object, sprite); 4893 4894 sprite.playAnimation(0); 4895 4896 return object; 4897 } 4898 4899 public GameObject spawnObjectCannon(float positionX, float positionY) { 4900 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4901 4902 GameObject object = mGameObjectPool.allocate(); 4903 object.getPosition().set(positionX, positionY); 4904 object.activationRadius = mTightActivationRadius; 4905 object.width = 64; 4906 object.height = 128; 4907 4908 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON); 4909 if (staticData == null) { 4910 final int staticObjectCount = 2; 4911 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 4912 4913 FixedSizeArray<CollisionVolume> attackVolume = 4914 new FixedSizeArray<CollisionVolume>(1); 4915 attackVolume.add(new AABoxCollisionVolume(16, 16, 32, 80)); 4916 attackVolume.get(0).setHitType(HitType.LAUNCH); 4917 4918 AnimationFrame frame1 = new AnimationFrame( 4919 textureLibrary.allocateTexture(R.drawable.object_cannon), 4920 1.0f, attackVolume, null); 4921 4922 SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 1); 4923 idle.addFrame(frame1); 4924 4925 AnimationFrame frame1NoAttack = new AnimationFrame( 4926 textureLibrary.allocateTexture(R.drawable.object_cannon), 4927 1.0f, null, null); 4928 4929 SpriteAnimation shoot = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1); 4930 shoot.addFrame(frame1NoAttack); 4931 4932 staticData.add(idle); 4933 staticData.add(shoot); 4934 4935 setStaticData(GameObjectType.CANNON, staticData); 4936 } 4937 4938 4939 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 4940 render.setPriority(SortConstants.FOREGROUND_OBJECT); 4941 4942 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 4943 sprite.setSize((int)object.width, (int)object.height); 4944 sprite.setRenderComponent(render); 4945 4946 LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class); 4947 launcher.setLaunchEffect(GameObjectType.SMOKE_POOF, 32.0f, 85.0f); 4948 4949 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 4950 if (sound != null) { 4951 launcher.setLaunchSound(sound.load(R.raw.sound_cannon)); 4952 } 4953 4954 4955 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 4956 sprite.setCollisionComponent(dynamicCollision); 4957 4958 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 4959 hitReact.setInvincible(false); 4960 hitReact.setLauncherComponent(launcher, HitType.LAUNCH); 4961 4962 dynamicCollision.setHitReactionComponent(hitReact); 4963 4964 GenericAnimationComponent anim = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class); 4965 anim.setSprite(sprite); 4966 4967 object.team = Team.NONE; 4968 4969 object.add(render); 4970 object.add(sprite); 4971 object.add(dynamicCollision); 4972 object.add(hitReact); 4973 object.add(launcher); 4974 object.add(anim); 4975 4976 addStaticData(GameObjectType.CANNON, object, sprite); 4977 4978 sprite.playAnimation(0); 4979 4980 return object; 4981 } 4982 4983 public GameObject spawnObjectBrobotSpawner(float positionX, float positionY, boolean flipHorizontal) { 4984 4985 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 4986 4987 // This is pretty heavy-handed. 4988 // TODO: figure out a general solution for objects that depend on other objects. 4989 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01); 4990 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02); 4991 textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03); 4992 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01); 4993 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02); 4994 textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03); 4995 4996 GameObject object = mGameObjectPool.allocate(); 4997 object.getPosition().set(positionX, positionY); 4998 object.activationRadius = mTightActivationRadius; 4999 object.width = 64; 5000 object.height = 64; 5001 5002 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_SPAWNER); 5003 if (staticData == null) { 5004 final int staticObjectCount = 2; 5005 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5006 5007 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 5008 new FixedSizeArray<CollisionVolume>(1); 5009 basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32)); 5010 basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS); 5011 5012 SpriteAnimation idle = new SpriteAnimation(0, 1); 5013 idle.addFrame(new AnimationFrame( 5014 textureLibrary.allocateTexture(R.drawable.object_brobot_machine), 5015 1.0f, null, basicVulnerabilityVolume)); 5016 5017 SolidSurfaceComponent solidSurface 5018 = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 5019 solidSurface.inititalize(3); 5020 /* 5021 0:2,0:8,59:-0.99532399996093,0.09659262446878 5022 0:8,59:61,33:0.44551558813576,0.89527418187282 5023 0:61,33:61,-1:1,0 5024 5025 */ 5026 // trapezoid shape: 5027 // |\ |\2 5028 // | | 1| |3 5029 5030 Vector2 surface1Start = new Vector2(0, 0); 5031 Vector2 surface1End = new Vector2(8.0f, 59.0f); 5032 Vector2 surface1Normal = new Vector2(-0.9953f, 0.0965f); 5033 surface1Normal.normalize(); 5034 5035 Vector2 surface2Start = new Vector2(8.0f, 59.0f); 5036 Vector2 surface2End = new Vector2(61.0f, 33.0f); 5037 Vector2 surface2Normal = new Vector2(0.445515f, 0.89527f); 5038 surface2Normal.normalize(); 5039 5040 Vector2 surface3Start = new Vector2(61.0f, 33.0f); 5041 Vector2 surface3End = new Vector2(61.0f, 0.0f); 5042 Vector2 surface3Normal = new Vector2(1.0f, 0.0f); 5043 5044 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 5045 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 5046 solidSurface.addSurface(surface3Start, surface3End, surface3Normal); 5047 5048 staticData.add(solidSurface); 5049 staticData.add(idle); 5050 5051 5052 setStaticData(GameObjectType.BROBOT_SPAWNER, staticData); 5053 } 5054 5055 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5056 render.setPriority(SortConstants.GENERAL_OBJECT); 5057 5058 5059 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5060 sprite.setSize((int)object.width, (int)object.height); 5061 sprite.setRenderComponent(render); 5062 5063 DynamicCollisionComponent collision 5064 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5065 sprite.setCollisionComponent(collision); 5066 5067 HitReactionComponent hitReact 5068 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5069 collision.setHitReactionComponent(hitReact); 5070 5071 LaunchProjectileComponent gun 5072 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 5073 gun.setDelayBeforeFirstSet(3.0f); 5074 gun.setObjectTypeToSpawn(GameObjectType.BROBOT); 5075 gun.setOffsetX(36); 5076 gun.setOffsetY(50); 5077 gun.setVelocityX(100.0f); 5078 gun.setVelocityY(300.0f); 5079 gun.enableProjectileTracking(1); 5080 5081 5082 object.team = Team.ENEMY; 5083 5084 if (flipHorizontal) { 5085 object.facingDirection.x = -1.0f; 5086 } else { 5087 object.facingDirection.x = 1.0f; 5088 } 5089 5090 object.add(render); 5091 object.add(sprite); 5092 object.add(gun); 5093 object.add(collision); 5094 object.add(hitReact); 5095 5096 5097 addStaticData(GameObjectType.BROBOT_SPAWNER, object, sprite); 5098 5099 object.commitUpdates(); 5100 5101 5102 sprite.playAnimation(0); 5103 5104 return object; 5105 } 5106 5107 public GameObject spawnObjectInfiniteSpawner(float positionX, float positionY) { 5108 GameObject object = spawnObjectBrobotSpawner(positionX, positionY, false); 5109 object.facingDirection.y = -1; //vertical flip 5110 LaunchProjectileComponent gun = object.findByClass(LaunchProjectileComponent.class); 5111 if (gun != null) { 5112 gun.disableProjectileTracking(); 5113 gun.setDelayBetweenShots(0.15f); 5114 gun.setSetsPerActivation(1); 5115 gun.setShotsPerSet(60); 5116 } 5117 5118 return object; 5119 } 5120 5121 public GameObject spawnObjectCrusherAndou(float positionX, float positionY) { 5122 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 5123 5124 GameObject object = mGameObjectPool.allocate(); 5125 object.getPosition().set(positionX, positionY); 5126 object.activationRadius = mAlwaysActive; 5127 object.width = 64; 5128 object.height = 64; 5129 5130 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CRUSHER_ANDOU); 5131 5132 if (staticData == null) { 5133 final int staticObjectCount = 5; 5134 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5135 5136 GameComponent gravity = allocateComponent(GravityComponent.class); 5137 GameComponent movement = allocateComponent(MovementComponent.class); 5138 PhysicsComponent physics = (PhysicsComponent)allocateComponent(PhysicsComponent.class); 5139 5140 physics.setMass(9.1f); // ~90kg w/ earth gravity 5141 physics.setDynamicFrictionCoeffecient(0.2f); 5142 physics.setStaticFrictionCoeffecient(0.01f); 5143 5144 // Animation Data 5145 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 5146 new FixedSizeArray<CollisionVolume>(1); 5147 basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32)); 5148 5149 SpriteAnimation idle = new SpriteAnimation(Animation.IDLE, 1); 5150 idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stand), 5151 1.0f, null, basicVulnerabilityVolume)); 5152 5153 5154 FixedSizeArray<CollisionVolume> stompAttackVolume = 5155 new FixedSizeArray<CollisionVolume>(1); 5156 stompAttackVolume.add(new AABoxCollisionVolume(16, -5.0f, 32, 37, HitType.HIT)); 5157 5158 5159 SpriteAnimation stomp = new SpriteAnimation(Animation.ATTACK, 4); 5160 stomp.addFrame( 5161 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp01), 5162 Utils.framesToTime(24, 1), stompAttackVolume, null)); 5163 stomp.addFrame( 5164 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp02), 5165 Utils.framesToTime(24, 1), stompAttackVolume, null)); 5166 stomp.addFrame( 5167 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp03), 5168 Utils.framesToTime(24, 1), stompAttackVolume, null)); 5169 stomp.addFrame( 5170 new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp04), 5171 Utils.framesToTime(24, 1), stompAttackVolume, null)); 5172 5173 5174 5175 // Save static data 5176 staticData.add(gravity); 5177 staticData.add(movement); 5178 staticData.add(physics); 5179 5180 5181 staticData.add(idle); 5182 staticData.add(stomp); 5183 5184 5185 setStaticData(GameObjectType.CRUSHER_ANDOU, staticData); 5186 } 5187 5188 5189 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5190 render.setPriority(SortConstants.PLAYER); 5191 BackgroundCollisionComponent bgcollision 5192 = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 5193 bgcollision.setSize(32, 48); 5194 bgcollision.setOffset(16, 0); 5195 5196 GenericAnimationComponent animation = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class); 5197 5198 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5199 sprite.setSize((int)object.width, (int)object.height); 5200 sprite.setRenderComponent(render); 5201 animation.setSprite(sprite); 5202 5203 5204 DynamicCollisionComponent dynamicCollision 5205 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5206 sprite.setCollisionComponent(dynamicCollision); 5207 5208 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5209 hitReact.setBounceOnHit(true); 5210 hitReact.setPauseOnAttack(true); 5211 hitReact.setInvincibleTime(3.0f); 5212 hitReact.setSpawnOnDealHit(HitType.HIT, GameObjectType.CRUSH_FLASH, false, true); 5213 5214 5215 dynamicCollision.setHitReactionComponent(hitReact); 5216 5217 5218 5219 object.life = 1; 5220 object.team = Team.PLAYER; 5221 5222 object.add(animation); 5223 object.add(bgcollision); 5224 object.add(render); 5225 object.add(sprite); 5226 object.add(dynamicCollision); 5227 object.add(hitReact); 5228 5229 addStaticData(GameObjectType.CRUSHER_ANDOU, object, sprite); 5230 5231 sprite.playAnimation(Animation.IDLE); 5232 5233 object.commitUpdates(); 5234 5235 ChangeComponentsComponent swap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 5236 5237 final int count = object.getCount(); 5238 for (int x = 0; x < count; x++) { 5239 swap.addSwapInComponent((GameComponent)object.get(x)); 5240 } 5241 5242 object.removeAll(); 5243 5244 CrusherAndouComponent crusher = (CrusherAndouComponent)allocateComponent(CrusherAndouComponent.class); 5245 5246 crusher.setSwap(swap); 5247 5248 object.add(swap); 5249 object.add(crusher); 5250 5251 object.commitUpdates(); 5252 5253 return object; 5254 } 5255 5256 public GameObject spawnObjectBreakableBlock(float positionX, float positionY) { 5257 5258 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 5259 5260 // Preload block piece texture. 5261 textureLibrary.allocateTexture(R.drawable.object_debris_piece); 5262 5263 GameObject object = mGameObjectPool.allocate(); 5264 object.getPosition().set(positionX, positionY); 5265 object.activationRadius = mTightActivationRadius; 5266 object.width = 32; 5267 object.height = 32; 5268 5269 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK); 5270 if (staticData == null) { 5271 final int staticObjectCount = 2; 5272 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5273 5274 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 5275 new FixedSizeArray<CollisionVolume>(1); 5276 basicVulnerabilityVolume.add(new AABoxCollisionVolume(7, 0, 32 - 7, 42, HitType.HIT)); 5277 5278 SpriteAnimation idle = new SpriteAnimation(0, 1); 5279 idle.addFrame(new AnimationFrame( 5280 textureLibrary.allocateTexture(R.drawable.object_debris_block), 5281 1.0f, null, basicVulnerabilityVolume)); 5282 5283 SolidSurfaceComponent solidSurface 5284 = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class); 5285 solidSurface.inititalize(4); 5286 5287 // box shape: 5288 // ___ ___2 5289 // | | 1| |3 5290 // --- ---4 5291 5292 Vector2 surface1Start = new Vector2(0.0f, 0.0f); 5293 Vector2 surface1End = new Vector2(0.0f, 32.0f); 5294 Vector2 surface1Normal = new Vector2(-1.0f, 0.0f); 5295 surface1Normal.normalize(); 5296 5297 Vector2 surface2Start = new Vector2(0.0f, 32.0f); 5298 Vector2 surface2End = new Vector2(32.0f, 32.0f); 5299 Vector2 surface2Normal = new Vector2(0.0f, 1.0f); 5300 surface2Normal.normalize(); 5301 5302 Vector2 surface3Start = new Vector2(32.0f, 32.0f); 5303 Vector2 surface3End = new Vector2(32.0f, 0.0f); 5304 Vector2 surface3Normal = new Vector2(1.0f, 0.0f); 5305 5306 Vector2 surface4Start = new Vector2(32.0f, 0.0f); 5307 Vector2 surface4End = new Vector2(0.0f, 0.0f); 5308 Vector2 surface4Normal = new Vector2(0.0f, -1.0f); 5309 5310 solidSurface.addSurface(surface1Start, surface1End, surface1Normal); 5311 solidSurface.addSurface(surface2Start, surface2End, surface2Normal); 5312 solidSurface.addSurface(surface3Start, surface3End, surface3Normal); 5313 solidSurface.addSurface(surface4Start, surface4End, surface4Normal); 5314 5315 staticData.add(solidSurface); 5316 staticData.add(idle); 5317 5318 5319 setStaticData(GameObjectType.BREAKABLE_BLOCK, staticData); 5320 } 5321 5322 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5323 render.setPriority(SortConstants.GENERAL_OBJECT); 5324 5325 5326 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5327 sprite.setSize((int)object.width, (int)object.height); 5328 sprite.setRenderComponent(render); 5329 5330 DynamicCollisionComponent collision 5331 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5332 sprite.setCollisionComponent(collision); 5333 5334 HitReactionComponent hitReact 5335 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5336 collision.setHitReactionComponent(hitReact); 5337 5338 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 5339 lifetime.setObjectToSpawnOnDeath(GameObjectType.BREAKABLE_BLOCK_PIECE_SPAWNER); 5340 SoundSystem sound = BaseObject.sSystemRegistry.soundSystem; 5341 if (sound != null) { 5342 lifetime.setDeathSound(sound.load(R.raw.sound_break_block)); 5343 } 5344 5345 object.life = 1; 5346 object.team = Team.ENEMY; 5347 5348 object.add(render); 5349 object.add(sprite); 5350 object.add(collision); 5351 object.add(hitReact); 5352 object.add(lifetime); 5353 5354 5355 addStaticData(GameObjectType.BREAKABLE_BLOCK, object, sprite); 5356 5357 sprite.playAnimation(0); 5358 5359 return object; 5360 } 5361 5362 public GameObject spawnObjectTheSource(float positionX, float positionY) { 5363 5364 final TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 5365 5366 GameObject object = mGameObjectPool.allocate(); 5367 object.activationRadius = mAlwaysActive; 5368 object.width = 512; 5369 object.height = 512; 5370 object.getPosition().set(positionX, positionY); 5371 5372 RenderComponent layer1Render = (RenderComponent)allocateComponent(RenderComponent.class); 5373 layer1Render.setPriority(SortConstants.THE_SOURCE_START); 5374 FadeDrawableComponent layer1Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 5375 layer1Fade.setRenderComponent(layer1Render); 5376 layer1Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spikes)); 5377 layer1Fade.setupFade(1.0f, 0.2f, 1.9f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f); 5378 5379 RenderComponent layer2Render = (RenderComponent)allocateComponent(RenderComponent.class); 5380 layer2Render.setPriority(SortConstants.THE_SOURCE_START + 1); 5381 FadeDrawableComponent layer2Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 5382 layer2Fade.setRenderComponent(layer2Render); 5383 layer2Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_body)); 5384 layer2Fade.setupFade(1.0f, 0.8f, 5.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f); 5385 5386 RenderComponent layer3Render = (RenderComponent)allocateComponent(RenderComponent.class); 5387 layer3Render.setPriority(SortConstants.THE_SOURCE_START + 2); 5388 FadeDrawableComponent layer3Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 5389 layer3Fade.setRenderComponent(layer3Render); 5390 layer3Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_black)); 5391 layer3Fade.setupFade(0.0f, 1.0f, 6.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_LINEAR, 0.0f); 5392 5393 RenderComponent layer4Render = (RenderComponent)allocateComponent(RenderComponent.class); 5394 layer4Render.setPriority(SortConstants.THE_SOURCE_START + 3); 5395 FadeDrawableComponent layer4Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 5396 layer4Fade.setRenderComponent(layer4Render); 5397 layer4Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spots)); 5398 layer4Fade.setupFade(0.0f, 1.0f, 2.3f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f); 5399 5400 RenderComponent layer5Render = (RenderComponent)allocateComponent(RenderComponent.class); 5401 layer5Render.setPriority(SortConstants.THE_SOURCE_START + 4); 5402 FadeDrawableComponent layer5Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 5403 layer5Fade.setRenderComponent(layer5Render); 5404 layer5Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_core)); 5405 layer5Fade.setupFade(0.2f, 1.0f, 1.2f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f); 5406 5407 5408 OrbitalMagnetComponent orbit = (OrbitalMagnetComponent)allocateComponent(OrbitalMagnetComponent.class); 5409 orbit.setup(320.0f, 220.0f); 5410 5411 DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5412 FixedSizeArray<CollisionVolume> vulnerabilityVolume = 5413 new FixedSizeArray<CollisionVolume>(1); 5414 vulnerabilityVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT)); 5415 FixedSizeArray<CollisionVolume> attackVolume = 5416 new FixedSizeArray<CollisionVolume>(1); 5417 attackVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT)); 5418 collision.setCollisionVolumes(attackVolume, vulnerabilityVolume); 5419 5420 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5421 collision.setHitReactionComponent(hitReact); 5422 hitReact.setInvincibleTime(TheSourceComponent.SHAKE_TIME); 5423 5424 TheSourceComponent theSource = (TheSourceComponent)allocateComponent(TheSourceComponent.class); 5425 ChannelSystem.Channel surpriseChannel = null; 5426 ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem; 5427 surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel); 5428 theSource.setChannel(surpriseChannel); 5429 theSource.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.WANDA_ENDING); 5430 5431 5432 object.life = 3; 5433 object.team = Team.PLAYER; 5434 5435 object.add(layer1Render); 5436 object.add(layer2Render); 5437 object.add(layer3Render); 5438 object.add(layer4Render); 5439 object.add(layer5Render); 5440 5441 object.add(layer1Fade); 5442 object.add(layer2Fade); 5443 object.add(layer3Fade); 5444 object.add(layer4Fade); 5445 object.add(layer5Fade); 5446 5447 object.add(orbit); 5448 object.add(collision); 5449 object.add(hitReact); 5450 object.add(theSource); 5451 5452 return object; 5453 } 5454 5455 public GameObject spawnObjectSign(float positionX, float positionY) { 5456 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 5457 5458 GameObject object = mGameObjectPool.allocate(); 5459 object.getPosition().set(positionX, positionY); 5460 object.activationRadius = mTightActivationRadius; 5461 object.width = 32; 5462 object.height = 32; 5463 5464 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.HINT_SIGN); 5465 if (staticData == null) { 5466 final int staticObjectCount = 1; 5467 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5468 5469 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 5470 new FixedSizeArray<CollisionVolume>(1); 5471 basicVulnerabilityVolume.add(new AABoxCollisionVolume(8, 0, 24, 32, HitType.COLLECT)); 5472 5473 SpriteAnimation idle = new SpriteAnimation(0, 1); 5474 AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_sign), 5475 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume); 5476 5477 idle.addFrame(frame1); 5478 5479 idle.setLoop(true); 5480 5481 staticData.add(idle); 5482 5483 setStaticData(GameObjectType.HINT_SIGN, staticData); 5484 } 5485 5486 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5487 render.setPriority(SortConstants.GENERAL_OBJECT); 5488 5489 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5490 sprite.setSize((int)object.width, (int)object.height); 5491 sprite.setRenderComponent(render); 5492 5493 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5494 sprite.setCollisionComponent(dynamicCollision); 5495 5496 HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5497 dynamicCollision.setHitReactionComponent(hitReact); 5498 hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0); 5499 5500 SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class); 5501 dialogSelect.setHitReact(hitReact); 5502 5503 object.add(dialogSelect); 5504 object.add(render); 5505 object.add(sprite); 5506 object.add(dynamicCollision); 5507 object.add(hitReact); 5508 5509 addStaticData(GameObjectType.HINT_SIGN, object, sprite); 5510 sprite.playAnimation(0); 5511 5512 return object; 5513 } 5514 5515 public GameObject spawnObjectTurret(float positionX, float positionY, boolean flipHorizontal) { 5516 5517 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 5518 5519 // Make sure related textures are loaded. 5520 textureLibrary.allocateTexture(R.drawable.effect_bullet01); 5521 textureLibrary.allocateTexture(R.drawable.effect_bullet02); 5522 5523 5524 GameObject object = mGameObjectPool.allocate(); 5525 object.getPosition().set(positionX, positionY); 5526 object.activationRadius = mTightActivationRadius; 5527 object.width = 64; 5528 object.height = 64; 5529 5530 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET); 5531 if (staticData == null) { 5532 final int staticObjectCount = 3; 5533 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5534 5535 // Animations 5536 FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = 5537 new FixedSizeArray<CollisionVolume>(1); 5538 basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32)); 5539 basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS); 5540 5541 SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2); 5542 idle.addFrame(new AnimationFrame( 5543 textureLibrary.allocateTexture(R.drawable.object_gunturret01), 5544 1.0f, null, basicVulnerabilityVolume)); 5545 idle.addFrame(new AnimationFrame( 5546 textureLibrary.allocateTexture(R.drawable.object_gunturret_idle), 5547 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 5548 idle.setLoop(true); 5549 5550 SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 4); 5551 attack.addFrame(new AnimationFrame( 5552 textureLibrary.allocateTexture(R.drawable.object_gunturret02), 5553 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 5554 attack.addFrame(new AnimationFrame( 5555 textureLibrary.allocateTexture(R.drawable.object_gunturret01), 5556 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 5557 attack.addFrame(new AnimationFrame( 5558 textureLibrary.allocateTexture(R.drawable.object_gunturret03), 5559 Utils.framesToTime(24, 2), null, basicVulnerabilityVolume)); 5560 attack.addFrame(new AnimationFrame( 5561 textureLibrary.allocateTexture(R.drawable.object_gunturret01), 5562 Utils.framesToTime(24, 1), null, basicVulnerabilityVolume)); 5563 attack.setLoop(true); 5564 5565 GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class); 5566 ghost.setTargetAction(ActionType.IDLE); 5567 ghost.changeActionOnButton(ActionType.ATTACK); 5568 5569 staticData.add(idle); 5570 staticData.add(attack); 5571 staticData.add(ghost); 5572 5573 5574 setStaticData(GameObjectType.TURRET, staticData); 5575 } 5576 5577 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5578 render.setPriority(SortConstants.GENERAL_OBJECT); 5579 5580 5581 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5582 sprite.setSize((int)object.width, (int)object.height); 5583 sprite.setRenderComponent(render); 5584 5585 GenericAnimationComponent animation 5586 = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class); 5587 animation.setSprite(sprite); 5588 5589 AttackAtDistanceComponent attack = (AttackAtDistanceComponent) 5590 allocateComponent(AttackAtDistanceComponent.class); 5591 attack.setupAttack(300, 0.0f, 1.0f, true); 5592 5593 5594 DynamicCollisionComponent collision 5595 = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5596 sprite.setCollisionComponent(collision); 5597 5598 HitReactionComponent hitReact 5599 = (HitReactionComponent)allocateComponent(HitReactionComponent.class); 5600 collision.setHitReactionComponent(hitReact); 5601 5602 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 5603 lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_LARGE); 5604 5605 SoundSystem sound = sSystemRegistry.soundSystem; 5606 5607 LaunchProjectileComponent gun 5608 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 5609 gun.setShotsPerSet(1); 5610 gun.setDelayBetweenShots(0.0f); 5611 gun.setDelayBetweenSets(0.3f); 5612 gun.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET); 5613 gun.setOffsetX(54); 5614 gun.setOffsetY(13); 5615 gun.setRequiredAction(GameObject.ActionType.ATTACK); 5616 gun.setVelocityX(300.0f); 5617 gun.setVelocityY(-300.0f); 5618 gun.setShootSound(sound.load(R.raw.sound_gun)); 5619 5620 // Components for possession 5621 5622 ChangeComponentsComponent componentSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class); 5623 componentSwap.addSwapOutComponent(attack); 5624 componentSwap.setPingPongBehavior(true); 5625 5626 hitReact.setPossessionComponent(componentSwap); 5627 5628 object.team = Team.ENEMY; 5629 5630 if (flipHorizontal) { 5631 object.facingDirection.x = -1.0f; 5632 } else { 5633 object.facingDirection.x = 1.0f; 5634 } 5635 5636 object.add(render); 5637 object.add(sprite); 5638 object.add(animation); 5639 object.add(attack); 5640 object.add(collision); 5641 object.add(hitReact); 5642 object.add(lifetime); 5643 object.add(gun); 5644 object.add(componentSwap); 5645 5646 addStaticData(GameObjectType.TURRET, object, sprite); 5647 5648 object.commitUpdates(); 5649 5650 GhostComponent possessedGhost = object.findByClass(GhostComponent.class); 5651 if (possessedGhost != null) { 5652 object.remove(possessedGhost); // Not supposed to be added yet. 5653 componentSwap.addSwapInComponent(possessedGhost); 5654 } 5655 5656 sprite.playAnimation(0); 5657 5658 return object; 5659 } 5660 5661 public GameObject spawnDust(float positionX, float positionY, boolean flipHorizontal) { 5662 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 5663 5664 GameObject object = mGameObjectPool.allocate(); 5665 object.getPosition().set(positionX, positionY); 5666 object.activationRadius = mTightActivationRadius; 5667 object.width = 32; 5668 object.height = 32; 5669 5670 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DUST); 5671 if (staticData == null) { 5672 final int staticObjectCount = 1; 5673 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5674 5675 SpriteAnimation idle = new SpriteAnimation(0, 5); 5676 idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust01), 5677 Utils.framesToTime(24, 1))); 5678 idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust02), 5679 Utils.framesToTime(24, 1))); 5680 idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust03), 5681 Utils.framesToTime(24, 1))); 5682 idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust04), 5683 Utils.framesToTime(24, 1))); 5684 idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust05), 5685 Utils.framesToTime(24, 1))); 5686 5687 staticData.add(idle); 5688 setStaticData(GameObjectType.DUST, staticData); 5689 } 5690 5691 5692 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5693 render.setPriority(SortConstants.EFFECT); 5694 5695 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 5696 lifetime.setTimeUntilDeath(0.30f); 5697 5698 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5699 sprite.setSize((int)object.width, (int)object.height); 5700 sprite.setRenderComponent(render); 5701 5702 5703 if (flipHorizontal) { 5704 object.facingDirection.x = -1.0f; 5705 } 5706 object.destroyOnDeactivation = true; 5707 5708 object.add(lifetime); 5709 object.add(render); 5710 object.add(sprite); 5711 5712 addStaticData(GameObjectType.DUST, object, sprite); 5713 5714 sprite.playAnimation(0); 5715 5716 return object; 5717 } 5718 5719 public GameObject spawnEffectExplosionSmall(float positionX, float positionY) { 5720 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 5721 5722 GameObject object = mGameObjectPool.allocate(); 5723 object.getPosition().set(positionX, positionY); 5724 object.activationRadius = mAlwaysActive; 5725 object.width = 32; 5726 object.height = 32; 5727 5728 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_SMALL); 5729 if (staticData == null) { 5730 final int staticObjectCount = 1; 5731 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5732 5733 FixedSizeArray<CollisionVolume> basicAttackVolume = 5734 new FixedSizeArray<CollisionVolume>(1); 5735 basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT)); 5736 5737 SpriteAnimation idle = new SpriteAnimation(0, 7); 5738 idle.addFrame(new AnimationFrame( 5739 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01), 5740 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5741 idle.addFrame(new AnimationFrame( 5742 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02), 5743 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5744 idle.addFrame(new AnimationFrame( 5745 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03), 5746 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5747 idle.addFrame(new AnimationFrame( 5748 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04), 5749 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5750 idle.addFrame(new AnimationFrame( 5751 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05), 5752 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5753 idle.addFrame(new AnimationFrame( 5754 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06), 5755 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5756 idle.addFrame(new AnimationFrame( 5757 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07), 5758 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5759 5760 staticData.add(idle); 5761 setStaticData(GameObjectType.EXPLOSION_SMALL, staticData); 5762 } 5763 5764 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5765 render.setPriority(SortConstants.EFFECT); 5766 5767 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5768 sprite.setSize((int)object.width, (int)object.height); 5769 sprite.setRenderComponent(render); 5770 5771 5772 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 5773 5774 DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5775 sprite.setCollisionComponent(dynamicCollision); 5776 5777 object.add(dynamicCollision); 5778 object.add(lifetime); 5779 object.add(render); 5780 object.add(sprite); 5781 5782 addStaticData(GameObjectType.EXPLOSION_SMALL, object, sprite); 5783 5784 final SpriteAnimation idle = sprite.findAnimation(0); 5785 if (idle != null) { 5786 lifetime.setTimeUntilDeath(idle.getLength()); 5787 } 5788 5789 sprite.playAnimation(0); 5790 5791 return object; 5792 } 5793 5794 public GameObject spawnEffectExplosionLarge(float positionX, float positionY) { 5795 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 5796 5797 GameObject object = mGameObjectPool.allocate(); 5798 object.getPosition().set(positionX, positionY); 5799 object.activationRadius = mAlwaysActive; 5800 object.width = 64; 5801 object.height = 64; 5802 5803 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_LARGE); 5804 if (staticData == null) { 5805 final int staticObjectCount = 1; 5806 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5807 5808 FixedSizeArray<CollisionVolume> basicAttackVolume = 5809 new FixedSizeArray<CollisionVolume>(1); 5810 basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.HIT)); 5811 5812 SpriteAnimation idle = new SpriteAnimation(0, 9); 5813 idle.addFrame(new AnimationFrame( 5814 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01), 5815 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5816 idle.addFrame(new AnimationFrame( 5817 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02), 5818 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5819 idle.addFrame(new AnimationFrame( 5820 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03), 5821 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5822 idle.addFrame(new AnimationFrame( 5823 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04), 5824 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5825 idle.addFrame(new AnimationFrame( 5826 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05), 5827 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5828 idle.addFrame(new AnimationFrame( 5829 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06), 5830 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5831 idle.addFrame(new AnimationFrame( 5832 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07), 5833 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5834 idle.addFrame(new AnimationFrame( 5835 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08), 5836 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5837 idle.addFrame(new AnimationFrame( 5838 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09), 5839 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5840 5841 5842 staticData.add(idle); 5843 setStaticData(GameObjectType.EXPLOSION_LARGE, staticData); 5844 } 5845 5846 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5847 render.setPriority(SortConstants.EFFECT); 5848 5849 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5850 sprite.setSize((int)object.width, (int)object.height); 5851 sprite.setRenderComponent(render); 5852 5853 5854 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 5855 5856 DynamicCollisionComponent dynamicCollision = 5857 (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 5858 sprite.setCollisionComponent(dynamicCollision); 5859 5860 PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class); 5861 soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion)); 5862 5863 5864 object.add(soundEffect); 5865 object.add(dynamicCollision); 5866 object.add(lifetime); 5867 object.add(render); 5868 object.add(sprite); 5869 5870 addStaticData(GameObjectType.EXPLOSION_LARGE, object, sprite); 5871 5872 final SpriteAnimation idle = sprite.findAnimation(0); 5873 if (idle != null) { 5874 lifetime.setTimeUntilDeath(idle.getLength()); 5875 } 5876 5877 sprite.playAnimation(0); 5878 5879 return object; 5880 } 5881 5882 public GameObject spawnEffectExplosionGiant(float positionX, float positionY) { 5883 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 5884 5885 GameObject object = mGameObjectPool.allocate(); 5886 object.getPosition().set(positionX, positionY); 5887 object.activationRadius = mAlwaysActive; 5888 object.width = 64; 5889 object.height = 64; 5890 5891 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_GIANT); 5892 if (staticData == null) { 5893 final int staticObjectCount = 4; 5894 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 5895 5896 FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1); 5897 basicAttackVolume.add(new SphereCollisionVolume(64, 32, 32, HitType.HIT)); 5898 5899 SpriteAnimation idle = new SpriteAnimation(0, 9); 5900 idle.addFrame(new AnimationFrame( 5901 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01), 5902 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5903 idle.addFrame(new AnimationFrame( 5904 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02), 5905 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5906 idle.addFrame(new AnimationFrame( 5907 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03), 5908 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5909 idle.addFrame(new AnimationFrame( 5910 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04), 5911 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5912 idle.addFrame(new AnimationFrame( 5913 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05), 5914 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5915 idle.addFrame(new AnimationFrame( 5916 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06), 5917 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5918 idle.addFrame(new AnimationFrame( 5919 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07), 5920 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5921 idle.addFrame(new AnimationFrame( 5922 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08), 5923 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5924 idle.addFrame(new AnimationFrame( 5925 textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09), 5926 Utils.framesToTime(24, 1), basicAttackVolume, null)); 5927 5928 5929 AnimationFrame smallFrame1 = new AnimationFrame( 5930 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01), 5931 Utils.framesToTime(24, 1), null, null); 5932 AnimationFrame smallFrame2 = new AnimationFrame( 5933 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02), 5934 Utils.framesToTime(24, 1), null, null); 5935 AnimationFrame smallFrame3 = new AnimationFrame( 5936 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03), 5937 Utils.framesToTime(24, 1), null, null); 5938 AnimationFrame smallFrame4 = new AnimationFrame( 5939 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04), 5940 Utils.framesToTime(24, 1), null, null); 5941 AnimationFrame smallFrame5 = new AnimationFrame( 5942 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05), 5943 Utils.framesToTime(24, 1), null, null); 5944 AnimationFrame smallFrame6 = new AnimationFrame( 5945 textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06), 5946 Utils.framesToTime(24, 1), null, null); 5947 AnimationFrame smallFrame7 = new AnimationFrame 5948 (textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07), 5949 Utils.framesToTime(24, 1), null, null); 5950 5951 SpriteAnimation smallBlast1 = new SpriteAnimation(0, 7); 5952 smallBlast1.addFrame(smallFrame1); 5953 smallBlast1.addFrame(smallFrame2); 5954 smallBlast1.addFrame(smallFrame3); 5955 smallBlast1.addFrame(smallFrame4); 5956 smallBlast1.addFrame(smallFrame5); 5957 smallBlast1.addFrame(smallFrame6); 5958 smallBlast1.addFrame(smallFrame7); 5959 5960 SpriteAnimation smallBlast2 = new SpriteAnimation(0, 8); 5961 smallBlast2.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 4), null, null)); 5962 smallBlast2.addFrame(smallFrame1); 5963 smallBlast2.addFrame(smallFrame2); 5964 smallBlast2.addFrame(smallFrame3); 5965 smallBlast2.addFrame(smallFrame4); 5966 smallBlast2.addFrame(smallFrame5); 5967 smallBlast2.addFrame(smallFrame6); 5968 smallBlast2.addFrame(smallFrame7); 5969 5970 SpriteAnimation smallBlast3 = new SpriteAnimation(0, 8); 5971 smallBlast3.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 8), null, null)); 5972 smallBlast3.addFrame(smallFrame1); 5973 smallBlast3.addFrame(smallFrame2); 5974 smallBlast3.addFrame(smallFrame3); 5975 smallBlast3.addFrame(smallFrame4); 5976 smallBlast3.addFrame(smallFrame5); 5977 smallBlast3.addFrame(smallFrame6); 5978 smallBlast3.addFrame(smallFrame7); 5979 5980 5981 staticData.add(idle); 5982 staticData.add(smallBlast1); 5983 staticData.add(smallBlast2); 5984 staticData.add(smallBlast3); 5985 5986 setStaticData(GameObjectType.EXPLOSION_GIANT, staticData); 5987 } 5988 5989 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 5990 render.setPriority(SortConstants.EFFECT); 5991 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 5992 sprite.setSize((int)object.width, (int)object.height); 5993 sprite.setRenderComponent(render); 5994 5995 // Hack. Use static data differently for this object so we can share three animations 5996 // amongst three separate sprites. 5997 5998 final SpriteAnimation idle = (SpriteAnimation)staticData.get(0); 5999 final SpriteAnimation smallBlast1 = (SpriteAnimation)staticData.get(1); 6000 final SpriteAnimation smallBlast2 = (SpriteAnimation)staticData.get(2); 6001 final SpriteAnimation smallBlast3 = (SpriteAnimation)staticData.get(3); 6002 6003 sprite.addAnimation(idle); 6004 sprite.playAnimation(0); 6005 6006 RenderComponent blast1Render = (RenderComponent)allocateComponent(RenderComponent.class); 6007 render.setPriority(SortConstants.EFFECT); 6008 SpriteComponent blast1Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6009 blast1Sprite.setSize(32, 32); 6010 blast1Sprite.setRenderComponent(blast1Render); 6011 blast1Render.setDrawOffset(40, 50); 6012 blast1Sprite.addAnimation(smallBlast1); 6013 blast1Sprite.playAnimation(0); 6014 6015 RenderComponent blast2Render = (RenderComponent)allocateComponent(RenderComponent.class); 6016 render.setPriority(SortConstants.EFFECT); 6017 SpriteComponent blast2Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6018 blast2Sprite.setSize(32, 32); 6019 blast2Sprite.setRenderComponent(blast2Render); 6020 blast2Render.setDrawOffset(-10, 0); 6021 blast2Sprite.addAnimation(smallBlast2); 6022 blast2Sprite.playAnimation(0); 6023 6024 RenderComponent blast3Render = (RenderComponent)allocateComponent(RenderComponent.class); 6025 render.setPriority(SortConstants.EFFECT); 6026 SpriteComponent blast3Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6027 blast3Sprite.setSize(32, 32); 6028 blast3Sprite.setRenderComponent(blast3Render); 6029 blast3Render.setDrawOffset(0, 32); 6030 blast3Sprite.addAnimation(smallBlast3); 6031 blast3Sprite.playAnimation(0); 6032 6033 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6034 lifetime.setTimeUntilDeath(Math.max( 6035 Math.max( 6036 Math.max(idle.getLength(), smallBlast1.getLength()), 6037 smallBlast2.getLength()), 6038 smallBlast3.getLength())); 6039 6040 DynamicCollisionComponent dynamicCollision = 6041 (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class); 6042 sprite.setCollisionComponent(dynamicCollision); 6043 6044 PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class); 6045 soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion)); 6046 6047 6048 6049 object.team = Team.PLAYER; // Maybe this should be an argument to this function. 6050 6051 object.add(dynamicCollision); 6052 object.add(lifetime); 6053 object.add(render); 6054 object.add(sprite); 6055 object.add(soundEffect); 6056 6057 6058 object.add(blast1Render); 6059 object.add(blast1Sprite); 6060 6061 object.add(blast2Render); 6062 object.add(blast2Sprite); 6063 6064 object.add(blast3Render); 6065 object.add(blast3Sprite); 6066 6067 6068 return object; 6069 } 6070 6071 6072 public GameObject spawnGhostNPC(float positionX, float positionY) { 6073 6074 GameObject object = mGameObjectPool.allocate(); 6075 object.getPosition().set(positionX, positionY); 6076 object.activationRadius = mAlwaysActive; 6077 object.width = 32; 6078 object.height = 32; 6079 6080 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST_NPC); 6081 if (staticData == null) { 6082 final int staticObjectCount = 2; 6083 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6084 6085 GameComponent gravity = allocateComponent(GravityComponent.class); 6086 GameComponent movement = allocateComponent(MovementComponent.class); 6087 6088 staticData.add(gravity); 6089 staticData.add(movement); 6090 6091 6092 setStaticData(GameObjectType.GHOST_NPC, staticData); 6093 } 6094 6095 NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class); 6096 LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6097 6098 object.team = Team.NONE; 6099 object.life = 1; 6100 6101 object.add(patrol); 6102 object.add(life); 6103 6104 addStaticData(GameObjectType.GHOST_NPC, object, null); 6105 return object; 6106 } 6107 6108 private GameObject spawnCameraBias(float positionX, float positionY) { 6109 GameObject object = mGameObjectPool.allocate(); 6110 object.getPosition().set(positionX, positionY); 6111 object.activationRadius = mTightActivationRadius; 6112 object.width = 32; 6113 object.height = 32; 6114 6115 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CAMERA_BIAS); 6116 if (staticData == null) { 6117 final int staticObjectCount = 1; 6118 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6119 6120 GameComponent bias = allocateComponent(CameraBiasComponent.class); 6121 6122 staticData.add(bias); 6123 6124 setStaticData(GameObjectType.CAMERA_BIAS, staticData); 6125 } 6126 6127 addStaticData(GameObjectType.CAMERA_BIAS, object, null); 6128 return object; 6129 } 6130 6131 public GameObject spawnEffectSmokeBig(float positionX, float positionY) { 6132 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 6133 6134 GameObject object = null; 6135 // This is just an effect, so we can live without it if our pools are exhausted. 6136 if (componentAvailable(RenderComponent.class, 1)) { 6137 object = mGameObjectPool.allocate(); 6138 6139 object.getPosition().set(positionX, positionY); 6140 object.activationRadius = mTightActivationRadius; 6141 object.width = 32; 6142 object.height = 32; 6143 6144 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_BIG); 6145 if (staticData == null) { 6146 final int staticObjectCount = 6; 6147 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6148 6149 GameComponent movement = allocateComponent(MovementComponent.class); 6150 6151 6152 AnimationFrame frame2 = new AnimationFrame( 6153 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big02), 6154 Utils.framesToTime(24, 1), null, null); 6155 6156 AnimationFrame frame3 = new AnimationFrame( 6157 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big03), 6158 Utils.framesToTime(24, 1), null, null); 6159 6160 AnimationFrame frame4 = new AnimationFrame( 6161 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big04), 6162 Utils.framesToTime(24, 1), null, null); 6163 6164 AnimationFrame frame5 = new AnimationFrame( 6165 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big05), 6166 Utils.framesToTime(24, 1), null, null); 6167 6168 SpriteAnimation idle = new SpriteAnimation(0, 5); 6169 idle.addFrame(new AnimationFrame( 6170 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01), 6171 Utils.framesToTime(24, 10), null, null)); 6172 idle.addFrame(frame2); 6173 idle.addFrame(frame3); 6174 idle.addFrame(frame4); 6175 idle.addFrame(frame5); 6176 6177 SpriteAnimation idle2 = new SpriteAnimation(1, 5); 6178 idle2.addFrame(new AnimationFrame( 6179 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01), 6180 Utils.framesToTime(24, 13), null, null)); 6181 idle2.addFrame(frame2); 6182 idle2.addFrame(frame3); 6183 idle2.addFrame(frame4); 6184 idle2.addFrame(frame5); 6185 6186 SpriteAnimation idle3 = new SpriteAnimation(2, 5); 6187 idle3.addFrame(new AnimationFrame( 6188 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01), 6189 Utils.framesToTime(24, 8), null, null)); 6190 idle3.addFrame(frame2); 6191 idle3.addFrame(frame3); 6192 idle3.addFrame(frame4); 6193 idle3.addFrame(frame5); 6194 6195 SpriteAnimation idle4 = new SpriteAnimation(3, 5); 6196 idle4.addFrame(new AnimationFrame( 6197 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01), 6198 Utils.framesToTime(24, 5), null, null)); 6199 idle4.addFrame(frame2); 6200 idle4.addFrame(frame3); 6201 idle4.addFrame(frame4); 6202 idle4.addFrame(frame5); 6203 6204 SpriteAnimation idle5 = new SpriteAnimation(4, 5); 6205 idle5.addFrame(new AnimationFrame( 6206 textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01), 6207 Utils.framesToTime(24, 15), null, null)); 6208 idle5.addFrame(frame2); 6209 idle5.addFrame(frame3); 6210 idle5.addFrame(frame4); 6211 idle5.addFrame(frame5); 6212 6213 staticData.add(idle); 6214 staticData.add(idle2); 6215 staticData.add(idle3); 6216 staticData.add(idle4); 6217 staticData.add(idle5); 6218 staticData.add(movement); 6219 setStaticData(GameObjectType.SMOKE_BIG, staticData); 6220 } 6221 6222 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 6223 render.setPriority(SortConstants.EFFECT); 6224 6225 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6226 sprite.setSize((int)object.width, (int)object.height); 6227 sprite.setRenderComponent(render); 6228 6229 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6230 lifetime.setDieWhenInvisible(true); 6231 6232 object.destroyOnDeactivation = true; 6233 6234 object.add(lifetime); 6235 object.add(render); 6236 object.add(sprite); 6237 6238 addStaticData(GameObjectType.SMOKE_BIG, object, sprite); 6239 6240 final int animIndex = (int)(Math.random() * sprite.getAnimationCount()); 6241 final SpriteAnimation idle = sprite.findAnimation(animIndex); 6242 if (idle != null) { 6243 lifetime.setTimeUntilDeath(idle.getLength()); 6244 sprite.playAnimation(animIndex); 6245 } 6246 6247 6248 } 6249 return object; 6250 } 6251 6252 public GameObject spawnEffectSmokeSmall(float positionX, float positionY) { 6253 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 6254 6255 GameObject object = null; 6256 // This is just an effect, so we can live without it if our pools are exhausted. 6257 if (componentAvailable(RenderComponent.class, 1)) { 6258 object = mGameObjectPool.allocate(); 6259 object.getPosition().set(positionX, positionY); 6260 object.activationRadius = mAlwaysActive; 6261 object.width = 16; 6262 object.height = 16; 6263 6264 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_SMALL); 6265 if (staticData == null) { 6266 final int staticObjectCount = 2; 6267 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6268 6269 GameComponent movement = allocateComponent(MovementComponent.class); 6270 6271 SpriteAnimation idle = new SpriteAnimation(0, 5); 6272 idle.addFrame(new AnimationFrame( 6273 textureLibrary.getTextureByResource(R.drawable.effect_smoke_small01), 6274 Utils.framesToTime(24, 10), null, null)); 6275 idle.addFrame(new AnimationFrame( 6276 textureLibrary.getTextureByResource(R.drawable.effect_smoke_small02), 6277 Utils.framesToTime(24, 1), null, null)); 6278 idle.addFrame(new AnimationFrame( 6279 textureLibrary.getTextureByResource(R.drawable.effect_smoke_small03), 6280 Utils.framesToTime(24, 1), null, null)); 6281 idle.addFrame(new AnimationFrame( 6282 textureLibrary.getTextureByResource(R.drawable.effect_smoke_small04), 6283 Utils.framesToTime(24, 1), null, null)); 6284 idle.addFrame(new AnimationFrame( 6285 textureLibrary.getTextureByResource(R.drawable.effect_smoke_small05), 6286 Utils.framesToTime(24, 1), null, null)); 6287 6288 staticData.add(idle); 6289 staticData.add(movement); 6290 setStaticData(GameObjectType.SMOKE_SMALL, staticData); 6291 } 6292 6293 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 6294 render.setPriority(SortConstants.EFFECT); 6295 6296 SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6297 sprite.setSize((int)object.width, (int)object.height); 6298 sprite.setRenderComponent(render); 6299 6300 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6301 lifetime.setDieWhenInvisible(true); 6302 6303 object.destroyOnDeactivation = true; 6304 6305 object.add(lifetime); 6306 object.add(render); 6307 object.add(sprite); 6308 6309 addStaticData(GameObjectType.SMOKE_SMALL, object, sprite); 6310 6311 final SpriteAnimation idle = sprite.findAnimation(0); 6312 if (idle != null) { 6313 lifetime.setTimeUntilDeath(idle.getLength()); 6314 } 6315 6316 sprite.playAnimation(0); 6317 } 6318 6319 return object; 6320 } 6321 6322 public GameObject spawnEffectCrushFlash(float positionX, float positionY) { 6323 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 6324 6325 GameObject object = null; 6326 // This is just an effect, so we can live without it if our pools are exhausted. 6327 if (componentAvailable(RenderComponent.class, 1)) { 6328 object = mGameObjectPool.allocate(); 6329 object.getPosition().set(positionX, positionY); 6330 object.activationRadius = mAlwaysActive; 6331 object.width = 64; 6332 object.height = 64; 6333 6334 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CRUSH_FLASH); 6335 if (staticData == null) { 6336 final int staticObjectCount = 2; 6337 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6338 6339 SpriteAnimation back = new SpriteAnimation(0, 3); 6340 back.addFrame(new AnimationFrame( 6341 textureLibrary.getTextureByResource(R.drawable.effect_crush_back01), 6342 Utils.framesToTime(24, 1), null, null)); 6343 back.addFrame(new AnimationFrame( 6344 textureLibrary.getTextureByResource(R.drawable.effect_crush_back02), 6345 Utils.framesToTime(24, 1), null, null)); 6346 back.addFrame(new AnimationFrame( 6347 textureLibrary.getTextureByResource(R.drawable.effect_crush_back03), 6348 Utils.framesToTime(24, 1), null, null)); 6349 6350 SpriteAnimation front = new SpriteAnimation(1, 7); 6351 front.addFrame(new AnimationFrame( 6352 textureLibrary.getTextureByResource(R.drawable.effect_crush_front01), 6353 Utils.framesToTime(24, 1), null, null)); 6354 front.addFrame(new AnimationFrame( 6355 textureLibrary.getTextureByResource(R.drawable.effect_crush_front02), 6356 Utils.framesToTime(24, 1), null, null)); 6357 front.addFrame(new AnimationFrame( 6358 textureLibrary.getTextureByResource(R.drawable.effect_crush_front03), 6359 Utils.framesToTime(24, 1), null, null)); 6360 front.addFrame(new AnimationFrame( 6361 textureLibrary.getTextureByResource(R.drawable.effect_crush_front04), 6362 Utils.framesToTime(24, 1), null, null)); 6363 front.addFrame(new AnimationFrame( 6364 textureLibrary.getTextureByResource(R.drawable.effect_crush_front05), 6365 Utils.framesToTime(24, 1), null, null)); 6366 front.addFrame(new AnimationFrame( 6367 textureLibrary.getTextureByResource(R.drawable.effect_crush_front06), 6368 Utils.framesToTime(24, 1), null, null)); 6369 front.addFrame(new AnimationFrame( 6370 textureLibrary.getTextureByResource(R.drawable.effect_crush_front07), 6371 Utils.framesToTime(24, 1), null, null)); 6372 6373 6374 staticData.add(back); 6375 staticData.add(front); 6376 setStaticData(GameObjectType.CRUSH_FLASH, staticData); 6377 } 6378 6379 6380 RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class); 6381 backRender.setPriority(SortConstants.EFFECT); 6382 6383 SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6384 backSprite.setSize((int)object.width, (int)object.height); 6385 backSprite.setRenderComponent(backRender); 6386 6387 RenderComponent foreRender = (RenderComponent)allocateComponent(RenderComponent.class); 6388 foreRender.setPriority(SortConstants.FOREGROUND_EFFECT); 6389 6390 SpriteComponent foreSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6391 foreSprite.setSize((int)object.width, (int)object.height); 6392 foreSprite.setRenderComponent(foreRender); 6393 6394 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6395 6396 6397 object.add(lifetime); 6398 object.add(backRender); 6399 object.add(foreRender); 6400 object.add(foreSprite); 6401 object.add(backSprite); 6402 6403 addStaticData(GameObjectType.CRUSH_FLASH, object, backSprite); 6404 addStaticData(GameObjectType.CRUSH_FLASH, null, foreSprite); 6405 6406 6407 final SpriteAnimation idle = foreSprite.findAnimation(1); 6408 if (idle != null) { 6409 lifetime.setTimeUntilDeath(idle.getLength()); 6410 } 6411 6412 backSprite.playAnimation(0); 6413 foreSprite.playAnimation(1); 6414 } 6415 6416 return object; 6417 } 6418 6419 public GameObject spawnEffectFlash(float positionX, float positionY) { 6420 TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary; 6421 GameObject object = null; 6422 // This is just an effect, so we can live without it if our pools are exhausted. 6423 if (componentAvailable(RenderComponent.class, 1)) { 6424 object = mGameObjectPool.allocate(); 6425 object.getPosition().set(positionX, positionY); 6426 object.activationRadius = mAlwaysActive; 6427 object.width = 64; 6428 object.height = 64; 6429 6430 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.FLASH); 6431 if (staticData == null) { 6432 final int staticObjectCount = 1; 6433 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6434 6435 SpriteAnimation back = new SpriteAnimation(0, 3); 6436 back.addFrame(new AnimationFrame( 6437 textureLibrary.getTextureByResource(R.drawable.effect_crush_back01), 6438 Utils.framesToTime(24, 1), null, null)); 6439 back.addFrame(new AnimationFrame( 6440 textureLibrary.getTextureByResource(R.drawable.effect_crush_back02), 6441 Utils.framesToTime(24, 1), null, null)); 6442 back.addFrame(new AnimationFrame( 6443 textureLibrary.getTextureByResource(R.drawable.effect_crush_back03), 6444 Utils.framesToTime(24, 1), null, null)); 6445 6446 6447 staticData.add(back); 6448 setStaticData(GameObjectType.FLASH, staticData); 6449 } 6450 6451 6452 RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class); 6453 backRender.setPriority(SortConstants.EFFECT); 6454 6455 SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class); 6456 backSprite.setSize((int)object.width, (int)object.height); 6457 backSprite.setRenderComponent(backRender); 6458 6459 6460 6461 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6462 6463 6464 object.add(lifetime); 6465 object.add(backRender); 6466 object.add(backSprite); 6467 6468 addStaticData(GameObjectType.FLASH, object, backSprite); 6469 6470 6471 final SpriteAnimation idle = backSprite.findAnimation(0); 6472 if (idle != null) { 6473 lifetime.setTimeUntilDeath(idle.getLength()); 6474 } 6475 6476 backSprite.playAnimation(0); 6477 } 6478 6479 return object; 6480 } 6481 6482 6483 public GameObject spawnFrameRateWatcher(float positionX, float positionY) { 6484 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 6485 ContextParameters params = sSystemRegistry.contextParameters; 6486 6487 GameObject object = mGameObjectPool.allocate(); 6488 object.getPosition().set(250, 0); // HACK! 6489 object.activationRadius = mAlwaysActive; 6490 object.width = params.gameWidth; 6491 object.height = params.gameHeight; 6492 6493 DrawableBitmap indicator = new DrawableBitmap( 6494 textureLibrary.allocateTexture(R.drawable.framerate_warning), 6495 (int)object.width, 6496 (int)object.height); 6497 6498 indicator.setCrop(0, 8, 8, 8); // hack! this shouldn't be hard-coded. 6499 6500 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 6501 render.setPriority(SortConstants.OVERLAY); 6502 render.setCameraRelative(false); 6503 6504 FrameRateWatcherComponent watcher = (FrameRateWatcherComponent)allocateComponent(FrameRateWatcherComponent.class); 6505 watcher.setup(render, indicator); 6506 6507 object.add(render); 6508 object.add(watcher); 6509 6510 6511 return object; 6512 } 6513 6514 public GameObject spawnBreakableBlockPiece(float positionX, float positionY) { 6515 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 6516 6517 GameObject object = mGameObjectPool.allocate(); 6518 object.getPosition().set(positionX, positionY); 6519 object.activationRadius = mTightActivationRadius; 6520 object.width = 16; 6521 object.height = 16; 6522 6523 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE); 6524 if (staticData == null) { 6525 final int staticObjectCount = 4; 6526 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6527 6528 GameComponent gravity = allocateComponent(GravityComponent.class); 6529 GameComponent movement = allocateComponent(MovementComponent.class); 6530 6531 SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class); 6532 physics.setBounciness(0.3f); 6533 6534 DrawableBitmap piece = new DrawableBitmap( 6535 textureLibrary.getTextureByResource(R.drawable.object_debris_piece), 6536 (int)object.width, 6537 (int)object.height); 6538 6539 6540 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 6541 render.setPriority(SortConstants.GENERAL_OBJECT); 6542 render.setDrawable(piece); 6543 6544 staticData.add(render); 6545 staticData.add(movement); 6546 staticData.add(gravity); 6547 staticData.add(physics); 6548 setStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, staticData); 6549 } 6550 6551 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6552 lifetime.setTimeUntilDeath(3.0f); 6553 6554 BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class); 6555 bgcollision.setSize(12, 12); 6556 bgcollision.setOffset(2, 2); 6557 6558 6559 object.destroyOnDeactivation = true; 6560 6561 object.add(lifetime); 6562 object.add(bgcollision); 6563 6564 addStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, object, null); 6565 6566 return object; 6567 } 6568 6569 public GameObject spawnBreakableBlockPieceSpawner(float positionX, float positionY) { 6570 6571 GameObject object = mGameObjectPool.allocate(); 6572 object.getPosition().set(positionX, positionY); 6573 object.activationRadius = mTightActivationRadius; 6574 object.width = 1; 6575 object.height = 1; 6576 6577 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6578 lifetime.setTimeUntilDeath(0.5f); 6579 6580 LaunchProjectileComponent pieceSpawner 6581 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 6582 pieceSpawner.setObjectTypeToSpawn(GameObjectType.BREAKABLE_BLOCK_PIECE); 6583 pieceSpawner.setDelayBeforeFirstSet(0.0f); 6584 pieceSpawner.setSetsPerActivation(1); 6585 pieceSpawner.setShotsPerSet(3); 6586 pieceSpawner.setDelayBetweenShots(0.0f); 6587 pieceSpawner.setOffsetX(16); 6588 pieceSpawner.setOffsetY(16); 6589 pieceSpawner.setVelocityX(600.0f); 6590 pieceSpawner.setVelocityY(-1000.0f); 6591 pieceSpawner.setThetaError(1.0f); 6592 6593 object.life = 1; 6594 object.destroyOnDeactivation = true; 6595 6596 object.add(lifetime); 6597 object.add(pieceSpawner); 6598 6599 return object; 6600 } 6601 6602 public GameObject spawnSmokePoof(float positionX, float positionY) { 6603 6604 GameObject object = null; 6605 // This is just an effect, so we can live without it if our pools are exhausted. 6606 if (componentAvailable(LaunchProjectileComponent.class, 2)) { 6607 object = mGameObjectPool.allocate(); 6608 object.getPosition().set(positionX, positionY); 6609 object.activationRadius = mTightActivationRadius; 6610 object.width = 1; 6611 object.height = 1; 6612 6613 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6614 lifetime.setTimeUntilDeath(0.5f); 6615 6616 LaunchProjectileComponent smokeGun 6617 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 6618 smokeGun.setSetsPerActivation(1); 6619 smokeGun.setShotsPerSet(3); 6620 smokeGun.setDelayBetweenShots(0.0f); 6621 smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG); 6622 smokeGun.setVelocityX(200.0f); 6623 smokeGun.setVelocityY(200.0f); 6624 smokeGun.setOffsetX(16); 6625 smokeGun.setOffsetY(16); 6626 smokeGun.setThetaError(1.0f); 6627 6628 LaunchProjectileComponent smokeGun2 6629 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 6630 smokeGun2.setSetsPerActivation(1); 6631 smokeGun2.setShotsPerSet(3); 6632 smokeGun2.setDelayBetweenShots(0.0f); 6633 smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL); 6634 smokeGun2.setVelocityX(200.0f); 6635 smokeGun2.setVelocityY(200.0f); 6636 smokeGun2.setThetaError(1.0f); 6637 smokeGun2.setOffsetX(16); 6638 smokeGun2.setOffsetY(16); 6639 6640 object.life = 1; 6641 object.destroyOnDeactivation = true; 6642 6643 object.add(lifetime); 6644 object.add(smokeGun); 6645 object.add(smokeGun2); 6646 } 6647 return object; 6648 } 6649 6650 public GameObject spawnGemEffect(float positionX, float positionY) { 6651 TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; 6652 6653 GameObject object = mGameObjectPool.allocate(); 6654 object.getPosition().set(positionX, positionY); 6655 object.activationRadius = mTightActivationRadius; 6656 object.width = 32; 6657 object.height = 32; 6658 6659 FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GEM_EFFECT); 6660 if (staticData == null) { 6661 final int staticObjectCount = 2; 6662 staticData = new FixedSizeArray<BaseObject>(staticObjectCount); 6663 6664 GameComponent movement = allocateComponent(MovementComponent.class); 6665 6666 staticData.add(movement); 6667 6668 setStaticData(GameObjectType.GEM_EFFECT, staticData); 6669 } 6670 6671 RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class); 6672 render.setPriority(SortConstants.EFFECT); 6673 6674 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6675 lifetime.setTimeUntilDeath(0.5f); 6676 6677 FadeDrawableComponent fadeOut = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class); 6678 fadeOut.setupFade(1.0f, 0.0f, 0.5f, FadeDrawableComponent.LOOP_TYPE_NONE, FadeDrawableComponent.FADE_LINEAR, 0.0f); 6679 fadeOut.setTexture(textureLibrary.allocateTexture(R.drawable.object_ruby01)); 6680 fadeOut.setRenderComponent(render); 6681 6682 object.destroyOnDeactivation = true; 6683 6684 object.add(lifetime); 6685 object.add(fadeOut); 6686 object.add(render); 6687 6688 addStaticData(GameObjectType.GEM_EFFECT, object, null); 6689 6690 return object; 6691 } 6692 6693 public GameObject spawnGemEffectSpawner(float positionX, float positionY) { 6694 6695 GameObject object = mGameObjectPool.allocate(); 6696 object.getPosition().set(positionX, positionY); 6697 object.activationRadius = mTightActivationRadius; 6698 object.width = 1; 6699 object.height = 1; 6700 6701 LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class); 6702 lifetime.setTimeUntilDeath(0.5f); 6703 6704 final int gems = 6; 6705 final float angleIncrement = (float)(2.0f * Math.PI) / gems; 6706 for (int x = 0; x < gems; x++) { 6707 LaunchProjectileComponent gemGun 6708 = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class); 6709 gemGun.setSetsPerActivation(1); 6710 gemGun.setShotsPerSet(1); 6711 gemGun.setDelayBetweenShots(0.0f); 6712 gemGun.setObjectTypeToSpawn(GameObjectType.GEM_EFFECT); 6713 gemGun.setVelocityX((float)Math.sin(angleIncrement * x) * 150.0f); 6714 gemGun.setVelocityY((float)Math.cos(angleIncrement * x) * 150.0f); 6715 gemGun.setOffsetX(16); 6716 gemGun.setOffsetY(16); 6717 6718 object.add(gemGun); 6719 } 6720 6721 6722 6723 object.life = 1; 6724 object.destroyOnDeactivation = true; 6725 6726 object.add(lifetime); 6727 6728 6729 return object; 6730 } 6731 6732 /** Comparator for game objects objects. */ 6733 private final static class ComponentPoolComparator implements Comparator<GameComponentPool> { 6734 public int compare(final GameComponentPool object1, final GameComponentPool object2) { 6735 int result = 0; 6736 if (object1 == null && object2 != null) { 6737 result = 1; 6738 } else if (object1 != null && object2 == null) { 6739 result = -1; 6740 } else if (object1 != null && object2 != null) { 6741 result = object1.objectClass.hashCode() - object2.objectClass.hashCode(); 6742 } 6743 return result; 6744 } 6745 } 6746 6747 public class GameObjectPool extends TObjectPool<GameObject> { 6748 6749 public GameObjectPool() { 6750 super(); 6751 } 6752 6753 public GameObjectPool(int size) { 6754 super(size); 6755 } 6756 6757 @Override 6758 protected void fill() { 6759 for (int x = 0; x < getSize(); x++) { 6760 getAvailable().add(new GameObject()); 6761 } 6762 } 6763 6764 @Override 6765 public void release(Object entry) { 6766 ((GameObject)entry).reset(); 6767 super.release(entry); 6768 } 6769 6770 } 6771} 6772 6773