Last active
January 9, 2021 21:04
-
-
Save dromanov/1522d6fe763b081c8b5bc25db3c2eced to your computer and use it in GitHub Desktop.
Mario - 01. Исходный код игры Марио (форматирование моё).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SFML/Graphics.hpp> | |
#include <SFML/Audio.hpp> | |
using namespace sf; | |
float offsetX = 0, | |
offsetY = 0; | |
const int H = 17; | |
const int W = 150; | |
String TileMap[H] = { | |
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", | |
"0 0", | |
"0 w 0", | |
"0 w w w 0", | |
"0 w kk 0", | |
"0 k k k k 0", | |
"0 c k kkk kkk w 0", | |
"0 r k k k 0", | |
"0 rr k k 0", | |
"0 rrr kk 0", | |
"0 c kckck rrrr 0", | |
"0 t0 rrrrr 0", | |
"0G 00 t0 rrrrrr G 0", | |
"0 d g d 00 00 rrrrrrr 0", | |
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", | |
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", | |
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", | |
}; | |
class PLAYER | |
{ | |
public: | |
float dx, dy; | |
FloatRect rect; | |
bool onGround; | |
Sprite sprite; | |
float currentFrame; | |
PLAYER(Texture &image) | |
{ | |
sprite.setTexture(image); | |
rect = FloatRect(100, 180, 16, 16); | |
dx = dy = 0.1; | |
currentFrame = 0; | |
} | |
void update(float time) | |
{ | |
rect.left += dx * time; | |
Collision(0); | |
if (!onGround) dy += 0.0005*time; | |
rect.top += dy*time; | |
onGround = false; | |
Collision(1); | |
currentFrame += time * 0.005; | |
if (currentFrame > 3) currentFrame -= 3; | |
if (dx > 0) sprite.setTextureRect(IntRect(112+31*int(currentFrame), 144, 16, 16)); | |
if (dx < 0) sprite.setTextureRect(IntRect(112+31*int(currentFrame)+16, 144, -16, 16)); | |
sprite.setPosition(rect.left - offsetX, rect.top - offsetY); | |
dx = 0; | |
} | |
void Collision(int num) | |
{ | |
for (int i = rect.top/16 ; i < (rect.top + rect.height)/16 ; i++) | |
for (int j = rect.left/16 ; j < (rect.left + rect.width)/16 ; j++) { | |
if ((TileMap[i][j]=='P') || (TileMap[i][j]=='k') || | |
(TileMap[i][j]=='0') || (TileMap[i][j]=='r') || | |
(TileMap[i][j]=='t')) { | |
if (dy > 0 && num == 1) { rect.top = i*16 - rect.height; dy = 0; onGround = true; } | |
if (dy < 0 && num == 1) { rect.top = i*16 + 16; dy = 0; } | |
if (dx > 0 && num == 0) { rect.left = j*16 - rect.width; } | |
if (dx < 0 && num == 0) { rect.left = j*16 + 16; } | |
} | |
if (TileMap[i][j]=='c') { | |
// TileMap[i][j]=' '; | |
} | |
} | |
} | |
}; | |
class ENEMY | |
{ | |
public: | |
float dx, dy; | |
FloatRect rect; | |
Sprite sprite; | |
float currentFrame; | |
bool life; | |
void set(Texture& image, int x, int y) | |
{ | |
sprite.setTexture(image); | |
rect = FloatRect(x, y, 16, 16); | |
dx = 0.05; | |
currentFrame = 0; | |
life = true; | |
} | |
void update(float time) | |
{ | |
rect.left += dx * time; | |
Collision(); | |
currentFrame += time * 0.005; | |
if (currentFrame > 2) currentFrame -= 2; | |
sprite.setTextureRect(IntRect(18*int(currentFrame), 0, 16,16)); | |
if (!life) sprite.setTextureRect(IntRect(58, 0, 16,16)); | |
sprite.setPosition(rect.left - offsetX, rect.top - offsetY); | |
} | |
void Collision() | |
{ | |
for (int i = rect.top/16 ; i < (rect.top + rect.height)/16 ; i++) | |
for (int j = rect.left/16 ; j < (rect.left + rect.width)/16 ; j++) { | |
if ((TileMap[i][j]=='P') || (TileMap[i][j]=='0')) { | |
if (dx > 0) { rect.left = j*16 - rect.width; dx *= -1; } | |
else if (dx < 0) { rect.left = j*16 + 16; dx *= -1; } | |
} | |
} | |
} | |
}; | |
int main() | |
{ | |
RenderWindow window(VideoMode(400, 250), "SFML works!"); | |
Texture tileSet; | |
tileSet.loadFromFile("Mario_Tileset.png"); | |
PLAYER Mario(tileSet); | |
ENEMY enemy; | |
enemy.set(tileSet, 48*16, 13*16); | |
Sprite tile(tileSet); | |
SoundBuffer buffer; | |
buffer.loadFromFile("Jump.ogg"); | |
Sound sound(buffer); | |
Music music; | |
music.openFromFile("Mario_Theme.ogg"); | |
music.play(); | |
Clock clock; | |
while (window.isOpen()) { | |
float time = clock.getElapsedTime().asMicroseconds(); | |
clock.restart(); | |
time = time/500; // здесь регулируем скорость игры | |
if (time > 20) { | |
time = 20; | |
} | |
Event event; | |
while (window.pollEvent(event)) { | |
if (event.type == Event::Closed) | |
window.close(); | |
} | |
if (Keyboard::isKeyPressed(Keyboard::Left)) Mario.dx = -0.1; | |
if (Keyboard::isKeyPressed(Keyboard::Right)) Mario.dx = +0.1; | |
if (Keyboard::isKeyPressed(Keyboard::Up)) { | |
if (Mario.onGround) { | |
Mario.dy = -0.27; | |
Mario.onGround = false; | |
sound.play(); | |
} | |
} | |
Mario.update(time); | |
enemy.update(time); | |
if (Mario.rect.intersects(enemy.rect)) { | |
if (enemy.life) { | |
if (Mario.dy > 0) { | |
Mario.dy = -0.2; | |
enemy.dx = 0; | |
enemy.life = false; | |
} else { | |
Mario.sprite.setColor(Color::Red); | |
} | |
} | |
} | |
if (Mario.rect.left > 200) { | |
offsetX = Mario.rect.left - 200; //смещение | |
} | |
window.clear(Color(107,140,255)); | |
for (int i = 0 ; i < H ; i++) | |
for (int j = 0 ; j < W ; j++) { | |
if (TileMap[i][j] == 'P') tile.setTextureRect(IntRect(143-16*3, 112, 16, 16)); | |
if (TileMap[i][j] == 'k') tile.setTextureRect(IntRect(143, 112, 16, 16)); | |
if (TileMap[i][j] == 'c') tile.setTextureRect(IntRect(143-16, 112, 16, 16)); | |
if (TileMap[i][j] == 't') tile.setTextureRect(IntRect(0, 47, 32, 95-47)); | |
if (TileMap[i][j] == 'g') tile.setTextureRect(IntRect(0, 16*9-5, 3*16, 16*2+5)); | |
if (TileMap[i][j] == 'G') tile.setTextureRect(IntRect(145, 222, 222-145, 255-222)); | |
if (TileMap[i][j] == 'd') tile.setTextureRect(IntRect(0, 106, 74, 127-106)); | |
if (TileMap[i][j] == 'w') tile.setTextureRect(IntRect(99, 224, 140-99, 255-224)); | |
if (TileMap[i][j] == 'r') tile.setTextureRect(IntRect(143-32, 112, 16, 16)); | |
if ((TileMap[i][j] == ' ') || (TileMap[i][j] == '0')) continue; | |
tile.setPosition(j*16 - offsetX, i*16 - offsetY); | |
window.draw(tile); | |
} | |
window.draw(Mario.sprite); | |
window.draw(enemy.sprite); | |
window.display(); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment