-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Type of issue
Typo
Description
[Ente// main.cpp
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include
#include
#include
// Utility
float length(const sf::Vector2f &v){ return std::sqrt(v.xv.x + v.yv.y); }
sf::Vector2f normalize(const sf::Vector2f &v){
float l = length(v);
if(l==0) return {0,0};
return {v.x/l, v.y/l};
}
struct Entity {
sf::Sprite sprite;
sf::Vector2f velocity;
bool active = true;
virtual void update(float dt) { sprite.move(velocity * dt); }
virtual ~Entity() = default;
};
struct MovingPathEntity : Entity {
std::vectorsf::Vector2f path;
int cur = 0;
float speed = 100.f;
void update(float dt) override {
if(path.empty()) { Entity::update(dt); return; }
sf::Vector2f pos = sprite.getPosition();
sf::Vector2f target = path[cur];
sf::Vector2f dir = target - pos;
float dist = length(dir);
if(dist < 5.0f) {
cur = (cur + 1) % path.size();
} else {
sf::Vector2f mv = normalize(dir) * speed * dt;
sprite.move(mv);
}
}
};
struct Police : Entity {
float speed = 180.f;
void update(float dt) override {
sprite.move(velocity * dt);
}
void chase(const sf::Vector2f& target, float dt) {
sf::Vector2f pos = sprite.getPosition();
sf::Vector2f dir = normalize(target - pos);
velocity = dir * speed;
update(dt);
}
};
int main(){
// Window & view (zoomable if map large)
sf::RenderWindow window(sf::VideoMode(1280, 720), "OpenMap Car Prototype - Jharkhand Demo");
window.setFramerateLimit(60);
// Load textures (place your files in executable folder)
sf::Texture texMap, texCar, texTaxi, texTrain, texHeli, texPolice;
if(!texMap.loadFromFile("jharkhand_map.png")) {
// fallback: plain color if map missing
sf::Image img; img.create(2000, 1500, sf::Color(80,150,80));
texMap.loadFromImage(img);
}
if(!texCar.loadFromFile("car.png")) { sf::Image i; i.create(60,30, sf::Color::Red); texCar.loadFromImage(i); }
if(!texTaxi.loadFromFile("taxi.png")){ sf::Image i; i.create(50,30, sf::Color(255,200,0)); texTaxi.loadFromImage(i); }
if(!texTrain.loadFromFile("train.png")){ sf::Image i; i.create(120,40, sf::Color(100,100,100)); texTrain.loadFromImage(i); }
if(!texHeli.loadFromFile("heli.png")){ sf::Image i; i.create(80,40, sf::Color::Cyan); texHeli.loadFromImage(i); }
if(!texPolice.loadFromFile("police.png")){ sf::Image i; i.create(60,30, sf::Color::Blue); texPolice.loadFromImage(i); }
// Map sprite
sf::Sprite mapSprite(texMap);
// Position map so centre is visible (adjust as per image)
mapSprite.setPosition(0,0);
// Camera / view
sf::View view(sf::FloatRect(0,0,1280,720));
// Player (Joseph) setup
Entity player;
player.sprite.setTexture(texCar);
player.sprite.setOrigin(texCar.getSize().x/2.f, texCar.getSize().y/2.f);
player.sprite.setPosition(800, 600); // start (tweak)
float playerSpeed = 0.f;
float playerMaxSpeed = 400.f;
float accel = 600.f;
float decel = 500.f;
float steerSpeed = 120.f; // degrees per sec
// Taxi (path)
MovingPathEntity taxi;
taxi.sprite.setTexture(texTaxi);
taxi.sprite.setOrigin(texTaxi.getSize().x/2.f, texTaxi.getSize().y/2.f);
taxi.path = { {300,400}, {800,400}, {1200,500}, {300,400} };
taxi.sprite.setPosition(taxi.path[0]);
// Train (path)
MovingPathEntity train;
train.sprite.setTexture(texTrain);
train.sprite.setOrigin(texTrain.getSize().x/2.f, texTrain.getSize().y/2.f);
train.path = { {50,1100}, {1800,1100} }; // back-and-forth
train.speed = 220.f;
train.sprite.setPosition(train.path[0]);
// Helicopter
MovingPathEntity heli;
heli.sprite.setTexture(texHeli);
heli.sprite.setOrigin(texHeli.getSize().x/2.f, texHeli.getSize().y/2.f);
heli.path = { {400,150}, {1100,150}, {1400,250}, {400,150} };
heli.speed = 140.f;
heli.sprite.setPosition(heli.path[0]);
// Police
Police police;
police.sprite.setTexture(texPolice);
police.sprite.setOrigin(texPolice.getSize().x/2.f, texPolice.getSize().y/2.f);
police.sprite.setPosition(1000, 400);
// Basic HUD font
sf::Font font;
font.loadFromFile("arial.ttf"); // optional, if missing - SFML fallback not included
sf::Text hud; hud.setFont(font); hud.setCharacterSize(18);
hud.setFillColor(sf::Color::White);
hud.setPosition(10,10);
// Clock
sf::Clock clock;
while(window.isOpen()){
float dt = clock.restart().asSeconds();
sf::Event ev;
while(window.pollEvent(ev)){
if(ev.type == sf::Event::Closed) window.close();
if(ev.type == sf::Event::KeyPressed && ev.key.code == sf::Keyboard::Escape) window.close();
}
// Player input - simple arcade physics
bool up = sf::Keyboard::isKeyPressed(sf::Keyboard::W) || sf::Keyboard::isKeyPressed(sf::Keyboard::Up);
bool down = sf::Keyboard::isKeyPressed(sf::Keyboard::S) || sf::Keyboard::isKeyPressed(sf::Keyboard::Down);
bool left = sf::Keyboard::isKeyPressed(sf::Keyboard::A) || sf::Keyboard::isKeyPressed(sf::Keyboard::Left);
bool right = sf::Keyboard::isKeyPressed(sf::Keyboard::D) || sf::Keyboard::isKeyPressed(sf::Keyboard::Right);
// Heading is rotation
float rotation = player.sprite.getRotation();
if(up) playerSpeed += accel * dt;
else playerSpeed -= decel * dt * 0.5f;
if(down) playerSpeed -= accel * dt * 0.8f;
if(left) player.sprite.rotate(-steerSpeed * dt * (playerSpeed / playerMaxSpeed + 0.2f));
if(right) player.sprite.rotate(steerSpeed * dt * (playerSpeed / playerMaxSpeed + 0.2f));
// clamp speed
if(playerSpeed > playerMaxSpeed) playerSpeed = playerMaxSpeed;
if(playerSpeed < -150.f) playerSpeed = -150.f;
if(std::abs(playerSpeed) < 1.f && !up && !down) playerSpeed = 0.f;
// update player movement
float rad = player.sprite.getRotation() * 3.14159265f / 180.f;
sf::Vector2f forward(std::cos(rad), std::sin(rad));
player.velocity = forward * playerSpeed;
player.update(dt);
// Update other entities
taxi.update(dt);
// train: ping-pong
static bool trainForward = true;
sf::Vector2f tpos = train.sprite.getPosition();
sf::Vector2f tTarget = train.path[ train.cur ];
// train.update handles movement along path already
train.update(dt);
heli.update(dt);
// Police basic chase
police.chase(player.sprite.getPosition(), dt);
// Update camera to follow player
view.setCenter(player.sprite.getPosition());
window.setView(view);
// HUD
hud.setString("Controls: W/A/S/D or Arrows - Drive\nPlayer Pos: (" +
std::to_string((int)player.sprite.getPosition().x) + "," + std::to_string((int)player.sprite.getPosition().y) + ")\nSpeed: " + std::to_string((int)playerSpeed));
// Render
window.clear(sf::Color::Black);
window.draw(mapSprite); // map (big)
window.draw(taxi.sprite);
window.draw(train.sprite);
window.draw(heli.sprite);
window.draw(player.sprite);
window.draw(police.sprite);
// HUD render in screen coords => set default view
window.setView(window.getDefaultView());
window.draw(hud);
window.display();
// back to world view for next frame
window.setView(view);
}
return 0;
}r feedback here]
Page URL
Content source URL
Document Version Independent Id
bf78e217-b874-ee3f-9e70-c232989681bf
Platform Id
235b1e4c-6230-4e67-2d27-ae7e4e2f2366