The agent has updated the game's core logic, including player movement, enemy AI, collision detection, and level loading. New sprites and sound effects have been integrated, along with the addition of a Chess game. The replit.nix file has been configured to include jdk21 and neovim. Replit-Commit-Author: Agent Replit-Commit-Session-Id: f6819c21-e85d-45ac-acde-604db2cfa4fe Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 32bc3e83-133e-4485-96b6-ff3d548bcbfd Replit-Helium-Checkpoint-Created: true
113 lines
2.7 KiB
Java
113 lines
2.7 KiB
Java
import java.util.*;
|
|
import javax.swing.ImageIcon;
|
|
|
|
public class Player extends Collidable {
|
|
|
|
static final int JUMP_HEIGHT = 10;
|
|
static final int POWER_DURATION = 2000; // 2000 ticks ≈ 30 seconds
|
|
static final int I_FRAMES = 67; // ~1 second
|
|
static final int SHOOT_COOLDOWN = 33; // ~0.5 second
|
|
|
|
int health;
|
|
int yVelo;
|
|
int xVelo;
|
|
boolean onGround;
|
|
int curPower;
|
|
int powerTimer;
|
|
int airJumps;
|
|
int facing; // 1 is right -1 is left
|
|
int invincibleTimer;
|
|
int shootCooldown;
|
|
int numAmendments;
|
|
|
|
public Player(int x, int y, int w, int h) {
|
|
super(x, y, w, h, new ImageIcon("Sprites/Player/1.png"));
|
|
xVelo = 0;
|
|
yVelo = 0;
|
|
onGround = false;
|
|
curPower = 0;
|
|
powerTimer = 0;
|
|
airJumps = 0;
|
|
invincibleTimer = 0;
|
|
shootCooldown = 0;
|
|
health = 3;
|
|
facing = 1;
|
|
numAmendments = 0;
|
|
}
|
|
|
|
public void moveX(int moveX) {
|
|
this.x += moveX;
|
|
this.rect.x = this.x;
|
|
}
|
|
|
|
public void moveY(int moveY) {
|
|
this.y += moveY;
|
|
this.rect.y = this.y;
|
|
}
|
|
|
|
public void setLevel(int level) {
|
|
if (level >= 2) {
|
|
this.icon = new ImageIcon("Sprites/Player/2.png");
|
|
return;
|
|
}
|
|
this.icon = new ImageIcon("Sprites/Player/" + level + ".png");
|
|
}
|
|
|
|
public void onCollideX(Collidable other) {
|
|
if (other instanceof Tile) {
|
|
Tile t = (Tile) other;
|
|
int playerCenterX = this.x + this.width / 2;
|
|
int tileCenterX = t.x + t.width / 2;
|
|
if (playerCenterX > tileCenterX) { // player on right side of tiile
|
|
this.x = t.x + t.width;
|
|
} else { // player on left side of tile
|
|
this.x = t.x - this.width;
|
|
}
|
|
this.xVelo = 0;
|
|
this.rect.x = this.x;
|
|
}
|
|
}
|
|
|
|
public void onCollideY(Collidable other, ArrayList<Collectable> collectables) {
|
|
if (other instanceof Tile) {
|
|
Tile t = (Tile) other;
|
|
if (this.yVelo >= 0) { // falling down, land on top of tile
|
|
this.y = t.y - this.height;
|
|
onGround = true;
|
|
airJumps = 0;
|
|
} else { // moving up, hit underside of tile
|
|
this.y = t.y + t.height;
|
|
if (other instanceof PowerBrick) {
|
|
PowerBrick pb = (PowerBrick) other;
|
|
if (!pb.hit) {
|
|
pb.spawnPower(collectables);
|
|
}
|
|
}
|
|
}
|
|
this.yVelo = 0;
|
|
this.rect.y = this.y;
|
|
}
|
|
}
|
|
|
|
public void takeDamage() {
|
|
if (invincibleTimer <= 0) {
|
|
health--;
|
|
invincibleTimer = I_FRAMES;
|
|
}
|
|
}
|
|
|
|
public void reset() {
|
|
this.rect.x = this.x;
|
|
this.rect.y = this.y;
|
|
this.xVelo = this.yVelo = 0;
|
|
this.curPower = 0;
|
|
this.powerTimer = 0;
|
|
this.airJumps = 0;
|
|
this.onGround = false;
|
|
this.invincibleTimer = 0;
|
|
this.shootCooldown = 0;
|
|
this.facing = 1;
|
|
this.numAmendments = 0;
|
|
}
|
|
}
|