Joo, kysäisisin, että miten saan toimimaan Drag & Dropin tässä Borland C++ Builder 5:sessa. Jos kun mulla on tässä tyhjässä formissa "Image" niin jos menen hiirellä sen päälle ja alan vetämään niin se liikkuu sinne minne haluan ja taas kun lopetan hiirenllä vetämisen niin se jää siihen, johon olen sen jättännyt, mut en ole saannut sitä toimimaan vaikka se kuuluu näihin perus harjoitiksiin.
Ajattelin nääs, alkaa harjoittelemaan vihdoinkin grafiikkan tuomista formille es. pelientekemistä varten. En ole kovin aktiivinen ja harjoitteleva koodari niin siksi pyrintekemään tästä mahdollisimman helpon ja tietysti perusteista lähtien.
En ole vaan löytännyt yhtään Borland C++ Builder:sarjalle sopivaa tutoriaali tai harjoitus sivustoa, joka olisi tämän ohjelmiston kanssa yhteensopiva. Kyllä mä osaan vielä jotenkuten tekstipelin västätä C++:salla tomivaksi vaikka ei kuitenkaan täydellisesti, mut haluais välillä grafiikkaakin. Kun nyt tolla image -komponentilla saa kuvan heti = graffiikka niin otetaan vielä vähän siihen lisä toimintaa, koska sitten voisin väsätä tältä pohjalta jonkin tai muutaman Drag & Drop pohjaisen pelin ja miettiä sitten lisää, kiitos etukäteen vastanneelle.
Luulen että drag & drop tyyppinen peli voi olla aloittelijalle liian hankala. Sinuna lukisin tämän SDL -oppaan, ja sen perusteella tekisin jonkun pienen ohjelman, jossa liikutellaan kuvaa nuolinäppäimillä. Sen jälkeen koodaamaan jotain pientä peliä, kuten tetris, breakout, pong jne.
CoolC++ kirjoitti:
- - ja tietysti perusteista lähtien. - -
jos perusteita kaipaat, voit harkita tuota matpitin mainitsemaa SDL opasta.
mutta jos kuitenkin haluat tietää, niin lähestyisin asiaa näin:
- selvitä objektisi(sen mitä liikuttelet hiirellä) keskipisteen sijainti
- kun hiiren nappula päästetään irti, yksinkertainen if-, switch-case - tai
vastaava lause tarkistaa onko objektisi keskipiste tietyn nelikulmion sisällä
- jos ja kun näin on, ohjelmasi yksinkertaisesti piirtää objektisi(tai sen kuvan..) ennalta määräämääsi paikkaan(joka taas hyvin todennäköisesti on se if lauseessa esiintynyt nelikulmio..)
en tiedä, ymmärsinkö oikein kysymyksesi?
lainaus:
matpit:...
-SDL:llän asennus opas opastaa "ässä oppaassa asennamme SDL:n Visual C++ 6:een, Dev-C++:n versioon 4.9.8.0 ja Linuxiin.", niin kuinka saan asennettua tämän SDL:llän Borland -sarjaan?
Kokeilin laittaa "C:\Program Files\Borland\BDS\4.0\Bin" -hakemistoon, koska siellä oli ainoastaan ohjelman omat -dll -tiedostot ja tämän jälkeen kokeilin ajaa ensimmäisen SDL (Opas 1) -tutoriaalin lähdekoodin ja sitten tuli:
[C++ Error] Unit1.cpp(1): E2209 Unable to open include file 'SDL\SDL.H' [C++ Error] Unit1.cpp(11): E2268 Call to undefined function 'SDL_Init' [C++ Error] Unit1.cpp(11): E2451 Undefined symbol 'SDL_INIT_VIDEO' [C++ Error] Unit1.cpp(13): E2268 Call to undefined function 'fprintf' [C++ Error] Unit1.cpp(13): E2451 Undefined symbol 'stderr' [C++ Error] Unit1.cpp(13): E2268 Call to undefined function 'SDL_GetError' [C++ Error] Unit1.cpp(19): E2451 Undefined symbol 'SDL_Surface' [C++ Error] Unit1.cpp(19): E2451 Undefined symbol 'naytto' [C++ Error] Unit1.cpp(26): E2268 Call to undefined function 'SDL_SetVideoMode' [C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'SDL_HWSURFACE' [C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'SDL_FULLSCREEN' [C++ Error] Unit1.cpp(31): E2268 Call to undefined function 'SDL_Delay' [C++ Error] Unit1.cpp(33): E2268 Call to undefined function 'SDL_Quit'
-Eli ilmeisesti jotakin vikaa tai olen laittannut tiedoston väärään paikkaan. Siis, pelkän tiedoston, siis tämän "http://www.libsdl.org/release/SDL-devel-1.2.7-VC6.zip" -tiedostot.
ByteMan:
Tiedän, että kuvan liikkutaminen borlannissa on niinkin helppoa, mut hiirellä pitäisi tehdä sama, mut en tiedä miten.
öh siis hä?
siis otetaanpa uusiksi. jos sinä siis käytät ohjelmointikieltä nimeltä borlan, niin silloin kuvien liikuttelu on helppoa borlanissa..
sitten toinen. puritko tuon zipin? zippinä ku siit ei oo oikeen hyötyä.
vinkiksi, (jos c++:aa käytät) nii YLEENSÄ kannattaa .h(tai .hpp yms.) -päätteiset laittaa kansioon include, dll tiedostot kansioon lib
seuraavaksi, vaikka en tunnekkaan borlania, voisin sanoa, että kyseessä on IDE eikä kääntäjä. kääntäjäksi veikkaisin g++:aa(HUOM. en tiedä kun en borlania käytä)
mennään eteenpäin: jos haluat käyttää sdl:ää, niin sinun täytyy kirjoittaa lähdetekstitiedoston alkuun
#include <sdl/sdl.h>//huomaa, tuon sdl.h:n täytyy olla hakemistossa SDL, joka taas sijaitsee(yleensä) kansiossa include
liskäksi(kun ikäväkyllä veikkaan että et tiennyt..) sinulla täytyy olla ajettavan ohjelman(.exe:n) kanssa samassa kansiossa SDL.DLL, tai ohjelmasi ei toimi.
vielä vähän nippelitietoa, mitä kuitenkin kysyisit ennemmin tai myöhemmin, saat koodissi kääntymään laittamalla kääntäjälle liput -lSDLmain ja -lSDL
'l' on kirjain L ja ainakin g++:lla tuo pitää olla tuossa järjestyksessä(itse olen tuon karvaasti kokenut ;) )
seuraavaksi varmaan ajattelet että missä nuo liput asetetaan?
projektin asetuksissa kohdassa 'compiler' missä on perässä isohko(mahdiollisesti tyhjä) tekstikenttä.
[C++ Error] Unit1.cpp(1): E2209 Unable to open include file 'SDL\SDL.H'
johtuu btw juuri siitä, että kansiossa include ei ole kansiota SDL, mistä löytyisi tiedosto SDL.H
toivottavasti alkaa toimia ;)
jälkilisäys(PS): jos lukisit tuota SDL opasta sivulta 3, niin huomaisit, että hiiren käsittelykin opetetaan
vinkki: lue hiiren koordinaatit, ja jos ne on sinun drag'n drop objektin sisällä, niin jos painetaan vaikka ykkösnappulaa pohjassa, nii sen drag 'n drop objektin koordinaattei muutetaan yhtäpaljo ku hiirenkoordinaattei
Kyllä mä ne zipistä osaan purkaa ja laitoin kaikki sisällöt juuri noihin paikkoihin, mut ei siitä huolimatta ole alkannut oimia ;(.
Tosin SDL -kansiota ei edes ollut mulla includessa, joten loin sellaisen ja lisäsin sinne kaikki zipin includessa olevat tiedostot sinne ja sitten yritin uudestaan ja tuli:
[C++ Error] SDL_types.h(102): E2021 Array must have at least one element [C++ Warning] Unit1.cpp(31): W8004 'naytto' is assigned a value that is never used
Jotakin vikaa vielä...
no jos tota rupeen suomentaa, ni siin sanotaan että sulla on alustettu taulukko arvolla tyhjä(siis ei niin mitään) ja se ei toimi ilman sitä vähintään yhtä arvoa
siihen en osaa sanoa mitään, ku en oo tosta tiedostotsta(SDL_types.h) ikinä kuullukkaa, sori :(
mutta toi toinen, siin olet rivillä 31 laittanut 'naytto':lle arvon, mitä ei ikinä käytetä, eli sulla siis on joku muuttuja(ilmeisesti näytön tunniste osoite(what ever..)) mitä et ikinä käytä.. ilmeisesti joku koodin esitarkistus estää turhat osoitinvaraukset(kuluttaa muistia.. tai jotain, aika IDE pohjanen ilmeisesti)
paha tosin mennä varmasti sanoo, ku ei tiiä minkä näkönen koodi on..
toivottavasti auttoi taas edes vähän ;)
Käytin tämän ohjelmointi putkan omaa esimerkkiä SDL-opas osa 1
ja koodin pastasin:
#include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot #pragma comment(lib, "SDLmain.lib") // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa, #pragma comment(lib, "SDL.lib") // sinun ei tarvitse lisätä LIB-tiedostoja "käsin" // #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian int main(int argc, char *argv[]) { // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN); // peli tähän :D // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; }
-Tosin tossakin koodi esimerkissäkin ilmenee, että koodi sopii enemmäkseen Visual C++:sarjaan, kun tos koodissakin mainitaan enemmäkseen VBC++:san sopivuudesta, että toimii vain "Visual C++:ssa". Et en tiedä mitä pitäis muuttaa tai poistaa tms.
-Toinen ongelma lienee se, että tässä ohjelmassa, jota käytän niin ei pysty ajamaan suoraan .cpp tai .h tiedostoja, joita taas pystyy toss Visal C++:sassa, joten en tiedä millä tilalla tai projektissa voidaan jaa puhdasta koodia. Voi tosin dos pohjaisia, mut toi koodi ei sovellu taas siihen. Eikä formi projektissakaan ole järkevää ajaa koodia, koska toll formilla ei tee mitään jos ohjelma tehdään pelkästä koodista.
-Tosin tuolla MFC Wizardin tilassa pystyy ajamaan koodia jossa näkyy heti olevan käytössa SDL.h -tiedostojen includeja, mutta kun yritin siinä tilassa ajaa, joka nyt tähän asti vaikuttaa olevan paras ajo paikka, josta poistin alusta koodit ja pastetin ton esimerkin, niin tuli seuraavan lainen error.:
[C++ Warning] Project1.cpp(35): W8004 'naytto' is assigned a value that is never used [Linker Error] 'C:\PROGRAM FILES\BORLAND\CBUILDER5\LIB\SDL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
Sitten ajoin vakio asetuksilla, johon vain pastetin koodin, niin koodista tuli seruaavanlainen:
#pragma hdrstop #include <condefs.h> #include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot #pragma comment(lib, "SDLmain.lib") // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa, #pragma comment(lib, "SDL.lib") // sinun ei tarvitse lisätä LIB-tiedostoja "käsin" // #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian USEUNIT("childfrm.cpp"); USEUNIT("mainfrm.cpp"); USEUNIT("stdafx.cpp"); USEUNIT("SDL.cpp"); USEUNIT("SDLDoc.cpp"); USEUNIT("SDLView.cpp"); USERC("SDL.rc"); int main(int argc, char *argv[]) { // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN); // peli tähän :D // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; } //--------------------------------------------------------------------------- #define WinMain
Tämän jälkeen tuli taas uusia erroreita, joten en tidä missä taas on vika:
[Linker Error] 'C:\PROGRAM FILES\BORLAND\CBUILDER5\LIB\SDL.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
(Mod. Edit: Poistettu satoja rivejä varoituksia, ei virheitä.)
-Tosin olisi minulla mahdollisuus käyttää tota Visual C++: 6: sekä Visual Basic 6:ostakin, mut se on niin kankea käyttää sekä siinä ei ole mielestäni tarpeeksi helpotettuja työkaluja, jolla saisi tehokaasti luotua pieniä ohjelmia, vaik en tosin ymmärrä, että miksi niin moni tästä huolimatta suosittelee käyttämään tätä editoria.
#include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot //#pragma comment(lib, "SDLmain.lib") // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa, //#pragma comment(lib, "SDL.lib") // sinun ei tarvitse lisätä LIB-tiedostoja "käsin" // #pragma-rivit toimivat VAIN Visual c++:alla! gcc:llä parametri -lSDL ajaa saman asian /*koodin sisältö */ SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; }
ota prgma rivit pois, ne kun on syy siihen miks porukka suosittelee visual cpp:tä-> pragma-rivit kun ei toimi kun vaan siinä
Ny se sanoo vain, että:
[C++ Warning] Project1.cpp(33): W8004 'naytto' is assigned a value that is never used
Koodi oli, jota yritän ajaa:
#pragma hdrstop #include <condefs.h> #include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot int main(int argc, char *argv[]) { // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN); // peli tähän :D // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; } //--------------------------------------------------------------------------- #define WinMain
Missäköhän vielä vikana?
#include <SDL/SDL.h> // sisällytetään SDL:n otsikkotiedostot int main(int argc, char *argv[]) { // nyt meidän tulee alustaa SDL. Tämä onnistuu SDL_Init() funktiolla, jolle annetaan parametrina // tieto siitä, mitkä SDL:n osat alustetaan, tässä tapauksessa vain video-ominaisuudet if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // paluuarvon ollessa pienempi kuin 0, tapahtui virhe { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon return 0; // lopetetaan ohjelma } // SDL on nyt alustettu virheettömästi, seuraavaksi onkin aika vaihtaa resoluutiota // ensin on kuitenkin luotava pinta, joka kattaa näytön sisällön: SDL_Surface * naytto; // SDL_Surface on siis SDL:n oma tyyppi, jota käytetään eri pintoja varten, tästä lisää myöhemmin // sitten resoluution vaihtaminen. SDL_SetVideoMode-funktio vaihtaa resoluution // parametreina sille annetaan uusi resoluutio, värisyvyys (tässä 32-bittinen) ja sitten ohjausliput // tässä tapauksessa ohjausliput tarkoittavat, että pinta luodaan näytönohjaimen muistiin ja // ohjelma asetetaan kokoruututilaan (katso taulukko lopusta) naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN); // peli tähän :D // odotetaan 5 sekuntia SDL_Delay(5000); SDL_Quit(); // "suljetaan" SDL return 0; }
yritä kääntää pelkkä tuo. itsellä tuo kääntyy noin..(g++ kääntäjä) ja toimii..
muuten, jos voit, niin poistaisitko tuon virhelistan tost vähä ylempää.. mitenkää?
Kannattaisi opetella erottamaan sanat "warning" ja "error". Lisäksi kannattaisi sen verran opetella englantia, että osaisi lukea tuon varoituksen. Joka tapauksessa se on nyt täysin merkityksetön eikä vaikuta ohjelman kääntymiseen tai toimintaan. Sen sijaan aiempi virhe (Linker error), jonka voisit kyllä myös opetella itse lukemaan, kertoo, että yrität käyttää VC++:n lib-tiedostoa Borlandin ohjelmassa, mikä ei tietenkään onnistu, koska kaikkihan haluavat tehdä oman formaatin, joka ei ole yhteensopiva muiden kanssa.
Jos olisit vaivautunut Googleen kirjoittamaan SDL Borland C++, olisit löytänyt SDL:n kotisivulta ohjeen: http://www.libsdl.org/faq.php?action=listentries&category=4#46
Siellä SDL-sivulla ja borland -serverillä oleva lataus linkki ei toimi? Muuten kiitän vinkistä Metabolixsia, kunhan vain saisin jostakin tuon toimivan linkin ja saisin edes ekan tuotoriaalin ajettua niin ei muuta.
Et sitten tuotakaan sivua viitsinyt tarkemmin lueskella? Siinä lukee hyvin selvästi, että linkki on vain ohjetiedostoon. Sen sijaan tuolla käsketään lukea lähdekoodipaketista borland.html. Lähdekoodin saat tietenkin SDL:n lataussivulta.
Siis, olenhan mä ton sdl-lataus sivunkin käynnyt, mut en ole tosin asentannut tuo antamasi ohjeiden, mukaan tosin kun nämä tiedostot eivät käy:
SDL-devel-1.2.13-VC6.zip (Visual C++ 6.0)
SDL-devel-1.2.13-VC8.zip (Visual C++ 2005 Service Pack 1)
SDL-devel-1.2.13-mingw32.tar.gz (Mingw32)
ja ellei kyse ole tästä: SDL-1.2.13-win32.zip, niin siin ei lue borlannin tuesta, mitään.
Ei mitään noista vaan lähdekoodipaketti.
Joo, nyt tunttu olevan vähemmän virheitä kun latasin SDL-1.2.13.zip -source filut ja asensin ne manuaalisesti ton borland.zip tiedostot lib:iin ja includeen, mut nyt on enään tälläinen virhe, et se voisi ajaa koodin:
[C++ Warning] Project1.cpp(34): W8004 'naytto' is assigned a value that is never used
Luepa 5.1. lähettämäni viesti. Tuo ei ole virhe eikä tuolla ole mitään tekemistä koodin toimivuuden kanssa. Tuossa sanotaan, että et käytä sijoittamaasi arvoa (kuten voit helposti koodista todeta).
Mä vaihoin nyt seuraavan koodi pätkän käyttämääni resoluutioon:
naytto = SDL_SetVideoMode(1280, 1024, 32, SDL_HWSURFACE|SDL_FULLSCREEN);
Mutta siitä huolimatta tuli seuraavat errorit:
[C++ Warning] Project2.cpp(33): W8004 'naytto' is assigned a value that is never used
sen lisäksi tuli vielä kun ajoin:
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at 0024E0B0. Read of address 00000000'. Process stopped. Use Step or Run to continue.
Bugasee vieläkin, en tiedä koodin perusteella enään muuta missä voisi olla vikana. Eikä ton Step or Run to continuen käyttäminen auttannut yhtään. ;(
CoolC++ kirjoitti:
Mutta siitä huolimatta tuli seuraavat errorit:
[C++ Warning] Project2.cpp(33): W8004 'naytto' is assigned a value that is never used
SE ON VAROITUS! Metabolix on sitä jo muutamaan kertaan koettanut kertoa!
Tuo toinen on taas poikkeus, joka heitetään. Todennäköisesti yrität lukea (käyttää) varaamatonta/poistettua muistipalaa (muuttujaa).
Olihan SDL.dll varmasti ohjelman hakemistossa tai Windows/System32-hakemistossa? Jos tuo on kunnossa ja koodisi on tosiaan noin yksinkertainen, niin ohjelman kaatuminen antaa aihetta olettaa, että SDL-versiossasi on vikaa. Ehkäpä kannattaisi seurata paketin ohjeita oman SDL.lib-tiedoston luontiin IMPLIB-ohjelman avulla — tai etsiä vastausta jostain Borlandin tuotteisiin erikoistuneesta paikasta.
Kyllä, se SDL.dll on windows/system32 -hakemistossa. En tosin alunperin kysynnyt SDL-llän asentamisesta mitään, mut kun kerran suositellaan SDL-llää niin siksi, kysyin vain alunperin, Drag & Dropin suorittamisesta formin päällä. En jaksa alkaa vaivautua hirveen monimutkaisen asentamisen kautta saada toimimaan SDL-lää kun sitä ei saa installina. Kun on nyt tehty mitä on voinnut tehdä max:simissaan, joten tyydyn perinteisen graffiikan luontiin sekä pelien tekemiseen tämän Borlannin omalla graffiikkaa/rajapintaa tukemalla muodolla vaikka se kuulostaisikin lähes samalta kuin game makerilla tekisi tai vastaavalla.
Drag&Drop C++Builderissa on aika yksinkertainen toimenpide. Alla yksinkertainen esimerkki, formilla on Image1 komponentti jolle on asetettu OnMouseDown, OnMouseUp, OnStartDrag, OnEndDrag ja OnDragOver käsittelijät. Formille on asetettu OnDragOver käsittelijä. Image1:n OnDragOver on sama kuin Formin, lisäksi Formille on määritelty kaksi muuttujaa img_x ja img_y tyypiltään int.
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Aloitetaan vetäminen jos hiiren vasen nappi on alhaalla if (Button == mbLeft) { // Tallennetaan hiiren sijainti kuvan päällä img_x = Y; img_y = Y; // Aloitetaan veto Image1->BeginDrag(true); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Lopetetaan veto kun vasen nappi vapautetaan ja veto on käynnissä if (Button == mbLeft && Image1->Dragging()) { Image1->EndDrag(true); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { // Suoritetaan kun vedetään objektin yli Accept = false; // Oletuksena ei hyväksytä drag'n'dropia if (Source == Image1) { // Jos ollaan vetämässä Image1:tä if (Sender == Image1) { // Liikuuko hiiri Image1:n päällä? Image1->Left += X-img_x; Image1->Top += Y-img_y; } else { // Hiiri liikkuu formin päällä Image1->Left = X-img_x; Image1->Top = Y-img_y; } Accept = true; // Hyväksytään drag'n'drop } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1EndDrag(TObject *Sender, TObject *Target, int X, int Y) { // Suoritetaan kun veto loppuu // Veto loppuu tässä tapauksessa aina Image1:n päälle ja koodrinaatit ovat samat kun // vedon alussa koska Image1 liikkuu kursorin mukana, joten tällä ei ole merkitystä. /* TComponent *target = dynamic_cast<TComponent*>(Target); if (target != NULL) { ShowMessage("Image1 dropped on "+target->Name+" at ("+AnsiString(X)+","+AnsiString(Y)+")."); } */ } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1StartDrag(TObject *Sender, TDragObject *&DragObject) { // Suoritetaan kun veto alkaa } //---------------------------------------------------------------------------
Kokonaisuudessaan projekti löytyy osoitteesta: http://web.abo.fi/~trahkila/files/dragdrop.zip
Projekti on tehty C++Builder 2007:llä joten se ei suoraan toimi C++Builder 5:ssä.
Kiitän, vaikka ei toimikkaan suoraan..., koska väittää, että X-img_x; Y-img_y; symbooleja ei ole tai tunneta.
Nyt kannattaisi hetkeksi palata ihan C++:n perusteisiin. Tietenkään muuttujia ei ole, jos niitä ei ole määritelty. Määrittele nuo jossain, niin sitten on. Järkevää olisi ehkä lisätä ne TForm1-luokkaan (ja vaihtaa nimiksi vaikka drag_x ja drag_y, jos aikoo käyttää samoja usean kuvan siirtelyssä). Asiasta mainitaan jo tuossa samassa viestissä, kuin koodikin on. Voisit siis lukea viestit tarkemmin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.