diff --git a/Meteo_Engine.jar b/Meteo_Engine.jar index 0954251..abd839e 100644 Binary files a/Meteo_Engine.jar and b/Meteo_Engine.jar differ diff --git a/src/sig/BlockAddRequest.java b/src/sig/BlockAddRequest.java new file mode 100644 index 0000000..fe97511 --- /dev/null +++ b/src/sig/BlockAddRequest.java @@ -0,0 +1,7 @@ +package sig; + +public class BlockAddRequest extends BlockRequest{ + BlockAddRequest(BlockClump bc, Block b) { + super(bc,b); + } +} diff --git a/src/sig/BlockClump.java b/src/sig/BlockClump.java index a140a88..d63d867 100644 --- a/src/sig/BlockClump.java +++ b/src/sig/BlockClump.java @@ -23,7 +23,7 @@ public class BlockClump { collisionColumnRanges[i] = new int[]{-1,-1}; } - addBlock(blockList.toArray(new Block[blockList.size()])); + addBlock(null,blockList.toArray(new Block[blockList.size()])); this.x=x; this.y=y; this.yspd=startspd; @@ -40,19 +40,38 @@ public class BlockClump { } for (Block b : blocks) {updateBlockCollisionRangeWithBlock(b);} } - public void addBlock(Block...blocks) { - //Adds the block to the strucutre. Update collision column ranges to reflect the new bounds. - for (Block b : blocks) - { - this.blocks.add(b); - updateBlockCollisionRangeWithBlock(b); + public void addBlock(List requestList,Block...blocks) { + for (Block b : blocks) { + if (requestList==null) { + //Adds the block to the strucutre. Update collision column ranges to reflect the new bounds. + this.blocks.add(b); + updateBlockCollisionRangeWithBlock(b); + } else { + requestList.add(new BlockAddRequest(this,b)); + } } } - public void removeBlock(Block...blocks) { + public void removeBlock(List requestList,Block...blocks) { for (Block b : blocks) { - this.blocks.remove(b); + if (requestList==null) { + //Adds the block to the strucutre. Update collision column ranges to reflect the new bounds. + this.blocks.remove(b); + updateBlockCollision(); + } else { + requestList.add(new BlockDeleteRequest(this,b)); + } + } + } + public void Block(List requestList,Block...blocks) { + for (Block b : blocks) { + if (requestList==null) { + //Adds the block to the strucutre. Update collision column ranges to reflect the new bounds. + this.blocks.add(b); + updateBlockCollisionRangeWithBlock(b); + } else { + requestList.add(new BlockAddRequest(this,b)); + } } - updateBlockCollision(); } public void drawBlocks(Graphics g, int originX, int originY, int block_width, int block_height, Block selectedBlock) { for (Block b : blocks) { diff --git a/src/sig/BlockDeleteRequest.java b/src/sig/BlockDeleteRequest.java new file mode 100644 index 0000000..bbf6fdc --- /dev/null +++ b/src/sig/BlockDeleteRequest.java @@ -0,0 +1,7 @@ +package sig; + +public class BlockDeleteRequest extends BlockRequest{ + BlockDeleteRequest(BlockClump bc, Block b) { + super(bc,b); + } +} diff --git a/src/sig/BlockRequest.java b/src/sig/BlockRequest.java new file mode 100644 index 0000000..cb81885 --- /dev/null +++ b/src/sig/BlockRequest.java @@ -0,0 +1,10 @@ +package sig; + +public class BlockRequest { + BlockClump bc; + Block b; + BlockRequest(BlockClump bc,Block b) { + this.bc=bc; + this.b=b; + } +} diff --git a/src/sig/Board.java b/src/sig/Board.java index e291dbd..9a435aa 100644 --- a/src/sig/Board.java +++ b/src/sig/Board.java @@ -22,6 +22,7 @@ public class Board { int block_width,block_height; double vspeed; int attack_counter=0; + boolean iterationLocked=false; BlockClump clumpClickId; Block clickBlock; @@ -36,6 +37,7 @@ public class Board { List blockClumpDeleteList = new ArrayList(); List blockClumpAddList = new ArrayList(); + List blockRequestList = new ArrayList(); public Board(int centerX,int centerY,int block_width,int block_height,int boardWidth, int boardHeight, double gravity, double launch_power, double max_rise_spd, double max_fall_spd, double[] combo_power_bonus) { @@ -95,14 +97,27 @@ public class Board { //System.out.println(blocks.y); } MergeAllGroundedClumps(); - if (blockClumpDeleteList.size()>0) { - blockData.removeAll(blockClumpDeleteList); - blockClumpDeleteList.clear(); - } - if (blockClumpAddList.size()>0) { - blockData.addAll(blockClumpAddList); - blockClumpAddList.clear(); - } + if (!iterationLocked) { + if (blockClumpDeleteList.size()>0) { + blockData.removeAll(blockClumpDeleteList); + blockClumpDeleteList.clear(); + } + if (blockClumpAddList.size()>0) { + blockData.addAll(blockClumpAddList); + blockClumpAddList.clear(); + } + if (blockRequestList.size()>0) { + for (BlockRequest addReq:blockRequestList.stream().filter((request)->request instanceof BlockAddRequest).collect(Collectors.toList())) { + addReq.bc.addBlock(null,addReq.b); + } + for (BlockRequest removeReq:blockRequestList.stream().filter((request)->request instanceof BlockDeleteRequest).collect(Collectors.toList())) { + removeReq.bc.removeBlock(null,removeReq.b); + } + blockRequestList.clear(); + } + } else { + System.out.println("Lock was requested so update could not be performed."); + } } private void DestroyOutsideBlocks(BlockClump blocks) { if (blocks.yspd>0) { @@ -115,7 +130,7 @@ public class Board { } } private void RemoveBlocks(BlockClump bc,Block...blocks) { - bc.removeBlock(blocks); + bc.removeBlock(blockRequestList,blocks); if (bc.getBlocks().size()==0) { blockClumpDeleteList.add(bc); } @@ -125,7 +140,7 @@ public class Board { if (groundedClumps.size()>1) { BlockClump base = groundedClumps.remove(0); for (BlockClump bc : groundedClumps) { - base.addBlock(bc.getBlocks().toArray(new Block[bc.getBlocks().size()])); + base.addBlock(blockRequestList,bc.getBlocks().toArray(new Block[bc.getBlocks().size()])); } blockClumpDeleteList.addAll(groundedClumps); } @@ -212,7 +227,7 @@ public class Board { private void CombineAToB(BlockClump A, BlockClump B) { for (Block b : A.getBlocks()) { b.y = B.collisionColumnRanges[b.x][1]+1; - B.addBlock(b); + B.addBlock(blockRequestList,b); } blockClumpDeleteList.add(A); } @@ -251,12 +266,14 @@ public class Board { final int DRAW_STARTY = (int)(y + block_height*((double)height/2)); final int DRAW_ENDX = (int)(x + block_width*((double)width/2)); + iterationLocked=true; for (BlockClump bc : blockData) { bc.drawBlocks(g,DRAW_STARTX,DRAW_STARTY,block_width,block_height,clickBlock); } g.setColor(Color.BLACK); g.fillRoundRect(DRAW_STARTX, DRAW_STARTY+block_height, DRAW_ENDX-DRAW_STARTX, 3, 3, 1); BlockClump.drawDebugBlockClumps(g,DRAW_STARTX,DRAW_STARTY,block_width,block_height,blockData); + iterationLocked=false; if (Meteo.DEBUG_DRAWING!=DebugMode.OFF) { g.setColor(Color.BLACK); g.drawString(Integer.toString(blockData.size()),4,Meteo.SCREEN_HEIGHT-20); @@ -270,6 +287,7 @@ public class Board { //Adjust Y coordinate based on where the board is positioned. clickBlock=null; clumpClickId=null; + iterationLocked=true; outer: for (BlockClump bc : blockData) { for (Block b : bc.getBlocks()) { @@ -280,14 +298,38 @@ public class Board { } } } + iterationLocked=false; } public void mouseReleased(MouseEvent e) { //System.out.println("Released: "+e.getPoint()); + clickBlock=null; + clumpClickId=null; } public void mouseEntered(MouseEvent e) { //System.out.println("Entered: "+e.getPoint()); } public void mouseExited(MouseEvent e) { //System.out.println("Exited: "+e.getPoint()); + clickBlock=null; + clumpClickId=null; + } + public void mouseDragged(MouseEvent e) { + //System.out.println("Dragged: "+e.getPoint()); + if (clickBlock!=null&&clumpClickId!=null) { + iterationLocked=true; + for (Block b : clumpClickId.getBlocks()) { + if (Math.abs(b.y-clickBlock.y)==1&&new Rectangle(b.draw_x,b.draw_y,block_width,block_height).contains(e.getPoint())) { + //Swap the positions of these two blocks. + int oldY = clickBlock.y; + clickBlock.y=b.y; + b.y=oldY; + break; + } + } + iterationLocked=false; + } + } + public void mouseMoved(MouseEvent e) { + //System.out.println("Moved: "+e.getPoint()); } } diff --git a/src/sig/Meteo.java b/src/sig/Meteo.java index c734d1a..91c6f4d 100644 --- a/src/sig/Meteo.java +++ b/src/sig/Meteo.java @@ -6,8 +6,9 @@ import javax.swing.JFrame; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; -public class Meteo implements MouseListener{ +public class Meteo implements MouseListener,MouseMotionListener{ public final static int SCREEN_WIDTH=640; public final static int SCREEN_HEIGHT=640; public static long FRAMECOUNT=0; @@ -60,6 +61,7 @@ public class Meteo implements MouseListener{ }.start(); f.getContentPane().addMouseListener(this); + f.getContentPane().addMouseMotionListener(this); f.add(p); f.setSize(SCREEN_WIDTH,SCREEN_HEIGHT); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -95,4 +97,14 @@ public class Meteo implements MouseListener{ public void mouseExited(MouseEvent e) { b.mouseExited(e); } + + @Override + public void mouseDragged(MouseEvent e) { + b.mouseDragged(e); + } + + @Override + public void mouseMoved(MouseEvent e) { + b.mouseMoved(e); + } } \ No newline at end of file