2D-Game / ChickGame / src / Character / Player.java
Player.java
Raw
package Character;

import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import main.GamePanel;
import main.KeyHandler;
import main.Object_Methods;
import object.obj_AX;

public class Player extends Character {
	
	public KeyHandler KeyH;
	Object_Methods om;
	public int Numrocks = 0;
	public int Maxrock = 9;
	
		public Player(GamePanel gp, KeyHandler KeyH,Object_Methods om ) {
			super(gp);
			this.KeyH = KeyH;
			this.om =om;
			setDefaultValue();
			getPlayerImage();
			playAttackImage();
			attackWithSpecialWeapon();
			//assigning collision area
			protectedArea = new Rectangle();
			protectedArea.x = 6;
			protectedArea.y = 6;
			protectedAreaDeafultX = protectedArea.x;
			protectedAreaDeafultY = protectedArea.y;
			protectedArea.width = 25; 
			protectedArea.height = 20;
			
			playerHitArea.width = 38;
			playerHitArea.height = 38;
			
		}
		
		public void setDefaultValue() {
			x = 200; //position of the player
			y = 200;
			defaultSpeed = 5;
			speed = defaultSpeed;
			Direction = "down";
			//player life
			MAXLIFE = 8;
			LIFE = MAXLIFE;
			project = new obj_AX(gp);
			
		}
		public void RestorePosition() {
			x = 200; //position of the player
			y = 200;
			defaultSpeed = 5;
			speed = defaultSpeed;
			Direction = "down";
		}
		public void restoreLife() {
			LIFE = MAXLIFE;
			invincible = false;
		}
		
		
		public void getPlayerImage() {
		
				up1 =setup("/Mainplayer/b1", gp.tileSize, gp.tileSize);
				up2 = setup("/Mainplayer/b2", gp.tileSize, gp.tileSize);
				up3 = setup("/Mainplayer/b3", gp.tileSize, gp.tileSize);
				down1 =setup("/Mainplayer/f1", gp.tileSize, gp.tileSize);
				down2= setup("/Mainplayer/f2", gp.tileSize, gp.tileSize);
				down3 =setup("/Mainplayer/f3", gp.tileSize, gp.tileSize);
				left1 = setup("/Mainplayer/L1", gp.tileSize, gp.tileSize);
				left2 = setup("/Mainplayer/L2", gp.tileSize, gp.tileSize);
				left3 = setup("/Mainplayer/L3", gp.tileSize, gp.tileSize);
				right1 =setup("/Mainplayer/R1", gp.tileSize, gp.tileSize);
				right2 =setup("/Mainplayer/R2", gp.tileSize, gp.tileSize);
				right3 = setup("/Mainplayer/R3", gp.tileSize, gp.tileSize);
				damageIL =  setup("/Mainplayer/damageL", gp.tileSize, gp.tileSize);
				damageIR =  setup("/Mainplayer/damageR", gp.tileSize, gp.tileSize);
				damageIF =  setup("/Mainplayer/damageF", gp.tileSize, gp.tileSize);
				damageIB =  setup("/Mainplayer/damageB", gp.tileSize, gp.tileSize);
			
			}
		//AX
		public void playAttackImage() {
			attackF1 = setup("/Mainplayer/attackF1", gp.tileSize , gp.tileSize*2);
			attackF2 =  setup("/Mainplayer/attackF2", gp.tileSize, gp.tileSize*2);
			attackB1 = setup("/Mainplayer/attackB1", gp.tileSize, gp.tileSize*2);
			attackB2 =  setup("/Mainplayer/attackB2", gp.tileSize , gp.tileSize*2);
			attackL1 = setup("/Mainplayer/attackL1", gp.tileSize*2 , gp.tileSize);
			attackL2 =  setup("/Mainplayer/attackL2", gp.tileSize*2, gp.tileSize);
			attackR1 = setup("/Mainplayer/attackR1", gp.tileSize*2, gp.tileSize);
			attackR2 =  setup("/Mainplayer/attackR2", gp.tileSize*2 , gp.tileSize);
					
		}
		//attack with special weapon
		public void attackWithSpecialWeapon() {
			sattackF1 = setup("/Mainplayer/specialAF1", gp.tileSize , gp.tileSize*2);
			sattackF2 =  setup("/Mainplayer/specialAF2", gp.tileSize, gp.tileSize*2);
			sattackB1 = setup("/Mainplayer/specialAB1", gp.tileSize, gp.tileSize*2);
			sattackB2 =  setup("/Mainplayer/specialAB2", gp.tileSize , gp.tileSize*2);
			sattackL1 = setup("/Mainplayer/specialAL1", gp.tileSize*2 , gp.tileSize);
			sattackL2 =  setup("/Mainplayer/specialAL2", gp.tileSize*2, gp.tileSize);
			sattackR1 = setup("/Mainplayer/specialAR1", gp.tileSize*2, gp.tileSize);
			sattackR2 =  setup("/Mainplayer/specialAR2", gp.tileSize*2 , gp.tileSize);
		}
		
		
		
		
		
