skovv Temat założony przez niniejszego użytkownika |
Problem z programikiem » 2011-07-10 11:04:41 Witam. Mam chwile wolnego i tworze sobie pseudo GameMaker :] Jestem na etapie dodawania/usuwania obiektów i mam problem ze zmianą id obiektów. Do wyświetlenia listy obiektów i działania na niej używam listboxa, przy usunięciu id obiektów od tego który usuwam do ostatnieg dane wszystkich obiektów mają się przemieścić na zmienną z id mniejszą o 1, działa...prawie. Pierwszy obiekt od usuniętego zachowuje swoje dane, reszta przemieszcza się prawidłowo. Cienko tłumaczę... może kod? : #include "Micro.h" #include "Tresc.h"
int TerazOkno = 0; int Zaznaczony = 666; int Ostatni = - 1; int OstatnioZaznaczony = - 1; int TerazZaznaczony = 666; WINDOW Win; TEXTBOX Kod; LISTBOX Wybor; LISTBOX Lista; BUTTON bWyjscie; BUTTON bZapiszProjekt; BUTTON bWczytajProjekt; BUTTON bNowyProjekt; BUTTON blDodaj; WINDOW WinNowy; TEXTBOX tNazwaNowego; BUTTON bnTworz; BUTTON bnAnuluj; WINDOW WinUsun; TEXTBOX tPyt; BUTTON buTak; BUTTON buNie; int objdousuniecia;
int IloscObiektow = 0; char * obj_nazwa[ 999 ]; char * obj_kod[ 999 ]; char * obj_plik[ 999 ]; void ObjAdd( char * Nazwa ) { IloscObiektow += 1; obj_nazwa[ IloscObiektow ] = Nazwa; obj_kod[ IloscObiektow ] = KodObj; obj_plik[ IloscObiektow ] = Nazwa; Lista.Add( Nazwa ); } void UsunObj( int id ) { Lista.Delete( id ); for( i = id; i <= IloscObiektow; i += 1 ) { obj_nazwa[ i ] = obj_nazwa[ i + 1 ]; obj_kod[ i ] = obj_kod[ i + 1 ]; obj_plik[ i ] = obj_plik[ i + 1 ]; } IloscObiektow -= 1; }
MAIN { Win.Create( 1024, 768, "Skovv Language" ); Kod.Create( Win, 0, 0, 800, 768 ); Kod.Set( KodUruchomienie ); Wybor.Create( Win, 799, 197, 225, 60 ); Wybor.Add( "GAME" ); Wybor.Add( "FILES" ); Wybor.Add( "OBJECTS" ); Lista.Create( Win, 799, 250, 225, 490 ); ObjAdd( "obj1" ); ObjAdd( "obj_2" ); ObjAdd( "objekt 3" ); ObjAdd( "czwarty..." ); blDodaj.Create( Win, 800, 736, 225, 32, "Dodaj Obiekt" ); bZapiszProjekt.Create( Win, 800, 0, 112, 30, "Zapisz Projekt" ); bWczytajProjekt.Create( Win, 912, 0, 112, 30, "Wczytaj Projekt" ); bNowyProjekt.Create( Win, 912, 30, 112, 30, "Nowy Projekt" ); bWyjscie.Create( Win, 800, 30, 112, 30, "Wyjscie" ); UPDATE_BEGIN { Win.Update(); if( TerazOkno == 0 ) { if( Mouse( M_LEFT ) ) { if( bWyjscie.Get() ) ProgramDziala = false; if( blDodaj.Get() ) { WinNowy.Create2( Win, 300, 50, "Dodawanie Obiektu" ); tNazwaNowego.Create2( WinNowy, 0, 0, 300, 25 ); tNazwaNowego.Set( "NazwaObiektu" ); bnTworz.Create( WinNowy, 0, 25, 150, 25, "Tworz Obiekt" ); bnAnuluj.Create( WinNowy, 150, 25, 150, 25, "Anuluj" ); TerazOkno = 1; } } if( Key( K_DELETE ) ) { objdousuniecia = Lista.Get(); WinUsun.Create2( Win, 300, 50, "Usuwanie Obiektu" ); tPyt.Create2( WinUsun, 0, 0, 300, 25 ); tPyt.Set( "Napewno usunac obiekt?" ); buTak.Create( WinUsun, 0, 25, 150, 25, "Tak" ); buNie.Create( WinUsun, 150, 25, 150, 25, "Nie" ); TerazOkno = 2; } Zaznaczony = Wybor.Get(); TerazZaznaczony = Lista.Get(); if( Zaznaczony != Ostatni || OstatnioZaznaczony != TerazZaznaczony ) { if( Ostatni == 1 ) KodGame = Kod.Get(); if( Ostatni == 2 ) KodFiles = Kod.Get(); if( Ostatni == 3 ) { for( i = 0; i <= IloscObiektow; i += 1 ) { if( OstatnioZaznaczony == i ) obj_kod[ i ] = Kod.Get(); } } if( Zaznaczony != Ostatni ) { Ostatni = Zaznaczony; if( Zaznaczony == 1 ) Kod.Set( KodGame ); if( Zaznaczony == 2 ) Kod.Set( KodFiles ); if( Zaznaczony == 3 ) { for( i = 0; i <= IloscObiektow; i += 1 ) { if( TerazZaznaczony == i ) Kod.Set( obj_kod[ i ] ); } } } if( OstatnioZaznaczony != TerazZaznaczony ) { if( Zaznaczony == 1 ) Kod.Set( KodGame ); if( Zaznaczony == 2 ) Kod.Set( KodFiles ); if( Zaznaczony == 3 ) { TerazZaznaczony = Lista.Get(); if( OstatnioZaznaczony != TerazZaznaczony ) { OstatnioZaznaczony = TerazZaznaczony; for( i = 1; i <= IloscObiektow; i += 1 ) { if( TerazZaznaczony == i ) Kod.Set( obj_kod[ i ] ); } } } } TerazZaznaczony = Lista.Get(); OstatnioZaznaczony = TerazZaznaczony; } } if( TerazOkno == 1 ) { if( Mouse( M_LEFT ) ) { if( bnAnuluj.Get() ) { WinNowy.Destroy(); TerazOkno = 0; } if( bnTworz.Get() ) { ObjAdd( tNazwaNowego.Get() ); WinNowy.Destroy(); TerazOkno = 0; } } if( Key( K_ENTER ) ) { ObjAdd( tNazwaNowego.Get() ); WinNowy.Destroy(); TerazOkno = 0; } if( Key( K_ESC ) ) { WinNowy.Destroy(); TerazOkno = 0; } } if( TerazOkno == 2 ) { if( Mouse( M_LEFT ) ) { if( buNie.Get() ) { WinUsun.Destroy(); TerazOkno = 0; } if( buTak.Get() ) { UsunObj( objdousuniecia ); WinUsun.Destroy(); TerazOkno = 0; } } if( Key( K_ENTER ) ) { UsunObj( objdousuniecia ); WinUsun.Destroy(); TerazOkno = 0; } if( Key( K_ESC ) ) { WinUsun.Destroy(); TerazOkno = 0; } } } UPDATE_END }
|
|
dmx81 |
» 2011-07-10 12:06:03
void UsunObj( int id ) { Lista.Delete( id ); for( i = id; i <= IloscObiektow; i += 1 ) { obj_nazwa[ i ] = obj_nazwa[ i + 1 ]; obj_kod[ i ] = obj_kod[ i + 1 ]; obj_plik[ i ] = obj_plik[ i + 1 ]; } IloscObiektow -= 1; }
|
czy Lista.Delete( id ); mniejsza ilosc obiektow o 1? jesli nie, to przesledz sytuacje: 1. dodajesz jeden wpis, gdzie go dopisze? do tablicy na pozycji 1 (pozycja 0 zawsze wolna?) 2. dodajesz drugi wpis, dopisze na pozycji 2. 3. usuwasz wpis id=1, co sie stanie? na pozycjach tablic rownym id (czyli 1) zostana przypisane wartosci z tablic o id rownym 2, poniewaz warunek masz <= IloscObiektow , a "chyba" nie pomniejszyles tej wartosci jeszcze, tablica bedzie chciala pobrac dane z pola powyzej - tutaj ok jeszcze, bo nie wychodzisz poza zakres i przepisze ci dane z pola nr 3 (ale jest to juz chyba bledem, chyba ze celowo tak zrobiles?) bo jak bedziesz mial max elementow, to kopiowanie bedzie spoza zakresu dla ostatniej pozycji lepiej byloby dopisywac od pierwszej pozycji w tablicach (czyli tej oznaczonej nr 0) i iterowac do (iloscObiektow-1) wczytam sie bardziej w kod, moze cos znajdze... SZKODA, ZE WCIAZ NIE MA MOZLIWOSCI PODGLADU WIADOMOSCI, NA KTORA SIE ODPISUJE :( PS nr1. Co znalazlem wiecej -> kiedy dodajesz co do listy, to dodajesz to od pozycji nr 0 czy 1? bo jesli od 0 - to usuwanie masz nieprawidlowo - bo usuwasz pozycje = id (czyli element o id=1 - po ludzku pierwszy, po "komputerowemu" drugi), jesli tak, to usuwaj pozycje (id-1) ale jesli masz podobnie rozwiazane, ze na pozycji nr 0 nie masz nic, a pozycje na liscie zgadzaja sie z id, to spoko... ale wprowadza to "male" zamieszanie ;) |
|
skovv Temat założony przez niniejszego użytkownika |
» 2011-07-10 12:50:51 Lista.Delete( id ); usuwa element o danym id z listboxa :] Po tym jak się go usunie, nazwy elementów i ich id idą automatycznie w dół, muszę więc w kodzie zrobić to samo aby kod obiektu był tam gdzie powinien ;] |
|
skovv Temat założony przez niniejszego użytkownika |
» 2011-07-10 13:27:16 Poprawiłem ;] Wszystko było dobrze, tyle że przy każdym kliknięciu na listbox aktualny kod zapisywał się do danego id. Po zmianie nie przelatywałem od nowa listy i mi się źle zapisywało :P |
|
« 1 » |