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 landTime=0.f;
float launchTime=0.f;
int combo=0;
float y=0;
BlockClump();
std::vector<Block>&getBlocks();

@ -5,8 +5,8 @@ extern Meteos*game;
Board::Board()
:colorHandler({}){}
Board::Board(vi2d boardSize,float gravity,float maxGravity,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()){
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),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};
yBottom=(boardSize.y-1)*12;
for (int i=0;i<boardSize.x;i++) {

@ -45,13 +45,15 @@ class Board{
vi2d boardSize;
float gravity;
float maxGravity;
float comboGravity;
float comboMaxGravity;
float spawnRate;
float launchSpd;
float launchTime; //How much time a stack rises before beginning descent.
float landTime;
SelectedBlockData selectedBlock;
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 addClump(BlockClump&c);
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");
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);
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;
}
@ -58,11 +58,17 @@ void Meteos::updateGame(float fElapsedTime){
BlockClump&c=gameBoard.getBlockClumps()[i];
if (c.launchTime>0) {
c.launchTime-=fElapsedTime;
} else
if (c.combo>0) {
c.vspeed+=gameBoard.comboGravity;
if (c.vspeed>gameBoard.comboMaxGravity){
c.vspeed=gameBoard.comboMaxGravity;
}
} else {
c.vspeed+=gameBoard.gravity;
}
if (c.vspeed>gameBoard.maxGravity){
c.vspeed=gameBoard.maxGravity;
if (c.vspeed>gameBoard.maxGravity){
c.vspeed=gameBoard.maxGravity;
}
}
for (int j=gameBoard.getBlockClumps().size()-1;j>=0;j--) {
if (i==j) continue;
@ -131,13 +137,9 @@ void Meteos::updateGame(float fElapsedTime){
if (overlappingBlocks){
std::cout<<"Block b3 "<<b3.pos<<"!"<<std::endl;
}
if (c.vspeed>0) {
c.vspeed/=4;
}
if (c2.vspeed>0) {
c2.vspeed/=4;
}
c.vspeed=c.vspeed*influence+c2.vspeed*(1-influence);
c.vspeed=std::min(c.vspeed,c2.vspeed);
c.combo=std::max(c.combo,c2.combo);
c.landTime=std::max(c.landTime,c2.landTime);
c.sortBlocks();
if (i>=j){
i--;
@ -281,8 +283,12 @@ void Meteos::updateGame(float fElapsedTime){
for (int i:matchedBlockIDs) {
Block&b=c.getBlocks()[i];
b.col=BlockColor::LAUNCHED;
}
if (matchedBlockIDs.size()>0){
c.vspeed=gameBoard.launchSpd;
c.launchTime=gameBoard.launchTime;
c.combo++;
std::cout<<"Combo value is "<<c.combo<<std::endl;
}
}
std::vector<BlockMatchingInfo>matchedBlockIDs; //Col followed by index
@ -491,10 +497,13 @@ void Meteos::updateGame(float fElapsedTime){
for (BlockMatchingInfo&info:matchedBlockIDs) {
if (info.c!=-1){
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--) {
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){
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;
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(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);
}
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.getBlockClumps()[gameBoard.getBlockClumps().size()-1].vspeed=gameBoard.launchSpd;
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.
BlockClump&c=gameBoard.getBlockClumps()[i];
@ -643,6 +654,7 @@ void Meteos::drawGame(float fElapsedTime,bool debugView){
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));
}
//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 y=0;y<gameBoard.getBlocks(i).size();y++){

Loading…
Cancel
Save