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

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

import main.GamePanel;
import main.ToolBox;

public class Character {
	GamePanel gp;
	//OBJECT ROCK 
	public int obj_x, obj_y;
	public int x, y;
	public int speed;
	public int attack;
	public String Direction = "left";
	
	public BufferedImage up1, up2, up3, down1, down2, down3, left1, left2, left3, left4,
						right1, right2, right3, right4, damageIF,damageIB,damageIR,damageIL;
	public BufferedImage attackF1, attackF2,attackR1,attackR2,attackL1,attackL2,attackB1,attackB2;
	public BufferedImage sattackF1, sattackF2,sattackR1,sattackR2,sattackL1,sattackL2,sattackB1,sattackB2;
	public BufferedImage image, image2, image3;

	public int spriteCounter = 0;
	public int spriteNum = 1;
	public int invincibleCounter =0;
	public int Timer= 0;
	public int dyingCounter = 0;
	public int diedMonsters = 0;
	public int hitcount = 0;
	public Character attacker;
	public String knockbackDirection;
	public boolean invincible = false;
	boolean attacking = false;
	public boolean specialAttack = false;
	public boolean collisionOn = false;
	public boolean collision = false;
	public boolean alive = true;
	public boolean dying = false;
	public boolean onPath = false;
	public boolean knockback =  false;
	
	//MOnster attack coolDown 
	public long lastAttack = 0;
	public final long coolDownTime = 3000; //3sec
	int knockbackCounter = 0; 
	//colliding
	public Rectangle protectedArea = new Rectangle(0, 0, 48, 48);
	public Rectangle playerHitArea = new Rectangle(0, 0, 0, 0);

	public int protectedAreaDeafultX, protectedAreaDeafultY;
	
	
	public String name;
	public int MAXLIFE;
	public int LIFE;
	public int type; //monster = 2
	public projectile project;
	public int defaultSpeed ;
	

	public Character(GamePanel gp){
		this.gp =gp;
	}
	public void setAction() {
		
	}
	//MONSTER REACTION
	public void damageReaction() {
		
	}
	public void checkCollision() {
		collisionOn = false;
		gp.checker.checkTile(this);//pass the npc 
		gp.checker.checkObject(this, false);
		gp.checker.checkEntity(this, gp.npc);
		gp.checker.checkEntity(this, gp.Monster);
		boolean contactPlayer = gp.checker.checkPlayer(this);
		
		//MONSTER TOUCH PLAYER - LOOSE LIFE
				if(this.type == 2 && contactPlayer == true) {
					damageplayer();
				}
			
		
	}
	
	public void update() {
		if(knockback == true) {
			checkCollision();
			if(collisionOn == true) {
				knockbackCounter = 0;
				knockback = false;
				speed = defaultSpeed;
				
			}

			
			else if(collisionOn == false) {
				int bottom_player = y + gp.tileSize;
				int right_player = x + gp.tileSize;
				switch(knockbackDirection) {
				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;}
					
				}
				
			}
			knockbackCounter++;
			if(knockbackCounter == 10) {
				knockbackCounter = 0;
				knockback = false;
				speed = defaultSpeed;
			}
		}
		else {
			setAction();
			checkCollision();
		
			if(collisionOn == false) {
				switch(Direction) {
				case "left":x-= speed;break;								
				case "right":
					if((x + gp.tileSize) <= gp.screenWidth) {
						x+= speed;	
						break;
					}	
				case "up":	y -=speed;break;
				case "down":y += speed;break;
					
				}
			}
		}
		
		spriteCounter++;
		if(spriteCounter > 20) {
			if(spriteNum == 1) {
				spriteNum=2;
			}else if(spriteNum==2) {
				spriteNum = 3;
			}
			else if (spriteNum == 3) {
				spriteNum = 1;
			}
			spriteCounter = 0;
		}
			if(invincible == true) {
			invincibleCounter++;
			if(invincibleCounter > 40){ 
				invincible = false;
				invincibleCounter = 0;
			}
		}
			
	}
	

	public void damageplayer() {
		int specialObj = 0;
		if(gp.player.invincible == false) {
			gp.player.LIFE -=1;
			if(gp.player.LIFE == 2) {
				if(specialObj != 4) {
					gp.methods.setSpecialobj();
					specialObj++;
				}
				
			}
			gp.player.invincible = true;
		}
	}
