Add combo system and correct landtime values

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent c3dc478839
commit fbfad3ab01
  1. 1
      BlockClump.h
  2. 4
      Board.cpp
  3. 4
      Board.h
  4. BIN
      C++ProjectTemplate
  5. 40
      main.cpp

@ -11,6 +11,7 @@ class BlockClump{
float vspeed=0; float vspeed=0;
float landTime=0.f; float landTime=0.f;
float launchTime=0.f; float launchTime=0.f;
int combo=0;
float y=0; float y=0;
BlockClump(); BlockClump();
std::vector<Block>&getBlocks(); std::vector<Block>&getBlocks();

@ -5,8 +5,8 @@ extern Meteos*game;
Board::Board() Board::Board()
:colorHandler({}){} :colorHandler({}){}
Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float launchTime,float landTime,float spawnRate,std::array<int,10> colorRates,Renderable&tileset) Board::Board(vi2d boardSize,float gravity,float maxGravity,float comboGravity,float comboMaxGravity,float launchSpd,float launchTime,float landTime,float spawnRate,std::array<int,10> colorRates,Renderable&tileset)
:boardSize(boardSize),gravity(gravity),maxGravity(maxGravity),launchSpd(launchSpd),launchTime(launchTime),landTime(landTime),spawnRate(spawnRate),colorHandler(colorRates),tileset(tileset.Decal()){ :boardSize(boardSize),gravity(gravity),maxGravity(maxGravity),comboGravity(comboGravity),comboMaxGravity(comboMaxGravity),launchSpd(launchSpd),launchTime(launchTime),landTime(landTime),spawnRate(spawnRate),colorHandler(colorRates),tileset(tileset.Decal()){
drawOffset={(float)game->ScreenWidth()/2-boardSize.x/2*12,(float)game->ScreenHeight()/2-boardSize.y/2*12}; drawOffset={(float)game->ScreenWidth()/2-boardSize.x/2*12,(float)game->ScreenHeight()/2-boardSize.y/2*12};
yBottom=(boardSize.y-1)*12; yBottom=(boardSize.y-1)*12;
for (int i=0;i<boardSize.x;i++) { for (int i=0;i<boardSize.x;i++) {

@ -45,13 +45,15 @@ class Board{
vi2d boardSize; vi2d boardSize;
float gravity; float gravity;
float maxGravity; float maxGravity;
float comboGravity;
float comboMaxGravity;
float spawnRate; float spawnRate;
float launchSpd; float launchSpd;
float launchTime; //How much time a stack rises before beginning descent. float launchTime; //How much time a stack rises before beginning descent.
float landTime; float landTime;
SelectedBlockData selectedBlock; SelectedBlockData selectedBlock;
Board(); Board();
Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float launchTime,float landTime,float spawnRate,std::array<int,10> colorRates,Renderable&tileset); Board(vi2d boardSize,float gravity,float maxGravity,float launchedGravity,float launchedMaxGravity,float launchSpd,float launchTime,float landTime,float spawnRate,std::array<int,10> colorRates,Renderable&tileset);
void spawnBlock(int col); void spawnBlock(int col);
void addClump(BlockClump&c); void addClump(BlockClump&c);
std::vector<Block>&getBlocks(int col); std::vector<Block>&getBlocks(int col);

Binary file not shown.

@ -19,11 +19,11 @@ bool Meteos::OnUserCreate()
SPRITES["blocks_test.png"].Load("assets/blocks_test.png"); SPRITES["blocks_test.png"].Load("assets/blocks_test.png");
std::random_device rd; //Will be used to obtain a seed for the random number engine std::random_device rd; //Will be used to obtain a seed for the random number engine
gen=std::mt19937(0); //Standard mersenne_twister_engine seeded with rd() gen=std::mt19937(rd()); //Standard mersenne_twister_engine seeded with rd()
randBlockPos=std::uniform_int_distribution<>(0, 9); randBlockPos=std::uniform_int_distribution<>(0, 9);
coinFlip=std::uniform_int_distribution<>(0, 1); coinFlip=std::uniform_int_distribution<>(0, 1);
gameBoard=Board({10,14},0.04f,1.2f,-1.f,1.7f,2.0f,1.0f,{3,3,1,2,3,0,0,0,0,0},SPRITES["blocks_test.png"]); gameBoard=Board({10,14},0.04f,1.2f,0.04f,0.4f,-1.f,1.7f,2.0f,1.0f,{3,3,1,2,3,0,0,0,0,0},SPRITES["blocks_test.png"]);
return true; return true;
} }
@ -58,11 +58,17 @@ void Meteos::updateGame(float fElapsedTime){
BlockClump&c=gameBoard.getBlockClumps()[i]; BlockClump&c=gameBoard.getBlockClumps()[i];
if (c.launchTime>0) { if (c.launchTime>0) {
c.launchTime-=fElapsedTime; c.launchTime-=fElapsedTime;
} else
if (c.combo>0) {
c.vspeed+=gameBoard.comboGravity;
if (c.vspeed>gameBoard.comboMaxGravity){
c.vspeed=gameBoard.comboMaxGravity;
}
} else { } else {
c.vspeed+=gameBoard.gravity; c.vspeed+=gameBoard.gravity;
} if (c.vspeed>gameBoard.maxGravity){
if (c.vspeed>gameBoard.maxGravity){ c.vspeed=gameBoard.maxGravity;
c.vspeed=gameBoard.maxGravity; }
} }
for (int j=gameBoard.getBlockClumps().size()-1;j>=0;j--) { for (int j=gameBoard.getBlockClumps().size()-1;j>=0;j--) {
if (i==j) continue; if (i==j) continue;
@ -131,13 +137,9 @@ void Meteos::updateGame(float fElapsedTime){
if (overlappingBlocks){ if (overlappingBlocks){
std::cout<<"Block b3 "<<b3.pos<<"!"<<std::endl; std::cout<<"Block b3 "<<b3.pos<<"!"<<std::endl;
} }
if (c.vspeed>0) { c.vspeed=std::min(c.vspeed,c2.vspeed);
c.vspeed/=4; c.combo=std::max(c.combo,c2.combo);
} c.landTime=std::max(c.landTime,c2.landTime);
if (c2.vspeed>0) {
c2.vspeed/=4;
}
c.vspeed=c.vspeed*influence+c2.vspeed*(1-influence);
c.sortBlocks(); c.sortBlocks();
if (i>=j){ if (i>=j){
i--; i--;
@ -281,8 +283,12 @@ void Meteos::updateGame(float fElapsedTime){
for (int i:matchedBlockIDs) { for (int i:matchedBlockIDs) {
Block&b=c.getBlocks()[i]; Block&b=c.getBlocks()[i];
b.col=BlockColor::LAUNCHED; b.col=BlockColor::LAUNCHED;
}
if (matchedBlockIDs.size()>0){
c.vspeed=gameBoard.launchSpd; c.vspeed=gameBoard.launchSpd;
c.launchTime=gameBoard.launchTime; c.launchTime=gameBoard.launchTime;
c.combo++;
std::cout<<"Combo value is "<<c.combo<<std::endl;
} }
} }
std::vector<BlockMatchingInfo>matchedBlockIDs; //Col followed by index std::vector<BlockMatchingInfo>matchedBlockIDs; //Col followed by index
@ -491,10 +497,13 @@ void Meteos::updateGame(float fElapsedTime){
for (BlockMatchingInfo&info:matchedBlockIDs) { for (BlockMatchingInfo&info:matchedBlockIDs) {
if (info.c!=-1){ if (info.c!=-1){
if (gameBoard.getBlockClumps()[info.c].getBlocks().size()>0){ if (gameBoard.getBlockClumps()[info.c].getBlocks().size()>0){
if (c.combo<gameBoard.getBlockClumps()[info.c].combo){
c.combo=gameBoard.getBlockClumps()[info.c].combo;
}
for (int i=gameBoard.getBlockClumps()[info.c].getBlocks().size()-1;i>=0;i--) { for (int i=gameBoard.getBlockClumps()[info.c].getBlocks().size()-1;i>=0;i--) {
Block&b2=gameBoard.getBlockClumps()[info.c].getBlocks()[i]; Block&b2=gameBoard.getBlockClumps()[info.c].getBlocks()[i];
if ((int)fmod(std::abs((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos),12)!=0){ if ((int)fmod(std::abs(std::round(gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y)-std::round(baseBlockPos)),12)!=0){
std::cout<<"Difference is not equal to 0! Value:"<<(int)fmod(std::abs((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos),12)<<" "<<gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y<<"//"<<baseBlockPos<<std::endl; std::cout<<"Difference is not equal to 0! Value:"<<(int)fmod(std::abs(std::round(gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y)-std::round(baseBlockPos)),12)<<" "<<gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y<<"//"<<baseBlockPos<<std::endl;
assert(false); assert(false);
} }
c.addBlock(b2.pos.x/12,((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos)/12,b2.col); c.addBlock(b2.pos.x/12,((int)gameBoard.getBlockClumps()[info.c].getBlockPosition(b2).y-(int)baseBlockPos)/12,b2.col);
@ -525,6 +534,8 @@ void Meteos::updateGame(float fElapsedTime){
gameBoard.addClump(c); gameBoard.addClump(c);
gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd; gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd;
gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].launchTime=gameBoard.launchTime; gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].launchTime=gameBoard.launchTime;
gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].combo++;
std::cout<<"Combo value is "<<gameBoard.getBlockClumps()[gameBoard.getBlockClumps().size()-1].combo<<std::endl;
} }
for (int i=gameBoard.getBlockClumps().size()-1;i>=0;i--){ //Resolve BlockClump movements. for (int i=gameBoard.getBlockClumps().size()-1;i>=0;i--){ //Resolve BlockClump movements.
BlockClump&c=gameBoard.getBlockClumps()[i]; BlockClump&c=gameBoard.getBlockClumps()[i];
@ -643,6 +654,7 @@ void Meteos::drawGame(float fElapsedTime,bool debugView){
Block&b=c.getBlocks()[j]; Block&b=c.getBlocks()[j];
DrawPartialDecal(c.getBlockPosition(b)+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.ind==j&&gameBoard.selectedBlock.c==i?Pixel(GREY.r,GREY.g,GREY.b,alpha):Pixel(WHITE.r,WHITE.g,WHITE.b,alpha)); DrawPartialDecal(c.getBlockPosition(b)+gameBoard.drawOffset,gameBoard.tileset,{(float)(int)b.col*12,0},{12,12},{1,1},gameBoard.selectedBlock.col!=-1&&gameBoard.selectedBlock.ind==j&&gameBoard.selectedBlock.c==i?Pixel(GREY.r,GREY.g,GREY.b,alpha):Pixel(WHITE.r,WHITE.g,WHITE.b,alpha));
} }
//DrawStringDecal({32,c.y+i%4*4},std::to_string(c.landTime),WHITE,{0.4,0.4}); //Draws land times per clump.
} }
for (int i=0;i<gameBoard.boardSize.x;i++){ for (int i=0;i<gameBoard.boardSize.x;i++){
for (int y=0;y<gameBoard.getBlocks(i).size();y++){ for (int y=0;y<gameBoard.getBlocks(i).size();y++){

Loading…
Cancel
Save