Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SFML ja hiiren käsittely

pake10 [06.03.2011 10:54:25]

#

Koodaan C:llä ja olen yrittänyt tehdä harjoitukseksi SFML-ohjelmaa, jossa ruudulla on laatikko ja kun hiiren vie sen päälle, se menee satunnaiseen paikkaan. Laatikko kyllä piirtyy ruudulle, mutta kun hiiren vie sen päälle, ei tapahdu mitään. Uskoisin, että vika on while-loopeissa kun esimerkiksi ohjelma ei edes sammunut X-napista. Olen siis ihan aloittelija SFML:ssä, aloitin sen vasta eilen.

#include <SFML/Graphics.hpp>
#include <time.h>
#include <stdio.h>

int main()
{

    sf::RenderWindow wnd(sf::VideoMode(500, 500),"Test");
    int box_w = 40;
    int box_h = 40;

    int box_x = rand() % 500 + 1;
    int box_y = rand() % 500 + 1;

    sf::Shape Rect = sf::Shape::Rectangle(box_x, box_y, box_x + box_w, box_y + box_h, sf::Color::White);

    while(wnd.IsOpened())
    {
        sf::Event evt;
        while(wnd.GetEvent(evt))
        {
            if(evt.Type == sf::Event::Closed) {
                wnd.Close();
            }

            if(evt.Type == sf::Event::MouseMoved) { // jos hiiri on liikkunut,
                if(evt.MouseMove.X > box_x and evt.MouseMove.X < (box_x + box_w)) { //tarkistetaan, onko se laatikon päällä
                    if(evt.MouseMove.Y > box_y and evt.MouseMove.Y < (box_y + box_h)) {
                        int old_x = box_x;
                        int old_y = box_y;

                        while(box_x == old_x and box_y == old_y) { // arvotaan sijaintia niin kauan, että numero ei ole sama kuin edellinen
                            int box_x = rand() % 500 + 1;
                            int box_y = rand() % 500 + 1;
                        }


                    }
                }
            }

        }
        wnd.Clear(); // tyhjennetään näyttö

        Rect.Move(box_x, box_y); // siirretään laatikko
        wnd.Draw(Rect); // piirretään laatikko
        wnd.Display();
        }

        return 0;
}

eq [06.03.2011 14:01:39]

#

pake10 kirjoitti:

Koodaan C:llä

Noinkohan. Hyvä lähtökohta on yleensä ensin selvittää, mitä kieltä käyttää.

Metabolix [06.03.2011 14:04:10]

#

Kun arvot uuden sijainnin, luot uudet muuttujat box_x ja box_y. Koodissasi tapahtuu siis itse asiassa näin:

while (box_x == old_x and box_y == old_y) {
    int aivan_turha_valiaikainen_muuttuja_1 = rand() % 500 + 1;
    int aivan_turha_valiaikainen_muuttuja_2 = rand() % 500 + 1;
}

Koodisi jumittuu loputtomasti tähän silmukkaan.

Toinen virhe on, että Rect.Move liikuttaa laatikkoa tietyn verran; sinulle oikeampi olisi SetPosition, joka siirtää sen juuri tiettyyn kohtaan.

Kolmas virhe taitaa olla laatikon sijoittelussa: käsittääkseni laatikon kiintopisteen sijainti on aluksi (0, 0), luonnin yhteydessä määritellyt box_x ja box_y vaikuttavat vain piirtokohtaan. Sinun pitäisi käyttää laatikon luonnissa kulman sijaintina pistettä (0, 0) ja siirtää se sitten SetPosition-funktiolla haluamaasi aloituskohtaan.

pake10 [06.03.2011 17:18:59]

#

Kiitos, Metabolix, kovasti avusta, sain muuten toimimaan, mutta hiiren paikan tunnistus ei oikein toimi ja laatikko muuttaa kokoa aina välillä.

Kokeilen joskus uudestaan kun tulee uudestaan innostusta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta