Witam!
Niedawno wziąłem się wreszcie za bibliotekę SFML i w ramach utrwalenia zdobytej wiedzy w praktyce, zacząłem pisać grę mojego pomysłu, którą kiedyś zrobiłem jeszcze w konsoli.
Ogólne założenia gry są takie:
- gracz zdobywa punkty, których położenie jest losowe
- z każdym zdobytym punktem w losowym miejscu pojawia się blok
- gdy gracz "zderzy się" z blokiem, oznacza to koniec gry
Właśnie jestem teraz na etapie ogarniania jak ma się zachowywać punkt no i mam problem z jego losowym położeniem.
Mianowicie w również losowym momencie współrzędne punktu zostają źle wylosowane i nie zgadzają się ze współrzędnymi żadnego kwadrata (które tworzą planszę), przez co punkt nie zostaje w ogóle wyświetlony.
A oto kod:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <time.h>
int res_width = 32*20;
int res_height = 32*20;
int n = 0;
int player1_posX = 320;
int player1_posY = 320;
int score = 0;
std::string score_str;
std::ostringstream ss;
char player1_direction = ' ';
int player1_moveX = 0;
int player1_moveY = 0;
float player1_speed = 150;
int point_posX = 160;
int point_posY = 160;
int point_pos_randN = 0;
int main()
{
srand(time(NULL));
sf::RenderWindow window(sf::VideoMode(res_width, res_height), "Blocker");
sf::Image icon;
icon.loadFromFile("icon.png");
window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
point_posX = rand()%19+0;
for(int i = 0; i < 19; i++)
{
if(point_posX == i)
point_posX = point_pos_randN;
point_pos_randN += 32;
}
point_pos_randN = 0;
point_posY = rand()%18+0;
for(int i = 0; i < 18; i++)
{
if(point_posY == i)
point_posY = point_pos_randN;
point_pos_randN += 32;
}
point_pos_randN = 0;
sf::Clock player1_move_deltaClock;
sf::Time player1_move_timer;
sf::Font font;
font.loadFromFile("Fonts/Renner_ 400 Book.ttf");
sf::Text score_txt;
score_txt.setCharacterSize(26);
score_txt.setFont(font);
score_txt.setFillColor(sf::Color::White);
score_txt.setPosition(0, 0);
ss << score;
score_str = ss.str();
score_txt.setString("Score: "+score_str);
ss.str(" ");
sf::Color player1_color;
player1_color.r = 50;
player1_color.g = 188;
player1_color.b = 45;
sf::Color point_color;
point_color.r = 255;
point_color.g = 255;
point_color.b = 96;
sf::Color board_color;
board_color.r = 60;
board_color.g = 60;
board_color.b = 60;
sf::Color bg_color;
bg_color.r = 40;
bg_color.g = 40;
bg_color.b = 40;
sf::RectangleShape board[450];
for(int i = 0; i <= 20; i++)
for(int j = 0; j <= 20; j++)
{
board[n].setSize(sf::Vector2f(30, 30));
board[n].setFillColor(board_color);
board[n].setOutlineThickness(1);
board[n].setOutlineColor(sf::Color::White);
board[n].setPosition(i*32, j*32);
if(board[n].getPosition().y == 0)
board[n].setPosition(10000, 10000);
n++;
}
while(window.isOpen())
{
sf::Event event;
while(window.pollEvent(event))
{
if(event.type == sf::Event::Closed)
window.close();
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
window.close();
if(event.type == sf::Event::Resized)
window.setSize(sf::Vector2u(res_width, res_height));
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W)
{
player1_direction = 'u';
player1_moveY = -32;
player1_moveX = 0;
}
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S)
{
player1_direction = 'd';
player1_moveY = 32;
player1_moveX = 0;
}
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::D)
{
player1_direction = 'r';
player1_moveX = 32;
player1_moveY = 0;
}
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A)
{
player1_direction = 'l';
player1_moveX = -32;
player1_moveY = 0;
}
}
player1_move_timer += player1_move_deltaClock.restart();
if(player1_move_timer >= sf::milliseconds(player1_speed))
{
player1_move_timer -= sf::milliseconds(player1_speed);
player1_posX += player1_moveX;
if(player1_posX > res_width-32)
player1_posX = 0;
else if(player1_posX < 0)
player1_posX = res_width-32;
player1_posY += player1_moveY;
if(player1_posY < 32)
player1_posY = res_height-32;
else if(player1_posY > res_height-32)
player1_posY = 32;
}
for(int i = 0; i < n; i++)
{
if(board[i].getPosition().x == player1_posX && board[i].getPosition().y == player1_posY)
{
board[i].setFillColor(player1_color);
}
else if(board[i].getPosition().x == point_posX && board[i].getPosition().y == point_posY)
{
board[i].setFillColor(point_color);
}
else if(player1_posX == point_posX && player1_posY == point_posY)
{
point_posX = rand()%19+0;
for(int j = 0; j < 19; j++)
{
if(point_posX == j)
point_posX = point_pos_randN;
point_pos_randN += 32;
}
point_pos_randN = 0;
point_posY = rand()%18+0;
for(int k = 0; k < 18; k++)
{
if(point_posY == k)
point_posY = point_pos_randN;
point_pos_randN += 32;
}
point_pos_randN = 0;
score++;
ss << score;
score_str = ss.str();
score_txt.setString("Score: "+score_str);
ss.str(" ");
}
else
{
board[i].setFillColor(board_color);
}
}
window.clear(bg_color);
for(int i = 0; i < n; i++)
window.draw(board[i]);
window.draw(score_txt);
window.display();
}
return 0;
}