Attempt #7?!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Meteos/main.cpp

117 lines
3.5 KiB

#define OLC_PGE_APPLICATION
#include "pixelGameEngine.h"
#include <random>
#include "gameDefines.h"
Meteos*game;
bool Meteos::OnUserCreate()
{
game=this;
std::random_device rd; //Will be used to obtain a seed for the random number engine
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},12.f,3.0f);
return true;
}
bool Meteos::OnUserUpdate(float fElapsedTime)
{
fElapsedTime=std::min(fElapsedTime,1/60.f);
lastBlockSpawn+=fElapsedTime;
if (lastBlockSpawn>=3.0f){
lastBlockSpawn-=3.0f;
gameBoard.spawnBlock(randBlockPos(gen));
}
Clear(Pixel(32,32,255));
for (int x=-1;x<=gameBoard.boardSize.x;x++){
for (int y=0;y<=gameBoard.boardSize.y;y++){
if (x==-1||x==10||y==14){
FillRectDecal({(float)(gameBoard.drawOffset.x+x*12),(float)(gameBoard.drawOffset.y+y*12)},{12,12},Pixel(0,0,0,255));
} else {
DrawRectDecal({(float)(gameBoard.drawOffset.x+x*12),(float)(gameBoard.drawOffset.y+y*12)},{12,12},Pixel(255,255,255,64));
}
}
}
for (int i=0;i<gameBoard.getBlockClumps().size();i++){
BlockClump&c=gameBoard.getBlockClumps()[i];
c.vspeed+=gameBoard.gravity*fElapsedTime;
for (int j=0;j<gameBoard.getBlockClumps().size();j++) {
if (i==j) continue;
BlockClump&c2=gameBoard.getBlockClumps()[j];
for (int k=0;k<c2.getBlocks().size();k++) {
Block&b2=c2.getBlocks()[k];
for (int l=0;l<c.getBlocks().size();l++) {
Block&b3=c.getBlocks()[l];
if (c2.getBlockPosition(b2).x==c.getBlockPosition(b3).x&&
c2.getBlockPosition(b2).y+12>=c.getBlockPosition(b3).y&&
c2.getBlockPosition(b2).y<=c.getBlockPosition(b3).y+12) {
float yDiff=c2.getBlockPosition(b2).y;
float snapYPos=c.getBlockPosition(b3).y;
yDiff-=snapYPos;
c2.y+=yDiff;
float influence=(float)c.getBlocks().size()/(c.getBlocks().size()+c2.getBlocks().size());
//Copy every block from one clump to the other
for (int m=0;m<c2.getBlocks().size();m++) {
Block&b4=c2.getBlocks()[m];
c.addBlock(b4.pos.x/12,(c2.getBlockPosition(b4).y-c.y)/12);
}
if (c.vspeed>0) {
c.vspeed/=4;
}
if (c2.vspeed>0) {
c2.vspeed/=4;
}
c.vspeed=c.vspeed*influence+c2.vspeed*(1-influence);
gameBoard.removeClump(j--);
goto nextClumpCollisionCheck;
}
}
}
}
nextClumpCollisionCheck:;
for (int j=0;j<c.getBlocks().size();j++){
Block&b=c.getBlocks()[j];
int col=b.pos.x/12;
for (int k=0;k<gameBoard.getBlocks(col).size();k++){
Block&b2=gameBoard.getBlocks(col)[k];
if (c.getBlockPosition(b).y+12>=b2.pos.y&&c.getBlockPosition(b).y<=b2.pos.y+12){
c.y=b2.pos.y-12;
c.vspeed=0;
gameBoard.convertClump(i--);
goto nextClump;
}
}
if (c.getBlockPosition(b).y>=gameBoard.yBottom) {
c.y=gameBoard.yBottom;
c.vspeed=0;
gameBoard.convertClump(i--);
goto nextClump;
}
}
for (int j=0;j<c.getBlocks().size();j++){
Block&b=c.getBlocks()[j];
c.y+=c.vspeed*fElapsedTime;
FillRectDecal(c.getBlockPosition(b)+gameBoard.drawOffset,{12,12},DARK_GREEN);
}
nextClump:;
}
for (int i=0;i<gameBoard.boardSize.x;i++){
for (int y=0;y<gameBoard.getBlocks(i).size();y++){
Block&b=gameBoard.getBlocks(i)[y];
FillRectDecal(b.pos+gameBoard.drawOffset,{12,12},GREEN);
}
}
return true;
}
int main()
{
Meteos instance;
if (instance.Construct(256, 240, 4, 4))
instance.Start();
return 0;
}