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; }
pake10 kirjoitti:
Koodaan C:llä
Noinkohan. Hyvä lähtökohta on yleensä ensin selvittää, mitä kieltä käyttää.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.