From b2d2701c9ae1da5addfa179b0e1ebb2049aa1af9 Mon Sep 17 00:00:00 2001 From: Joshua Sigona Date: Tue, 21 Sep 2021 20:44:42 +0900 Subject: [PATCH] Block gravity and collision handling. --- src/sig/BlockClump.java | 8 ++++- src/sig/Board.java | 66 ++++++++++++++++++++++++++++++++++------- src/sig/Meteo.java | 4 +-- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/sig/BlockClump.java b/src/sig/BlockClump.java index f3ee125..84a6109 100644 --- a/src/sig/BlockClump.java +++ b/src/sig/BlockClump.java @@ -1,6 +1,7 @@ package sig; import java.awt.Graphics; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -9,7 +10,11 @@ public class BlockClump { double x,y; //the lower-left origin of this block clump. Every block positions relative to this. double yspd; int[][] collisionColumnRanges; + boolean launched=false; //Blocks do not fall when landing (by gravity). + boolean re_sort=false; //Set to true when block clumps are divided into smaller columns for re-sorting. public BlockClump(List blockList, double x, double y, double startspd, int width) { + this.blocks = new ArrayList(); + this.blocks.addAll(blockList); collisionColumnRanges = new int[width][]; for (int i=0;ib.y) { collisionColumnRanges[b.x][0]=b.y; - } else + } if (collisionColumnRanges[b.x][1]==-1||collisionColumnRanges[b.x][1] initialBlocks = new ArrayList(); for (int x=0;x initialBlocks2 = new ArrayList(); + for (int x=0;x0) { - blocks.yspd=Math.max(blocks.yspd+gravity,max_fall_spd); - blocks.y+=blocks.yspd; - } else { - //We have hit the bottom. - blocks.yspd=0; - blocks.y=0; - } + double FUTURE_FALL_POSITION = blocks.y+blocks.yspd+gravity; + boolean landed=false; + outerloop: + for (int x=0;xblocks2.y+(blocks2.collisionColumnRanges[x][0]+1)*block_height) { + blocks.yspd=0; + blocks.y=blocks2.y+(blocks2.collisionColumnRanges[x][0]+1)*block_height; + landed=true; + break outerloop; + } + } else { + if (FUTURE_FALL_POSITION+blocks.collisionColumnRanges[x][0]*block_height0) { + blocks.yspd=Math.max(blocks.yspd+gravity,max_fall_spd); + blocks.y+=blocks.yspd; + } else { + //We have hit the bottom. + blocks.yspd=0; + blocks.y=0; + } + } + //System.out.println(blocks.y); } } public void drawBoard(Graphics g) { diff --git a/src/sig/Meteo.java b/src/sig/Meteo.java index 749a55d..b0403ba 100644 --- a/src/sig/Meteo.java +++ b/src/sig/Meteo.java @@ -15,12 +15,12 @@ public class Meteo { public static void runGameLoop() { FRAMECOUNT++; - b.run(); + b.run(FRAMECOUNT); } public static void main(String[] args) { double[] val = {0,0,}; - b = new Board(SCREEN_WIDTH/2,SCREEN_HEIGHT/2,16,16,8,14,-0.065,1,4,-2,val); + b = new Board(SCREEN_WIDTH/2,SCREEN_HEIGHT/2,24,24,8,14,-0.065,1,4,-2,val); JFrame f = new JFrame("Meteo Engine"); Panel p = new Panel();