		public void update() {
				if(attacking ==  true) {
					attackEnemy();
				}
				else if(specialAttack ==  true) {
					attackEnemy();
				}
			
				else if(KeyH.upPressed == true ||KeyH.downPressed == true|| KeyH.leftPressed == true ||
						KeyH.rightPressed==true || KeyH.enterPressed == true || KeyH.spacePressed == true){
				if(KeyH.upPressed == true) {
					Direction = "up";					
				}
				if(KeyH.downPressed == true) {
					Direction = "down";				
				}
				if(KeyH.leftPressed == true) {
					Direction = "left";				
				}
				if(KeyH.rightPressed == true) {
					Direction = "right";
				}
				//start attacking
				if(KeyH.enterPressed == true) {
					attacking = true;
					gp.playSE(5);
				}
				//special weapon
				if(KeyH.spacePressed == true && Numrocks == 10) {
					specialAttack = true;
				}
				//collision
				collisionOn = false;
				gp.checker.checkTile(this);
				//check object collision
				int objIndex = gp.checker.checkObject(this, true);
				pickupObject(objIndex);
				//NPC collision
				int npcIndex = gp.checker.checkEntity(this, gp.npc);
				npcIntereact(npcIndex);
				//Monster Collision
				int MonsterIndex = gp.checker.checkEntity(this, gp.Monster);
				MonsterInteract(MonsterIndex);
				//special object collision
			
				
				int bottom_player = y + gp.tileSize;
				int right_player = x + gp.tileSize;
				//if collision is false player can move
				if(collisionOn == false && KeyH.enterPressed == false &&  KeyH.spacePressed == false)   {
					//this if statement under each case, will keep the sprite inside the display
					switch(Direction) {
					case "up":if(y > 0) {y-= speed;break; }
					case "down":if(bottom_player < gp.screenHeight) {y+= speed;	break;}
					case "left":if(x > 0) {x-= speed;break;}
					case "right":if(right_player < gp.screenWidth) {x+= speed;	break;}
					}
				}
				KeyH.enterPressed = false;
				KeyH.spacePressed = false;
				
				spriteCounter++;
				if(spriteCounter > 10) {
					if(spriteNum == 1) {
						spriteNum=2;
					}else if(spriteNum==2) {
						spriteNum = 3;
					}else if (spriteNum == 3) {
						spriteNum = 1;
					}
					spriteCounter = 0;
				}
			  }
			if(gp.KeyH.AXkeypressed == true && project.alive ==  false) {
				
				project.set(x, y, Direction, true, this);
				//add to the array list
				gp.projectileList.add(project);
				gp.playSE(7);
			}
			
		
			if(invincible == true) {
				invincibleCounter++;
				if(invincibleCounter > 60) {
					invincible = false;
					invincibleCounter = 0;
				}
			}
			
			//GAMEOVER FRAME
			if(LIFE <= 0) {
				gp.gameState = gp.gameoverState;
				gp.playSE(9);
				
			}
			//GAME WINFrame
			if(gp.Monster[0] == null && gp.Monster[1] == null &&gp.Monster[2] == null && gp.Monster[3] == null
					&& gp.Monster[4] == null && LIFE > 0 ) {
				gp.gameState = gp.gameWin;
				gp.playSE(8);
			}
			
			
		}
		
		
		public void attackEnemy() {
			spriteCounter++;
			if(spriteCounter <=5) {
				spriteNum = 1;
			}if(spriteCounter > 5 && spriteCounter <=25) {
				spriteNum = 2;
			//check attack range lands on a monster	
			 int currentx = x;
			 int currenty = y;
			 int solidAreaWidth = protectedArea.width;
			 int solidAreaHeigh = protectedArea.height;
			 
			 switch(Direction) {
			 case "up" : y -= playerHitArea.height; break;
			 case "down": y += playerHitArea.height; break;
			 case "left" : x -= playerHitArea.width; break;
			 case "right": x += playerHitArea.width; break;
			 }
			 
			 solidAreaWidth = protectedArea.width;
			 solidAreaHeigh = protectedArea.height;
			 //check monster collision with updated data
			 int monsterIndex = gp.checker.checkEntity(this, gp.Monster);
			 damageMonster(monsterIndex, this);
			 x = currentx;
			 y = currenty;
			 protectedArea.width = solidAreaWidth;
			 protectedArea.height = solidAreaHeigh;
			 
			}if(spriteCounter >25) {
				spriteNum = 1;
				spriteCounter = 0;
				attacking = false;
				specialAttack = false;
			}
		}
		public int noOfRocks(int num) {
			Numrocks = Numrocks + num;
			return Numrocks;
			
		}
		
