fizik

entry256 galeri video3
    256.
  1. aşağıdaki programda zeminin kütleçekim değeriyle, mavi küpün ağırlığı, zıplama hızı, yatay hareket hızı, a, d tuşlarının uyguladığı kuvvetle küpün kazanacağı hız dahil tüm fizik değişkenlerini dilediğiniz gibi değiştirebilir ve eğik atış simülasyonunun tadını çıkarabilirsiniz. fizik ödevleri için de kullanılabilir:

    #include <SFML/Graphics.hpp> // SFML grafik kütüphanesini dahil et
    #include <cmath> // Matematik fonksiyonları için gerekli kütüphane
    #include <sstream> // String akışları için gerekli kütüphane

    // Sabitler
    const float GRAVITY = 681.0f; // Yerçekimi ivmesi (N)
    const float JUMP_SPEED = 400.0f; // Atlama hızı (m/s)
    const float MOVE_SPEED = 300.0f; // Yatay hareket hızı (m/s)
    const float BOOST_MULTIPLIER = 1.5f; // Hız artışı çarpanı
    const float DOUBLE_JUMP_MULTIPLIER = 1.5f; // ikili atlama hız çarpanı
    const float FLOOR_Y = 540.0f; // Zemin seviyesi (Y-koordinatı)
    const float WINDOW_WIDTH = 1920.0f; // Pencere genişliği
    const float WINDOW_HEIGHT = 1080.0f; // Pencere yüksekliği
    const float AIR_DRAG_COEFFICIENT = 0.1f; // Hava sürüklenme katsayısı (yatay hız üzerinde etkili)

    // Mavi kare ağırlığı
    const float BLUE_SQUARE_WEIGHT = 50.0f; // Ağırlık (kg)

    // Hızlandırma için sabitler
    const float ADDITIONAL_SPEED_WHEN_SPACE_PRESSED = 150.0f; // Boşluk tuşuna basıldığında kazanılacak hız
    const float ADDITIONAL_SPEED_A = 100.0f; // A tuşuna basıldığında kazanılacak hız
    const float ADDITIONAL_SPEED_D = 100.0f; // D tuşuna basıldığında kazanılacak hız

    int main()
    {
    // Pencereyi oluştur
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "2D-EGIK ATIS HAREKETI");

    // Yazı tipi yükle
    sf::Font font;
    if (!font.loadFromFile("/home/kratertepesi/Masaüstü/Programlar/arial.ttf")) {
    return -1; // Yazı tipi yüklenemezse programı kapat
    }

    // Başlık metni oluştur
    sf::Text titleText("2D-EGIK ATIS HAREKETI", font, 50);
    titleText.setFillColor(sf::Color::White); // Başlık rengini beyaz yap
    titleText.setPosition(WINDOW_WIDTH / 2 - titleText.getGlobalBounds().width / 2, 10); // Başlık konumunu ayarla

    // Mavi kare oluştur
    sf::RectangleShape blueSquare(sf::Vector2f(50.0f, 50.0f));
    blueSquare.setFillColor(sf::Color::Blue); // Mavi kare rengini mavi yap
    blueSquare.setPosition(960, FLOOR_Y); // Mavi karenin başlangıç konumunu ayarla

    // Zemin oluştur
    sf::RectangleShape ground(sf::Vector2f(WINDOW_WIDTH, WINDOW_HEIGHT - (FLOOR_Y + blueSquare.getSize().y)));
    ground.setFillColor(sf::Color::Green); // Zemin rengini yeşil yap
    ground.setPosition(0, FLOOR_Y + blueSquare.getSize().y); // Zemin konumunu ayarla

    // Gökyüzü oluştur
    sf::RectangleShape sky(sf::Vector2f(WINDOW_WIDTH, FLOOR_Y - blueSquare.getSize().y)); // Gökyüzü boyutu, karenin bir kenarı kadar aşağı kaydırıldı
    sky.setFillColor(sf::Color(135, 206, 235)); // Gökyüzü rengini ayarla

    // Durum değişkenleri
    bool jumping = false; // Atlama durumu
    bool onGround = true; // Zemin üzerindeyken
    bool doubleJumpReady = false; // ikili atlama hazır durumu
    float xVelocity = 0.0f; // Yatay hız
    float yVelocity = 0.0f; // Dikey hız

    sf::Clock clock; // Zamanlayıcı oluştur
    sf::Text angleText, forceText; // Açı ve kuvvet metni için değişkenler
    angleText.setFont(font); // Yazı tipini ayarla
    angleText.setCharacterSize(24); // Yazı boyutunu ayarla
    angleText.setFillColor(sf::Color::White); // Yazı rengini beyaz yap
    forceText.setFont(font); // Yazı tipini ayarla
    forceText.setCharacterSize(24); // Yazı boyutunu ayarla
    forceText.setFillColor(sf::Color::White); // Yazı rengini beyaz yap

    while (window.isOpen()) // Pencere açık olduğu sürece
    {
    sf::Event event;
    while (window.pollEvent(event)) // Olayları kontrol et
    {
    if (event.type == sf::Event::Closed) // Pencere kapatıldıysa
    window.close(); // Pencereyi kapat
    }

    float dt = clock.restart().asSeconds(); // Delta zamanını hesapla

    float currentMoveSpeed = MOVE_SPEED; // Geçerli hareket hızını ayarla
    float currentJumpSpeed = JUMP_SPEED; // Geçerli atlama hızını ayarla
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) // Boşluk tuşuna basılmışsa
    {
    currentMoveSpeed += ADDITIONAL_SPEED_WHEN_SPACE_PRESSED; // Hız artışını uygula
    currentJumpSpeed *= BOOST_MULTIPLIER; // Atlama hızını artır
    }

    // Yatay hareket kontrolü
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) // A tuşuna basılmışsa
    {
    xVelocity = -currentMoveSpeed - ADDITIONAL_SPEED_A; // Sola hareket et
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) // D tuşuna basılmışsa
    {
    xVelocity = currentMoveSpeed + ADDITIONAL_SPEED_D; // Sağa hareket et
    }
    else
    {
    xVelocity = 0.0f; // Hiçbir tuşa basılmıyorsa yatay hızı sıfırla
    }

    // Hava sürüklenmesini uygula
    xVelocity -= AIR_DRAG_COEFFICIENT * xVelocity; // Basit sürüklenme formülü

    // Atlama kontrolü
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && onGround) // W tuşuna ve yerdeyse
    {
    jumping = true; // Atlama gerçekleşiyor
    onGround = false; // Artık yerden yüksekte
    yVelocity = -currentJumpSpeed; // Dikey hız ayarla
    doubleJumpReady = true; // ikili atlama hazır
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && doubleJumpReady) // W tuşuna basılmışsa ve ikili atlama hazırsa
    {
    yVelocity = -currentJumpSpeed * DOUBLE_JUMP_MULTIPLIER; // ikili atlama için hızı artır
    doubleJumpReady = false; // ikili atlama kullanılmadı
    }

    if (!onGround) // Eğer yerden yüksekteyse
    {
    yVelocity += GRAVITY * dt; // Dikey hıza yerçekimini ekle
    }

    blueSquare.move(xVelocity * dt, yVelocity * dt); // Mavi karenin konumunu güncelle

    float angle = atan2(-yVelocity, xVelocity) * 180 / 3.14159; // Açıyı hesapla
    float force = (BLUE_SQUARE_WEIGHT * yVelocity); // Ağırlığı hesaba kat

    // Açı ve kuvvet metni oluştur
    std::stringstream angleStream, forceStream;
    angleStream << "Angle: " << angle << " degrees"; // Açı metnini oluştur
    forceStream << "Force: " << force << " N"; // Kuvvet metnini oluştur

    angleText.setString(angleStream.str()); // Açı metnini ayarla
    forceText.setString(forceStream.str()); // Kuvvet metnini ayarla
    angleText.setPosition(10, 10); // Açı metninin konumunu ayarla
    forceText.setPosition(10, 40); // Kuvvet metninin konumunu ayarla

    // Yerde olup olmadığını kontrol et
    if (blueSquare.getPosition().y >= FLOOR_Y)
    {
    blueSquare.setPosition(blueSquare.getPosition().x, FLOOR_Y); // Mavi karenin zemin konumunu ayarla
    yVelocity = 0.0f; // Dikey hızı sıfırla
    onGround = true; // Yerde olduğunu belirt
    doubleJumpReady = false; // ikili atlama hazır değil
    }

    // Pencereyi temizle ve gökyüzünü, zemin ve mavi kareyi çiz
    window.clear();
    window.draw(sky); // Gökyüzünü çiz
    window.draw(ground); // Zeminini çiz
    window.draw(blueSquare); // Mavi kareyi çiz
    window.draw(titleText); // Başlık metnini çiz
    window.draw(angleText); // Açı metnini çiz
    window.draw(forceText); // Kuvvet metnini çiz
    window.display(); // Pencereyi güncelle
    }

    return 0; // Program başarıyla tamamlandı
    }
    0 ...