FallSimulator/FallSimulation.cpp

449 lines
12 KiB
C++
Raw Normal View History

2019-09-13 14:43:18 +03:00
#include <TXLib.h>
2019-09-20 15:08:09 +03:00
#include <iostream>
2019-10-04 15:32:55 +03:00
#include <fstream>
2019-09-20 15:08:09 +03:00
using namespace std;
const COLORREF MY_LIGHTBLUE = RGB(75, 127, 196);
const COLORREF MY_BISQUE = RGB(255, 214, 89);
2019-10-04 15:32:55 +03:00
const int BLOCK_TYPE = 0;
const int QUEST_TYPE = 1;
const int WATER_TYPE = 2;
const int FIRE_TYPE = 3;
2019-10-11 15:36:39 +03:00
const int MAP_LENGHT = 5;
2019-09-20 15:08:09 +03:00
int middleX;
int middleY;
int extentX;
int extentY;
2019-09-30 15:30:46 +03:00
bool gameIsStarted = false;
2019-09-23 15:35:44 +03:00
struct Button {
RECT coords;
const char* text;
HDC picture;
};
2019-10-04 15:32:55 +03:00
struct MapPart {
RECT coords;
bool visible;
HDC picture;
int blocktype;
};
HDC block;
HDC quest;
HDC water;
2019-10-12 17:06:30 +03:00
HDC fire;
HDC orange_but;
HDC green_but;
HDC blue_but;
HDC purple_but;
2019-09-20 15:08:09 +03:00
void background(COLORREF color);
void drawMenu();
void drawButton(Button but, bool picture);
void loadingAnimation(int delay, int speed);
2019-09-23 15:35:44 +03:00
void mainFunc();
2019-09-20 15:08:09 +03:00
int main()
{
txCreateWindow(1300, 600);
block = txLoadImage("pictures\\block.bmp");
quest = txLoadImage("pictures\\question.bmp");
water = txLoadImage("pictures\\water.bmp");
2019-10-12 17:06:30 +03:00
fire = txLoadImage("pictures\\fire.bmp");
//orange_but = txLoadImage("pictures\\orange-but.bmp");
//green_but = txLoadImage("pictures\\green-but.bmp");
//blue_but = txLoadImage("pictures\\blue-but.bmp");
//purple_but = txLoadImage("pictures\\purple-but.bmp");
2019-09-20 15:08:09 +03:00
middleX = txGetExtentX() / 2;
middleY = txGetExtentY() / 2;
extentX = txGetExtentX();
extentY = txGetExtentY();
background(TX_WHITE);
txSleep(50);
txBegin();
2019-09-23 15:35:44 +03:00
txSleep(1000);
txSetColor(MY_LIGHTBLUE, 2);
txSetFillColor(TX_WHITE);
txRectangle(0, 0, extentX, extentY);
txSetColor(MY_LIGHTBLUE, 2);
txSetFillColor(MY_LIGHTBLUE);
txRectangle(0, 0, extentX, 50);
txSetColor(TX_BLACK, 3);
txSetFillColor(TX_WHITE);
txDrawText(0, 0, extentX, 50, "����������� ������� ���� FallSimulation");
2019-09-20 15:08:09 +03:00
drawMenu();
txEnd();
txDeleteDC(block);
txDeleteDC(quest);
2019-10-11 15:36:39 +03:00
txDeleteDC(water);
2019-10-12 17:06:30 +03:00
txDeleteDC(fire);
2019-09-20 15:08:09 +03:00
txDisableAutoPause();
}
void background(COLORREF color)
{
txSetFillColor(color);
txClear();
}
void drawButton(Button but, bool picture)
2019-09-23 15:35:44 +03:00
{
//drawing button
txRectangle(but.coords.left,
but.coords.top,
but.coords.right,
but.coords.bottom);
//drawing text
txDrawText (but.coords.left,
but.coords.top,
but.coords.right,
but.coords.bottom,
but.text);
}
2019-09-20 15:08:09 +03:00
void drawMenu()
{
2019-09-23 15:35:44 +03:00
//button "Play"
Button buttonPlay = {
{
middleX - 100, extentY / 3 - 50,
middleX + 100, extentY / 3 + 50
}, "Play"
2019-09-20 15:08:09 +03:00
};
2019-09-23 15:35:44 +03:00
//button "Exit"
Button buttonExit = {
{
middleX - 100, extentY / 2 - 50,
middleX + 100, extentY / 2 + 50
}, "Exit"
2019-09-20 15:08:09 +03:00
};
//button "Settings"
Button buttonSets = {
{
extentX - 100, 0,
extentX , 50
}, "Settings"
};
2019-09-20 15:08:09 +03:00
txSetColor(TX_BLACK, 3);
txSetFillColor(TX_WHITE);
drawButton(buttonPlay, true);
drawButton(buttonExit, true);
txSetColor(TX_BLACK, 3);
txSetFillColor(TX_TRANSPARENT);
drawButton(buttonSets, false);
2019-09-23 15:35:44 +03:00
2019-09-20 15:08:09 +03:00
txSleep(50);
while (!GetAsyncKeyState('Q')) {
2019-09-30 15:30:46 +03:00
if (!gameIsStarted) {
if (In(txMousePos(), buttonPlay.coords) && txMouseButtons() & 1) {
while (txMouseButtons() & 1) {
txSleep(10);
}
2019-10-04 15:32:55 +03:00
//loadingAnimation(2, 3);
2019-09-30 15:30:46 +03:00
txSleep(50);
mainFunc();
2019-09-20 15:08:09 +03:00
}
2019-09-30 15:30:46 +03:00
if (In(txMousePos(), buttonExit.coords) && txMouseButtons() & 1) {
while (txMouseButtons() & 1) {
txSleep(10);
}
2019-09-20 15:08:09 +03:00
2019-09-30 15:30:46 +03:00
break;
2019-09-20 15:08:09 +03:00
}
2019-09-30 15:30:46 +03:00
if (In(txMousePos(), buttonSets.coords) && txMouseButtons() & 1) {
while(txMouseButtons() & 1) {
txSleep(10);
}
2019-09-20 15:08:09 +03:00
2019-09-30 15:30:46 +03:00
txSetColor(TX_BLACK, 3);
txSetFillColor(MY_BISQUE);
2019-09-30 15:30:46 +03:00
txRectangle(middleX - 200, middleY - 100, middleX + 200, middleY + 100);
//code
}
}
txSleep(10);
2019-09-20 15:08:09 +03:00
}
}
void loadingAnimation(int delay, int speed)
2019-09-23 15:35:44 +03:00
{
background(TX_WHITE);
for (int circle_radius = 0;
circle_radius * circle_radius < extentX * extentX + extentY * extentY;
circle_radius += speed) {
2019-09-23 15:35:44 +03:00
2019-10-04 15:32:55 +03:00
background(TX_WHITE);
2019-09-23 15:35:44 +03:00
txSetColor(TX_BLACK, 2);
txSetFillColor(TX_BLACK);
txCircle(0, 0, circle_radius);
txSleep(delay);
}
background(TX_WHITE);
}
void mainFunc()
{
2019-09-30 15:30:46 +03:00
gameIsStarted = true;
2019-10-04 15:32:55 +03:00
int arrElem = 0;
2019-10-11 15:36:39 +03:00
const int BLOCK_SIZE = 120;
2019-10-04 15:32:55 +03:00
2019-09-30 15:30:46 +03:00
RECT blockBut = {
2019-10-11 15:36:39 +03:00
extentX - BLOCK_SIZE, 0, extentX, BLOCK_SIZE
2019-09-30 15:30:46 +03:00
};
RECT questBut = {
2019-10-11 15:36:39 +03:00
extentX - BLOCK_SIZE, BLOCK_SIZE, extentX, 2 * BLOCK_SIZE
};
RECT waterBut = {
2019-10-11 15:36:39 +03:00
extentX - BLOCK_SIZE, 2 * BLOCK_SIZE, extentX, 3 * BLOCK_SIZE
2019-09-30 15:30:46 +03:00
};
2019-10-12 17:06:30 +03:00
RECT fireBut = {
extentX - BLOCK_SIZE, 3* BLOCK_SIZE, extentX, 4 * BLOCK_SIZE
};
2019-09-30 15:30:46 +03:00
2019-10-04 15:32:55 +03:00
RECT doneBut = {
extentX - 60, extentY - 60, extentX, extentY
};
2019-10-12 17:06:30 +03:00
2019-10-11 15:36:39 +03:00
MapPart mapParts[MAP_LENGHT + 1];
Button completeButton = {doneBut, "Done"};
for (int elem = 0; elem < MAP_LENGHT; elem++) {
mapParts[elem].visible = false;
}
2019-10-04 15:32:55 +03:00
2019-09-30 15:30:46 +03:00
bool clickedBlock = false;
bool clickedQuest = false;
bool clickedWater = false;
2019-10-12 17:06:30 +03:00
bool clickedfire = false;
2019-09-30 15:30:46 +03:00
2019-10-04 15:32:55 +03:00
while (!GetAsyncKeyState('Q')) {
2019-09-30 15:30:46 +03:00
background(TX_WHITE);
2019-10-11 15:36:39 +03:00
Win32::TransparentBlt(txDC(), blockBut.left, blockBut.top, 120, 120, block,
0, 0, 60, 60, -1);
Win32::TransparentBlt(txDC(), questBut.left, questBut.top, 120, 120, quest,
0, 0, 60, 60, -1);
Win32::TransparentBlt(txDC(), waterBut.left, waterBut.top, 120, 120, water,
0, 0, 60, 60, -1);
2019-10-12 17:06:30 +03:00
Win32::TransparentBlt(txDC(), fireBut.left, fireBut.top, 120, 120, fire,
0, 0, 60, 60, -1);
2019-10-11 15:36:39 +03:00
drawButton(completeButton, false);
for (int elem = 0; elem < MAP_LENGHT; elem++) {
2019-09-30 15:30:46 +03:00
mapParts[elem].coords.left = round((mapParts[elem].coords.left + 30) / 60) * 60;
mapParts[elem].coords.top = round((mapParts[elem].coords.top + 30) / 60) * 60;
2019-10-04 15:32:55 +03:00
if (mapParts[elem].visible) {
txBitBlt(txDC(),
mapParts[elem].coords.left,
mapParts[elem].coords.top,
60, 60,
mapParts[elem].picture
);
}
}
2019-09-30 15:30:46 +03:00
//block "block"
if (In(txMousePos(), blockBut) && txMouseButtons() & 1) {
clickedBlock = true;
}
if (txMouseButtons() & 1 && clickedBlock) {
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, block);
2019-10-04 15:32:55 +03:00
}
if (!(txMouseButtons() & 1) && clickedBlock) {
2019-10-11 15:36:39 +03:00
if (arrElem < MAP_LENGHT) {
mapParts[arrElem] = {
{
txMouseX() - 30, txMouseY() - 30, txMouseX() + 30, txMouseY() + 30
}, true, block, BLOCK_TYPE
};
2019-10-11 15:36:39 +03:00
arrElem++;
}
else {
2019-10-11 15:36:39 +03:00
char maplen_str[50];
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
txMessageBox(maplen_str, "Error");
arrElem--;
}
2019-10-11 15:36:39 +03:00
//arrElem++;
2019-10-04 15:32:55 +03:00
clickedBlock = false;
2019-09-30 15:30:46 +03:00
}
//block "quest"
if (In(txMousePos(), questBut) && txMouseButtons() & 1) {
clickedQuest = true;
}
if (txMouseButtons() & 1 && clickedQuest) {
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, quest);
2019-10-04 15:32:55 +03:00
}
if (!(txMouseButtons() & 1) && clickedQuest) {
2019-09-30 15:30:46 +03:00
2019-10-11 15:36:39 +03:00
if (arrElem < MAP_LENGHT) {
mapParts[arrElem] = {
{
txMouseX() - 30, txMouseY() - 30, txMouseX() + 30, txMouseY() + 30
}, true, quest, QUEST_TYPE
};
arrElem++;
}
else {
char maplen_str[50];
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
txMessageBox(maplen_str, "Error");
arrElem--;
}
2019-10-04 15:32:55 +03:00
clickedQuest = false;
}
//block "water"
if (In(txMousePos(), waterBut) && txMouseButtons() & 1) {
clickedWater = true;
}
if (txMouseButtons() & 1 && clickedWater) {
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, water);
}
if (!(txMouseButtons() & 1) && clickedWater) {
2019-10-11 15:36:39 +03:00
if (arrElem < MAP_LENGHT) {
mapParts[arrElem] = {
{
txMouseX() - 30, txMouseY() - 30, txMouseX() + 30, txMouseY() + 30
}, true, water, WATER_TYPE
};
arrElem++;
}
else {
char maplen_str[50];
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
txMessageBox(maplen_str, "Error");
arrElem--;
}
clickedWater = false;
}
2019-10-12 17:06:30 +03:00
//block "fire"
if (In(txMousePos(), fireBut) && txMouseButtons() & 1) {
clickedfire = true;
}
if (txMouseButtons() & 1 && clickedfire) {
txBitBlt(txDC(), txMouseX() - 30, txMouseY() - 30, 60, 60, fire);
}
if (!(txMouseButtons() & 1) && clickedfire) {
if (arrElem < MAP_LENGHT) {
mapParts[arrElem] = {
{
txMouseX() - 30, txMouseY() - 30, txMouseX() + 30, txMouseY() + 30
}, true, fire, FIRE_TYPE
};
arrElem++;
}
else {
char maplen_str[50];
sprintf(maplen_str, "You cannot add more than %d blocks", MAP_LENGHT);
txMessageBox(maplen_str, "Error");
arrElem--;
}
clickedfire = false;
}
2019-10-04 15:32:55 +03:00
//button to complete LevelCreating
if (In(txMousePos(), doneBut) && txMouseButtons() & 1) {
while (txMouseButtons() & 1) {
txSleep(10);
}
ofstream lvlfile;
lvlfile.open("level1.fslvl");
2019-10-11 15:36:39 +03:00
for (int elem = 0; elem < arrElem; elem++) {
2019-10-04 15:32:55 +03:00
if (mapParts[elem].visible) {
switch(mapParts[elem].blocktype)
{
case BLOCK_TYPE:
2019-10-11 15:36:39 +03:00
lvlfile << "Block,";
break;
case QUEST_TYPE:
2019-10-11 15:36:39 +03:00
lvlfile << "Quest,";
break;
case WATER_TYPE:
lvlfile << "Water,";
break;
2019-10-12 17:06:30 +03:00
case FIRE_TYPE:
lvlfile << "Fire,";
break;
2019-10-04 15:32:55 +03:00
}
lvlfile << mapParts[elem].coords.left;
2019-10-11 15:36:39 +03:00
lvlfile << ",";
lvlfile << mapParts[elem].coords.top;
2019-10-11 15:36:39 +03:00
lvlfile << ",";
lvlfile << mapParts[elem].coords.right;
2019-10-11 15:36:39 +03:00
lvlfile << ",";
lvlfile << mapParts[elem].coords.bottom;
2019-10-11 15:36:39 +03:00
lvlfile << "\n";
lvlfile << "";
2019-10-04 15:32:55 +03:00
}
2019-09-30 15:30:46 +03:00
}
}
txSleep(10);
}
2019-09-23 15:35:44 +03:00
}
2019-10-12 17:06:30 +03:00