C:\__todo__\tecaj.www\src\Epsilon_04\GameSprite.java
  1  /**
  2   *  GameSprite contains the Sprite class for the Epsilon game.
  3   *  Epsilon is a simple space-shooter-vertical-scroller game.
  4   *
  5   *  Epsilon is available for non-commercial use only!
  6   *  You can learn from this sources and you can modify them
  7   *  for learning purposes.
  8   * 
  9   *  @author      Ziga Hajdukovic
 10   *  @version     1.0
 11   *  
 12   *  
 13   *  CHANGES
 14   *  + frameId
 15   *  + frameIdMax
 16   *  + imageId replaced Image object
 17   *  + spriteImageFrameWidths[]
 18   *  
 19   */  
 20 
 21 class GameSprite {
 22 
 23         //  used for all x,y and vx,vy
 24         public static final byte SHIFT_FACTOR = 4;
 25         
 26         public int x;
 27         public int y;
 28         
 29         public int w;
 30         public int h;
 31         
 32         public int vx;
 33         public int vy;
 34         
 35         public short energy;
 36         public short energyMax;
 37         
 38         public short damage;
 39         public short score;
 40 
 41         public byte spriteId;
 42 
 43         public byte imageId;
 44         
 45         public byte frameId;
 46         public byte frameIdMax;
 47 
 48         public byte fire_cooldown_frames_counter;
 49         
 50         public boolean visible;
 51         
 52         //public byte spriteId;
 53         
 54         public static final byte[] spriteImageFrameWidths =
 55         {
 56                 26,     // SPRITE_IMAGE_PLAYER
 57                  4, // SPRITE_IMAGE_FIRE
 58                 45, // SPRITE_IMAGE_BOSS1
 59                 47, // SPRITE_IMAGE_BOSS2
 60                 20, // SPRITE_IMAGE_ENEMY1
 61                 20, // SPRITE_IMAGE_ENEMY2
 62                 20, // SPRITE_IMAGE_ENEMY3
 63                 16, // SPRITE_IMAGE_ENEMY4
 64                 20, // SPRITE_IMAGE_EXPLOSION
 65         };
 66 
 67         public static final byte SPRITE_DATA_INDEX_IMG_ID = 0;
 68         public static final byte SPRITE_DATA_INDEX_MAX_ENERGY = 1;
 69         public static final byte SPRITE_DATA_INDEX_DAMAGE = 2;
 70         public static final byte SPRITE_DATA_INDEX_SCORE = 3;
 71         
 72         // spriteData[sprite_id][data_index],  image_id, energyMax, damage, score
 73         public static final short[][] spriteData = {
 74                 { GameCanvas.SPRITE_IMAGE_PLAYER, 200, 20, 0 },         //      SPRITE_ID_PLAYER
 75                 { GameCanvas.SPRITE_IMAGE_ENEMY1, 40, 30, 20 },         //      SPRITE_ID_ENEMY1
 76                 { GameCanvas.SPRITE_IMAGE_ENEMY1, 40, 30, 40 },         //      SPRITE_ID_ENEMY1_SHOOTING
 77                 { GameCanvas.SPRITE_IMAGE_ENEMY2, 20, 20, 10 },         //      SPRITE_ID_ENEMY3
 78                 { GameCanvas.SPRITE_IMAGE_ENEMY2, 20, 20, 20 },         //      SPRITE_ID_ENEMY2_SHOOTING
 79                 { GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 40, 30 },         //      SPRITE_ID_ENEMY3
 80                 { GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 40, 60 },         //      SPRITE_ID_ENEMY3_SINUS
 81                 { GameCanvas.SPRITE_IMAGE_ENEMY3, 60, 20,100 },         //      SPRITE_ID_ENEMY3_SINUS_SHOOTING
 82                 { GameCanvas.SPRITE_IMAGE_ENEMY4, 40, 20, 20 },         //      SPRITE_ID_ENEMY4_SHOOTING
 83                 { GameCanvas.SPRITE_IMAGE_BOSS1, 500, 100, 100 },       //      SPRITE_ID_BOSS1
 84                 { GameCanvas.SPRITE_IMAGE_BOSS2, 750, 100, 300 },       //      SPRITE_ID_BOSS2
 85                 { GameCanvas.SPRITE_IMAGE_EXPLOSION, 0, 0, 0 },         //      SPRITE_ID_EXPLOSION
 86                 { GameCanvas.SPRITE_IMAGE_FIRE, 0, 20, 0 },                     //      SPRITE_ID_FIRE1  // player fire
 87                 { GameCanvas.SPRITE_IMAGE_FIRE, 0, 20, 0 },                     //      SPRITE_ID_FIRE2  // blue fire
 88                 { GameCanvas.SPRITE_IMAGE_FIRE, 0, 10, 0 },                     //      SPRITE_ID_FIRE3  // green round bullet
 89         };
 90         
 91         public static final byte EXPLOSION_FRAME_SMOKE_START = 2;
 92 
 93         GameSprite( byte sprite_id )
 94         {
 95                 spriteId = sprite_id;
 96                 imageId = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_IMG_ID];
 97                 w = spriteImageFrameWidths[imageId];
 98                 h = GameCanvas.spriteImages[imageId].getHeight();
 99                 frameId = 0;
100                 frameIdMax = (byte) (GameCanvas.spriteImages[imageId].getWidth() / w - 1);
101                 vx = 4 << SHIFT_FACTOR;
102                 vy = 4 << SHIFT_FACTOR;
103                 energyMax = spriteData[sprite_id][SPRITE_DATA_INDEX_MAX_ENERGY];;
104                 energy = energyMax;
105 
106                 damage = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_DAMAGE];
107                 score = (byte) spriteData[sprite_id][SPRITE_DATA_INDEX_SCORE];
108                 
109                 // optimization
110                 visible = false;
111         }
112 
113         public boolean collidesWith(GameSprite sprite)
114         {
115                 return (x+(w << GameSprite.SHIFT_FACTOR) > sprite.x) && (x < sprite.x + (sprite.w << GameSprite.SHIFT_FACTOR)) &&
116                            (y+(h << GameSprite.SHIFT_FACTOR) > sprite.y) && (y < sprite.y + (sprite.h << GameSprite.SHIFT_FACTOR));
117         }
118 }
119