gytebot/src/main/java/me/srvstr/bot/Gytebot.java

169 lines
4.2 KiB
Java

package me.srvstr.bot;
import me.srvstr.objects.WorldObject;
import java.awt.*;
import java.awt.geom.Point2D;
public class Gytebot extends WorldObject {
private static final float RCP_FORCE_DAMPING = 8.0F;
private Direction direction;
private Point2D.Float velocity;
private float angleVelocity;
private float viewAngle;
private boolean isReady;
public Gytebot(Point2D.Float position, Direction direction) {
super(position);
this.direction = direction;
this.velocity = new Point2D.Float();
convertDirectionToAngle(direction);
}
public Gytebot(Gytebot gytebot) {
super(new Point2D.Float());
if (gytebot != null) {
this.direction = gytebot.getDirection();
this.viewAngle = gytebot.getViewAngle();
this.angleVelocity = gytebot.getViewAngleVelocity();
this.position.x = (gytebot.getPosition()).x;
this.position.y = (gytebot.getPosition()).y;
}
}
private float getViewAngleVelocity() {
return this.angleVelocity;
}
public void updateRotation(float elapsedTime) {
this.viewAngle += this.angleVelocity * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.angleVelocity += -this.angleVelocity * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.position.x += this.velocity.x * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.position.y += this.velocity.y * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.velocity.x += -this.velocity.x * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.velocity.y += -this.velocity.y * elapsedTime * Gytebot.RCP_FORCE_DAMPING;
this.isReady = (FloatUtils.isZeroWithTolerance(this.angleVelocity)
&& FloatUtils.isZeroWithTolerance(this.velocity.x) && FloatUtils.isZeroWithTolerance(this.velocity.y));
}
public void turnRight() {
switch (this.direction) {
case NORTH:
this.direction = Direction.WEST;
break;
case WEST:
this.direction = Direction.SOUTH;
break;
case SOUTH:
this.direction = Direction.EAST;
break;
case EAST:
this.direction = Direction.NORTH;
break;
default:
break;
}
this.angleVelocity = 1.5707964F;
this.isReady = false;
}
public void turnLeft() {
switch (this.direction) {
case NORTH:
this.direction = Direction.EAST;
break;
case EAST:
this.direction = Direction.SOUTH;
break;
case SOUTH:
this.direction = Direction.WEST;
break;
case WEST:
this.direction = Direction.NORTH;
default:
break;
}
this.angleVelocity = -1.5707964F;
this.isReady = false;
}
private void convertDirectionToAngle(Direction direction) {
switch (direction) {
case NORTH:
this.viewAngle = 1.5707964F;
break;
case SOUTH:
this.viewAngle = -1.5707964F;
break;
case EAST:
this.viewAngle = 0.0F;
break;
case WEST:
this.viewAngle = 3.1415927F;
default:
break;
}
}
public void goForward() {
switch (this.direction) {
case NORTH:
this.velocity = new Point2D.Float(0.0F, -1.0F);
break;
case SOUTH:
this.velocity = new Point2D.Float(0.0F, 1.0F);
break;
case EAST:
this.velocity = new Point2D.Float(-1.0F, 0.0F);
break;
case WEST:
this.velocity = new Point2D.Float(1.0F, 0.0F);
break;
default:
this.velocity = new Point2D.Float();
break;
}
this.isReady = false;
}
public Point getForwardLocation() {
switch (this.direction) {
case NORTH:
return new Point(Math.round(this.position.x), Math.round(this.position.y) - 1);
case SOUTH:
return new Point(Math.round(this.position.x), Math.round(this.position.y) + 1);
case EAST:
return new Point(Math.round(this.position.x) - 1, Math.round(this.position.y));
case WEST:
return new Point(Math.round(this.position.x) + 1, Math.round(this.position.y));
default:
break;
}
return null;
}
public final Direction getDirection() {
return this.direction;
}
public final float getViewAngle() {
return this.viewAngle;
}
public boolean isReady() {
return this.isReady;
}
}