//NPC Movement
	public void draw(Graphics2D g2) {
		BufferedImage image = null;
		switch(Direction) {
		case "left":
			if(spriteNum ==1) {image = left1;}
			if(spriteNum ==2) {image = left2;}
			if(spriteNum ==3) {image = left3;}
			
			break;
		case "right":
			if(spriteNum ==1) {image = right1;}
			if(spriteNum ==2) {image = right2;}
			if(spriteNum ==3) {image = right3;}
			
			break;	
		case "up":
			if(spriteNum ==1) {image = up1;}
			if(spriteNum ==2) {image = up2;}
			if(spriteNum ==3) {image = up3;}
			
			break;	
		case "down":
			if(spriteNum ==1) {image = down1;}
			if(spriteNum ==2) {image = down2;}
			if(spriteNum ==3) {image = down3;}
			
			break;	
			
		}
		if(invincible ==  true) {
			g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
		}
		
		g2.drawImage(image, x, y, null);
		g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
	}
	
	
	public BufferedImage setup(String imagepath, int width, int height) {
		ToolBox tool = new ToolBox();
		BufferedImage Image = null;
		try {
			Image = ImageIO.read(getClass().getResourceAsStream(imagepath +".png"));
			Image = tool.scaleImage(Image, width, height);
		}catch(IOException e) {
			e.printStackTrace();
		}
		return Image;
	}
	public void draw(Graphics2D g2, GamePanel gp) {
		//DRAW METHOD FOR THE ROCKS
		g2.drawImage(image, obj_x, obj_y,gp.tileSize, gp.tileSize, null);
		
	}
	
	public void searchPath(int goalCol, int goalRow) {
		int startCol =  (x + protectedArea.x)/gp.tileSize;
		int startRow = (y + protectedArea.y)/gp.tileSize;
		
		gp.pathfinder.setNode(startCol, startRow, goalCol, goalRow, this);
		
		if(gp.pathfinder.search() == true) {
			int nextX = gp.pathfinder.pathList.get(0).col*gp.tileSize;
			int nextY = gp.pathfinder.pathList.get(0).row*gp.tileSize;
			
			int eLeftX = x + protectedArea.x;
			int eRightX = x + protectedArea.x + protectedArea.width;
			int eTopY = y + protectedArea.y;
			int eBottomY = y + protectedArea.y + protectedArea.height;
			
			
			if(eTopY > nextY && eLeftX >= nextX && eRightX < nextX +gp.tileSize) {
				Direction = "up";
			}
			else if(eTopY < nextY && eLeftX >= nextX && eRightX < nextX +gp.tileSize) {
				Direction = "down";
			}
			else if(eTopY >= nextY && eBottomY < nextY +gp.tileSize) {
				//LEFT or Right
				if(eLeftX > nextX) {
					Direction = "left";
				}
				if(eLeftX < nextX) {
					Direction = "right";
				}
				
			}
			else if(eTopY > nextY && eLeftX > nextX) {
					//up or left
					Direction = "up";
					checkCollision();
					if(collisionOn == true) {
						Direction = "left";
					}
				}
				
	
			else if(eTopY > nextY && eLeftX < nextX) {
					//up or right
					Direction = "up";
					checkCollision();
					if(collisionOn == true) {
						Direction = "right";
					}
				}
			else if(eTopY < nextY && eLeftX > nextX) {
					//down or left
					Direction = "down";
					checkCollision();
					if(collisionOn == true) {
						Direction = "left";
					}
				}
			else if(eTopY < nextY && eLeftX < nextX) {
					//down or right
					Direction = "down";
					checkCollision();
					if(collisionOn == true) {
						Direction = "right";
					}
				}
			
		}
		
	}
	public void getRandomDirection() {
		Timer++;
		if(Timer == 120 ) {//2s
			Random random = new Random();
			int j = random.nextInt(100)+1;
			if(j <=25 ) {Direction = "left";}
			if(j> 25 && j <= 50) {Direction = "right";}
			if(j> 50 && j <= 75) {
				Direction = "up";
			}
			if(j> 75 && j <= 100) {
				Direction = "down";
			}
			Timer = 0;
			
			
		}
	}
	public void VerifyStartCasing(Character target, int distance, int rate) {
		if(getTiledistance(target) < distance) {
			int i = new Random().nextInt(rate);
			if(i == 0 ) {
				onPath = true;
			}
		}
	}
	public void VerifystopChaseStatus(Character target, int distance, int rate) {
		if(getTiledistance(target) > distance) {
			int i = new Random().nextInt(rate);
			if(i == 0 ) {
				onPath = false;
			}
		}
	}
	public int getXdistance(Character target) {
		int xDistance = Math.abs(x - target.x);
		return xDistance;
		
	}
	public int getYdistance(Character target) {
		int yDistance = Math.abs(y -target.y);
		return yDistance;
		
	}
	public int getTiledistance(Character target) {
		int tileDistance = (getXdistance(target) - getYdistance(target))/gp.tileSize;
		return tileDistance;
	}
	public int getGoalCol(Character target) {
		int goalCol = (target.x + target.protectedArea.x)/gp.tileSize;
		return goalCol;
	}
	public int getGoalRow(Character target) {
		int goalRow = (target.y + target.protectedArea.y)/gp.tileSize;
		return goalRow;
	
	}
	public boolean isSpecialAttack() {
	    return specialAttack;
	}
	public void knockBack(Character Character, Character attacker) {
		//Character.Direction = Direction;
		this.attacker= attacker;
		Character.knockbackDirection = attacker.Direction;
		
		Character.speed +=10;
		Character.knockback = true;
		
	}

	
	
}