O
O
OlgakRain2020-12-02 21:30:42
C++ / C#
OlgakRain, 2020-12-02 21:30:42

Why does it throw a string out of range error?

Hello, please help me to fix the code so that it does not give the error string out of range.

#include <SFML/Graphics.hpp>
#include <string>
using namespace sf;
using namespace std;

int ground = 220;
const int positionToDraw = 621;
const int HEIGHT = 16;
const int WIDTH = 10;
string mapOne[HEIGHT] = {
    "##########",
    "#        #",
    "#   Q    #",
    "#  QO    #",
    "#    Z ZQ#",
    "#    O   #",
    "#    O   #",
    "#QQQQOQ Q#",
    "#        #",
    "#        #",
    "#QQQQ QQ #",
    "#        #",
    "#    Z   #",
    "#    XZ Q#",
    "#Q QQQQQO#",
    "##########"
};
string charSt;

class PLAYER {
public:
  float dx, dy;
  FloatRect rect;
  bool onGround = 1;
  Sprite player;
  float currentFrame;

  PLAYER(Texture& image) {
    player.setTexture(image);
    player.setTextureRect(IntRect(0, 0, 46, 26));
    rect = FloatRect(965, 0, 46, 26);
    dx = dy = 0;
    currentFrame = 0;
  }

  void Collision(int direction) {
    for (int i = rect.top / 67; i < (rect.top + rect.height) / 67; i++) {
      for (int j = rect.left / 67; j < (rect.left + rect.width) / 67; j++) {
        charSt.assign(mapOne[i], j, 1);
        if ((charSt == "#") || (charSt == "Q") || (charSt == "O")
          || (charSt == "Z") || (charSt == "X")) {
          if ((dx > 0) && (direction == 0)) {
            rect.left = j * 67 - rect.width;
          }
          if ((dx < 0) && (direction == 0)) {
            rect.left = j * 67 + 67;
          }
          if ((dy > 0) && (direction == 1)) {
            rect.top = i * 67 - rect.height;
            dy = 0;
            onGround = 1;
          }
          if ((dy < 0) && (direction == 1)) {
            rect.top = i * 67 + 67;
            dy = 0;
          }
        }
      }
    }
  }

  void update(float time) {
    rect.left += dx * time;
    Collision(0);
    if (!onGround) {
      dy = dy + 0.05 * time;
    }
    rect.top += dy * time;
    onGround = 0;
    Collision(1);
    currentFrame += 0.05 * time;
    if (currentFrame > 15) {
      currentFrame -= 15;
    }
    if (dx > 0) {
      player.setTextureRect(IntRect(46 * int(currentFrame) + 46, 0, -46, 26));
    }
    if (dx < 0) {
      player.setTextureRect(IntRect(46 * int(currentFrame), 0, 46, 26));
    }
    player.setPosition(rect.left, rect.top);

    dx = 0;
  }	
};

int main() {
  RenderWindow window(VideoMode(1920, 1080), "Lemmings",Style::None);

  Texture levelBackground, borderBlock, noChangeBlock,
    noChangeBlockTop, changeBlock, changeBlockTop, gridTexture;
  levelBackground.loadFromFile("sprites/levelBackground.png");
  borderBlock.loadFromFile("sprites/borderBlock.png");
  noChangeBlock.loadFromFile("sprites/noChangeBlock.png");
  noChangeBlockTop.loadFromFile("sprites/noChangeBlockTop.png");
  changeBlock.loadFromFile("sprites/changeBlock.png");
  changeBlockTop.loadFromFile("sprites/changeBlockTop.png");
  gridTexture.loadFromFile("sprites/grid.png");
  Sprite level, block, grid;
  level.setTexture(levelBackground);
  level.setPosition(56 + positionToDraw, 56);
  grid.setTexture(gridTexture);
  grid.setPosition(-4, -3);

  float currentFrame = 0;

  Texture movePlayer;
  movePlayer.loadFromFile("sprites/movePlayer.png");

  PLAYER player(movePlayer);

  Clock clock;

  while (window.isOpen()) {
    float time = clock.getElapsedTime().asMicroseconds();
    clock.restart();
    time = time / 10000;

    Event event;
    while (window.pollEvent(event)) {
      if (Keyboard::isKeyPressed(Keyboard::Escape)) {
        window.clear();
        window.close();
      }
    }
    if (Keyboard::isKeyPressed(Keyboard::A)) {
      player.dx = -2;///////////////////////////////////////////////////-0.2			
    }
    if (Keyboard::isKeyPressed(Keyboard::D)) {
      player.dx = 2;////////////////////////////////////////////////////0.2
    }
    player.update(time);
    window.clear();
    window.draw(level);
    window.draw(grid);

    for (int i = 0; i < HEIGHT; i++) {
      for (int j = 0; j < WIDTH; j++) {
        charSt.assign(mapOne[i], j, 1);
        if (charSt == "#") {
          block.setTexture(borderBlock);
        }
        if (charSt == "Q") {
          block.setTexture(changeBlockTop);
        }
        if (charSt == "O") {
          block.setTexture(changeBlock);
        }
        if (charSt == "X") {
          block.setTexture(noChangeBlock);
        }
        if (charSt == "Z") {
          block.setTexture(noChangeBlockTop);
        }
        if (charSt == " ") {
          continue;
        }
        block.setPosition(j * 67 + positionToDraw, i * 67);
        window.draw(block);
      }
    }
    window.draw(player.player);
    window.display();		
  }
  return 0;
}

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question