Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z programikiem

Ostatnio zmodyfikowano 2011-07-10 13:27
Autor Wiadomość
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? :
C/C++
#include "Micro.h"
#include "Tresc.h"

int TerazOkno = 0;
int Zaznaczony = 666;
int Ostatni = - 1;
int OstatnioZaznaczony = - 1;
int TerazZaznaczony = 666;
WINDOW Win; //okno glowne
TEXTBOX Kod;
LISTBOX Wybor;
LISTBOX Lista;
BUTTON bWyjscie;
BUTTON bZapiszProjekt;
BUTTON bWczytajProjekt;
BUTTON bNowyProjekt;
BUTTON blDodaj;
WINDOW WinNowy; //dodawanie obiektu
TEXTBOX tNazwaNowego;
BUTTON bnTworz;
BUTTON bnAnuluj;
WINDOW WinUsun; //usuwanie obiektu
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
}
P-35680
dmx81
» 2011-07-10 12:06:03

C/C++
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 ;)
P-35683
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 ;]
P-35695
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
P-35707
« 1 »
  Strona 1 z 1