		public void pickupObject(int i) {
			if(i != 999) {
//				gp.obj[i] = null; //delete the object we touch
				String Object_Name = gp.obj[i].name;			
				switch(Object_Name) {
				case "rock_lv1":
					
						gp.playSE(4);
						//Numrocks++;
						noOfRocks(1); //calculate the no of rocks
						if(Numrocks == 1) {
							gp.ui.showMessage("This rock make Extra damage to the Monster");
						}
						gp.obj[i] = null;
						if(Numrocks <= Maxrock) {om.setObject(); }
							 //new rock
						if(Numrocks >= 10) {
							gp.ui.showMessage("You have unlocked a new weapon, which you can use to destroy BIGSLIME.");
						
						}
						if(Numrocks >=10) {
							om.setBigSlime();
							om.setnutMonter();
						}
					
					break;
				case "carrot":
					 
					gp.playSE(6);
					gp.obj[i] = null;
					
					gp.ui.showMessage("YOU GOT A BONUS LIFE!!");
					LIFE += 2;
					break;
				}
				
			}
		}
		//INTEREACTION OF NPC WITH PLAYER
		public void npcIntereact(int i){
			if(i !=999) {
				
			}
		}
		//MONSTER TOUCH AND INTERATION
		
		
		public void MonsterInteract(int i) {
			if(i !=999) {
				if(invincible == false) {
					LIFE -=1; //character lifes
					hitcount++;
					invincible = true;
					if(hitcount == 4 ) {
						om.setSpecialobj();
						
					}
				}
				
			}
		}
		
		//DAMAGE THE MONSTER
		public int updateDiedMonsters() {
		    diedMonsters++;
		    
		    if(diedMonsters == 2 && specialAttack == false && Numrocks != 10 ) {
		        om.setMonster();
		        diedMonsters = 0;
		        
		    }
//		    else if(specialAttack == true ) {
//		        om.setBigSlime();
//		    }
		     
		    // Any other logic related to died monsters
			return diedMonsters;
			//System.out.println(diedMonsters);
		}
		public void damageMonster(int i, Character attacker) {
			if(i != 999) {
				
				if(gp.Monster[i].invincible == false) {
					knockBack(gp.Monster[i], attacker);
					if(gp.Monster[i].type == 1) {gp.Monster[i].LIFE -= 2;}
					else {gp.Monster[i].LIFE -= 1;}
					gp.Monster[i].damageReaction();
					gp.Monster[i].invincible = true;
					if(gp.Monster[i].LIFE <= 0) {
						gp.Monster[i] = null;
						updateDiedMonsters();
						//AFTER 5 SECONDS 
						
					}
				}
			}
			else {
				//MISS THE DIRECT AX ATTACK
			}
		}
	
		public void draw(Graphics2D g2) {
			BufferedImage image = null;
			int tempx = x;
			int tempy = y;
			switch(Direction) {
			case "up":
				if(attacking == false) {
					if(spriteNum ==1) {
						image = up1;
						if(invincible == true) {
							image =  damageIB;
						}
						}
						if(spriteNum ==2) {
							image = up2;
						}
						if(spriteNum ==3) {
							image = up3;
						}
				}
				if(attacking == true) {
					tempy = y-gp.tileSize;
					if(spriteNum ==1) {
						image = attackB1;
					}
					if(spriteNum ==2) {
						image = attackB2;
					}
				}
				if(specialAttack == true) {
					tempy = y-gp.tileSize;
					if(spriteNum ==1) {
						image = sattackB1;
					}
					if(spriteNum ==2) {
						image = sattackB2;
					}
				}
				
				break;
			case "down":
				if(attacking == false) {
					if(spriteNum ==1) {
						image = down1;
						if(invincible == true) {
							image =  damageIF;
						}
					}
					if(spriteNum ==2) {
						image = down2;
					}
					if(spriteNum ==3) {
						image = down3;
					}
				}
				if(attacking == true) {
					if(spriteNum ==1) {
						image = attackF1;
					}
					if(spriteNum ==2) {
						image = attackF2;
					}
				}
				if(specialAttack == true) {
					if(spriteNum ==1) {
						image = sattackF1;
					}
					if(spriteNum ==2) {
						image = sattackF2;
					}
				}
				
				break;
			case "left":
				if(attacking == false) {
					if(spriteNum ==1) {
						image = left1;
						if(invincible ==true) {
							image = damageIL;
						}
					}
					if(spriteNum ==2) {
						image = left2;
					}
					if(spriteNum ==3) {
						image = left3;
					}
				}
				if(attacking == true) {
					tempx = x - gp.tileSize;
					if(spriteNum ==1) {
						image = attackL1;
					}
					if(spriteNum ==2) {
						image = attackL2;
					}
				}
				if(specialAttack == true) {
					tempx = x - gp.tileSize;
					if(spriteNum ==1) {
						image = sattackL1;
					}
					if(spriteNum ==2) {
						image = sattackL2;
					}
				}
				
				break;
			case "right":
				if(attacking == false) {
					if(spriteNum ==1) {
						image = right1;
						if(invincible ==true) {
							image = damageIR;
						}
					}
					if(spriteNum ==2) {
						image = right2;
					}
					if(spriteNum ==3) {
						image = right3;
					}        
				}
				if(attacking == true) {
					if(spriteNum ==1) {
						image = attackR1;
					}
					if(spriteNum ==2) {
						image = attackR2;
					}
				}  
				
				if(specialAttack == true) {
					if(spriteNum ==1) {
						image = sattackR1;
					}
					if(spriteNum ==2) {
						image = sattackR2;
					}
				}
				
				break;	
			}

			g2.drawImage(image, tempx, tempy, null);
			
		}

}