Handling of the inputs done. Determines what the characters next frames will be depending on what th player has input.
This commit is contained in:
parent
67d4c9be53
commit
5b5960d554
@ -2,6 +2,7 @@ package gameplay.actions;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import gameplay.entities.Status;
|
||||||
import gameplay.frames.*;
|
import gameplay.frames.*;
|
||||||
import gameplay.input.*;
|
import gameplay.input.*;
|
||||||
|
|
||||||
@ -9,7 +10,10 @@ public class Attack implements Action {
|
|||||||
/**
|
/**
|
||||||
* Defines if the attack is a special one (E.G. a fireball) or a normal one (a punch)
|
* Defines if the attack is a special one (E.G. a fireball) or a normal one (a punch)
|
||||||
*/
|
*/
|
||||||
private static boolean isSpecial;
|
private static boolean isSpecial;
|
||||||
|
|
||||||
|
private static Status requiredStatus;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The suite of Inputs to have the move come out.
|
* The suite of Inputs to have the move come out.
|
||||||
@ -67,4 +71,14 @@ public class Attack implements Action {
|
|||||||
public void setParts(attackPart[] parts) {
|
public void setParts(attackPart[] parts) {
|
||||||
this.parts = parts;
|
this.parts = parts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Status getRequiredStatus() {
|
||||||
|
return requiredStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setRequiredStatus(Status requiredStatus) {
|
||||||
|
Attack.requiredStatus = requiredStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSpecial() {return this.isSpecial();}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,13 @@ public class Character extends Entity {
|
|||||||
private static Dash backDash;
|
private static Dash backDash;
|
||||||
|
|
||||||
private static Throw normalthrow;
|
private static Throw normalthrow;
|
||||||
|
|
||||||
|
private static Status status;
|
||||||
|
|
||||||
|
private static Frame[] defaultStandingFrames;
|
||||||
|
private static Frame[] defaultCrouchingFrames;
|
||||||
|
private static Frame[] forwardWalkFrames;
|
||||||
|
private static Frame[] backWalkFrames;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main constructor for a character. By default its max health is 1000 if not specified
|
* Main constructor for a character. By default its max health is 1000 if not specified
|
||||||
@ -35,11 +42,13 @@ public class Character extends Entity {
|
|||||||
public Character() {
|
public Character() {
|
||||||
super();
|
super();
|
||||||
this.maxHP = 1000;
|
this.maxHP = 1000;
|
||||||
|
this.status = Status.STANDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Character(int posx, int posy, Frame f, int maxHP) {
|
public Character(int posx, int posy, Frame f, int maxHP) {
|
||||||
super(posx, posy, f);
|
super(posx, posy, f);
|
||||||
this.maxHP = maxHP;
|
this.maxHP = maxHP;
|
||||||
|
this.status = Status.STANDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxHP(int HP) {
|
public void setMaxHP(int HP) {
|
||||||
@ -104,5 +113,43 @@ public class Character extends Entity {
|
|||||||
Character.normalthrow = normalthrow;
|
Character.normalthrow = normalthrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setStatus(Status status) {
|
||||||
|
Character.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Frame[] getDefaultStandingFrames() {
|
||||||
|
return defaultStandingFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDefaultStandingFrames(Frame[] defaultStandingFrames) {
|
||||||
|
Character.defaultStandingFrames = defaultStandingFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Frame[] getDefaultCrouchingFrames() {
|
||||||
|
return defaultCrouchingFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDefaultCrouchingFrames(Frame[] defaultCrouchingFrames) {
|
||||||
|
Character.defaultCrouchingFrames = defaultCrouchingFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Frame[] getForwardWalkFrames() {
|
||||||
|
return forwardWalkFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setForwardWalkFrames(Frame[] forwardWalkFrames) {
|
||||||
|
Character.forwardWalkFrames = forwardWalkFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Frame[] getBackWalkFrames() {
|
||||||
|
return backWalkFrames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setBackWalkFrames(Frame[] backWalkFrames) {
|
||||||
|
Character.backWalkFrames = backWalkFrames;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
5
src/gameplay/entities/Status.java
Normal file
5
src/gameplay/entities/Status.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package gameplay.entities;
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
STANDING, JUMPING, KNOCKEDDOWN, BLOCKING
|
||||||
|
}
|
@ -18,6 +18,11 @@ public class Frame {
|
|||||||
private ArrayList<Passive_throw_HitBox> passThrowHitBox;
|
private ArrayList<Passive_throw_HitBox> passThrowHitBox;
|
||||||
private ArrayList<Active_throw_Hitbox> actThrowHitBox;
|
private ArrayList<Active_throw_Hitbox> actThrowHitBox;
|
||||||
private Push_HitBox pushHitBox;
|
private Push_HitBox pushHitBox;
|
||||||
|
private boolean normalCancellable;
|
||||||
|
private boolean specialCancellable;
|
||||||
|
private boolean jumpCancellable;
|
||||||
|
private boolean moveCancellable;
|
||||||
|
private boolean isDashCancellable;
|
||||||
|
|
||||||
public Frame() {
|
public Frame() {
|
||||||
this.move_y = 0.0;
|
this.move_y = 0.0;
|
||||||
@ -27,11 +32,17 @@ public class Frame {
|
|||||||
this.passThrowHitBox = new ArrayList<Passive_throw_HitBox>();
|
this.passThrowHitBox = new ArrayList<Passive_throw_HitBox>();
|
||||||
this.actThrowHitBox = new ArrayList<Active_throw_Hitbox>();
|
this.actThrowHitBox = new ArrayList<Active_throw_Hitbox>();
|
||||||
this.pushHitBox = new Push_HitBox();
|
this.pushHitBox = new Push_HitBox();
|
||||||
|
this.normalCancellable = true;
|
||||||
|
this.specialCancellable = true;
|
||||||
|
this.jumpCancellable = true;
|
||||||
|
this.moveCancellable = true;
|
||||||
|
this.isDashCancellable = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Frame(Double move_y, Double move_x, ArrayList<Passive_HitBox> passHitBox, ArrayList<Active_HitBox> actHitBox,
|
public Frame(Double move_y, Double move_x, ArrayList<Passive_HitBox> passHitBox, ArrayList<Active_HitBox> actHitBox,
|
||||||
ArrayList<Passive_throw_HitBox> passThrowHitBox, ArrayList<Active_throw_Hitbox> actThrowHitBox,
|
ArrayList<Passive_throw_HitBox> passThrowHitBox, ArrayList<Active_throw_Hitbox> actThrowHitBox,
|
||||||
Push_HitBox pushHitBox) {
|
Push_HitBox pushHitBox, boolean normalCancellable, boolean specialCancellable, boolean jumpCancellable,
|
||||||
|
boolean moveCancellable, boolean isDashCancellable) {
|
||||||
this.move_y = move_y;
|
this.move_y = move_y;
|
||||||
this.move_x = move_x;
|
this.move_x = move_x;
|
||||||
this.passHitBox = passHitBox;
|
this.passHitBox = passHitBox;
|
||||||
@ -39,6 +50,11 @@ public class Frame {
|
|||||||
this.passThrowHitBox = passThrowHitBox;
|
this.passThrowHitBox = passThrowHitBox;
|
||||||
this.actThrowHitBox = actThrowHitBox;
|
this.actThrowHitBox = actThrowHitBox;
|
||||||
this.pushHitBox = pushHitBox;
|
this.pushHitBox = pushHitBox;
|
||||||
|
this.normalCancellable = normalCancellable;
|
||||||
|
this.specialCancellable = specialCancellable;
|
||||||
|
this.jumpCancellable = jumpCancellable;
|
||||||
|
this.moveCancellable = moveCancellable;
|
||||||
|
this.isDashCancellable = isDashCancellable;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -53,5 +69,24 @@ public class Frame {
|
|||||||
this.actThrowHitBox = new ArrayList<Active_throw_Hitbox>();
|
this.actThrowHitBox = new ArrayList<Active_throw_Hitbox>();
|
||||||
this.pushHitBox = new Push_HitBox();
|
this.pushHitBox = new Push_HitBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isNormalCancellable() {
|
||||||
|
return normalCancellable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSpecialCancellable() {
|
||||||
|
return specialCancellable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isJumpCancellable() {
|
||||||
|
return jumpCancellable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMoveCancellable() {
|
||||||
|
return moveCancellable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDashCancellable() {
|
||||||
|
return isDashCancellable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,13 @@ package gameplay.input;
|
|||||||
import engine.input.GamepadInput;
|
import engine.input.GamepadInput;
|
||||||
|
|
||||||
public class InputBuffer {
|
public class InputBuffer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of past frames to check for a certain input pas another one.
|
||||||
|
* For example, if you need to input DOWN, then FORWARD, and we know FORWARD has been input on frame 25,
|
||||||
|
* this indicates that you need to check for DOWN on frames 20 to 24
|
||||||
|
*/
|
||||||
|
private static final int pastFramesToCheck = 5;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* a list of various inputs being recorded, such as inputs pressed at each frame
|
* a list of various inputs being recorded, such as inputs pressed at each frame
|
||||||
@ -89,5 +96,47 @@ public class InputBuffer {
|
|||||||
in.recordFromGamepad(pad, facesRight);
|
in.recordFromGamepad(pad, facesRight);
|
||||||
this.recordInputs(in);
|
this.recordInputs(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for a command to be recognized. The last input of the command has to have been input on the current frame
|
||||||
|
* @param command
|
||||||
|
* @return true if the command is recognized,false if not
|
||||||
|
*/
|
||||||
|
public boolean commandRecognized(ButtonIG[][] command) {
|
||||||
|
boolean ret = true;
|
||||||
|
int backCounter;
|
||||||
|
int startFrameCount = this.pos;
|
||||||
|
int frameToCheck;
|
||||||
|
try {
|
||||||
|
ret = this.inputList[pos].containsButtonTab(command[command.length - 1]);
|
||||||
|
} catch (ArrayIndexOutOfBoundsException e ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for(int i = command.length - 2; i <= 0 && ret; i--) {
|
||||||
|
backCounter = 1;
|
||||||
|
if(startFrameCount - backCounter < 0) {frameToCheck = this.size - (backCounter - startFrameCount);}
|
||||||
|
else {frameToCheck = startFrameCount - backCounter;}
|
||||||
|
boolean search = true;
|
||||||
|
while(ret && search) {
|
||||||
|
if(this.inputList[frameToCheck].containsButtonTab(command[i])) {
|
||||||
|
ret = true;
|
||||||
|
search = false;
|
||||||
|
} else {
|
||||||
|
if(backCounter == pastFramesToCheck) {
|
||||||
|
ret = false;
|
||||||
|
search = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
backCounter++;
|
||||||
|
if(startFrameCount - backCounter < 0) {frameToCheck = this.size - (backCounter - startFrameCount);}
|
||||||
|
else {frameToCheck = startFrameCount - backCounter;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
startFrameCount = frameToCheck;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ package gameplay.match;
|
|||||||
|
|
||||||
import engine.input.Button;
|
import engine.input.Button;
|
||||||
import engine.input.GamepadInput;
|
import engine.input.GamepadInput;
|
||||||
|
import gameplay.actions.Attack;
|
||||||
|
import gameplay.entities.Status;
|
||||||
import gameplay.input.InputBuffer;
|
import gameplay.input.InputBuffer;
|
||||||
import gameplay.entities.Character;
|
import gameplay.entities.Character;
|
||||||
import gameplay.input.Inputs;
|
import gameplay.input.Inputs;
|
||||||
@ -216,9 +218,71 @@ public class match {
|
|||||||
*/
|
*/
|
||||||
private static void handleInputs(Character c, InputBuffer input) {
|
private static void handleInputs(Character c, InputBuffer input) {
|
||||||
Inputs latestIn = input.getLatestInputs();
|
Inputs latestIn = input.getLatestInputs();
|
||||||
if(latestIn.containsButtonTab(c.getNormalthrow().getCommand()[0])) {
|
boolean actionSet = false;
|
||||||
|
if(latestIn.containsButtonTab(c.getNormalthrow().getCommand()[0]) && c.getCurrentframe().isNormalCancellable()) {
|
||||||
c.clearNextFrames();
|
c.clearNextFrames();
|
||||||
c.addNextFramesList(c.getNormalthrow().getFrame());
|
c.addNextFramesList(c.getNormalthrow().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
} else {
|
||||||
|
int atkCount = 0;
|
||||||
|
//do an attack if possible
|
||||||
|
while(atkCount < c.getAttacks().length && !actionSet) {
|
||||||
|
Attack atk = c.getAttacks()[atkCount];
|
||||||
|
Boolean attackIsPossible = input.commandRecognized(atk.getCommand())
|
||||||
|
&& atk.getRequiredStatus().equals(c.getStatus())
|
||||||
|
&& ((atk.isSpecial() && c.getCurrentframe().isSpecialCancellable())
|
||||||
|
|| (!atk.isSpecial() && c.getCurrentframe().isNormalCancellable()));
|
||||||
|
if(attackIsPossible) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(atk.getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
}
|
||||||
|
atkCount++;
|
||||||
|
}
|
||||||
|
if(c.getCurrentframe().isJumpCancellable() && !actionSet) {
|
||||||
|
if (input.commandRecognized(c.getForwardJump().getCommand())) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(c.getForwardJump().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
c.setStatus(Status.JUMPING);
|
||||||
|
} else if (input.commandRecognized(c.getBackJump().getCommand())) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(c.getForwardJump().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
c.setStatus(Status.JUMPING);
|
||||||
|
} else if (input.commandRecognized(c.getNeutralJump().getCommand())) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(c.getNeutralJump().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
c.setStatus(Status.JUMPING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(c.getCurrentframe().isDashCancellable() && !actionSet) {
|
||||||
|
if (input.commandRecognized(c.getForwardDash().getCommand())) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(c.getForwardDash().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
} else if (input.commandRecognized(c.getBackDash().getCommand())) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFramesList(c.getBackDash().getFrame());
|
||||||
|
actionSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(c.getCurrentframe().isMoveCancellable() && !actionSet) {
|
||||||
|
if(input.getLatestInputs().containsInput(ButtonIG.DOWN)) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFrames(c.getDefaultCrouchingFrames());
|
||||||
|
} else if(input.getLatestInputs().containsInput(ButtonIG.BACK)) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFrames(c.getBackWalkFrames());
|
||||||
|
} if(input.getLatestInputs().containsInput(ButtonIG.FORWARD)) {
|
||||||
|
c.clearNextFrames();
|
||||||
|
c.addNextFrames(c.getForwardWalkFrames());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user