ďťż

Ładny brzuch

Witam, tworze coś co ciężko jest określić (nazwałbym to grą pisaną dla przećwiczenia pozanej wiedzy).
Mam postać towrzoną za zasadzie listy dwukierunkowej
typedef struct hero {   int x, y; //współżędne   char *view; //wygląd w postaci literowej np. "A"   hero *next, *prev; };
No i jej inicjacja
hero *player = new hero; hero *element2 = new hero; player->x = 10; player->y = 10; player->view = "O"; player->next = Null">NULL; player->prev = elemnent2; player->x = 10; player->y = 9; player->view = "o"; player->next = player; player->prev = Null">NULL; Taki wężyk. Następnie pobieram od użytkownika klawisz w którym kierunku miałby się poruszyć ten wąż, poruszam go i wyświetlam funkcjami:
void printSnake(snake **tail, WINDOW *field) //WINDOW *field to wskaznik do okna w ktorym ma się owy wąż wyświetlać { snake *tmp = *tail; wclear(field);//funkcja z ncurses box(field, 0, 0);//funkcja z ncurses while(tmp != Null">NULL) { mvwprintw(field, tmp->y, tmp->x, tmp->view); //funkcja z ncurses wrefresh(field); //funkcja z ncurses tmp = tmp->next; } } void moveSnake(snake **tail, snake **head, int way, WINDOW *field) { switch(way) { case KEY_LEFT: if((*tail) != (*head)) { snake *newElement = new snake; newElement->x = (*head)->x--; newElement->y = (*head)->y; newElement->view = "o"; newElement->next = (*head); newElement->prev = (*head)->prev; (*head)->prev->next = newElement; (*head)->prev = newElement; (*tail) = (*tail)->next; delete (*tail)->prev; (*tail)->prev = Null">NULL; } else (*head)->x--; break; case KEY_RIGHT: if((*tail) != (*head)) { snake *newElement = new snake; newElement->x = (*head)->x++; newElement->y = (*head)->y; newElement->view = "o"; newElement->next = (*head); newElement->prev = (*head)->prev; (*head)->prev->next = newElement; (*head)->prev = newElement; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = Null">NULL; } else (*head)->x++; break; case KEY_UP: if((*tail) != (*head)) { snake *newElement = new snake; newElement->x = (*head)->x; newElement->y = (*head)->y--; newElement->view = "o"; newElement->next = (*head); newElement->prev = (*head)->prev; (*head)->prev->next = newElement; (*head)->prev = newElement; *tail = (*tail)->next; delete (*tail)->prev; (*tail)->prev = Null">NULL; } else (*head)->y--; break; case KEY_DOWN: if((*tail) != (*head)) { snake *newElement = new snake; newElement->x = (*head)->x; newElement->y = (*head)->y++; newElement->view = "o"; newElement->next = (*head); newElement->prev = (*head)->prev; (*head)->prev->next = newElement; (*head)->prev = newElement; (*tail) = (*tail)->next; delete (*tail)->prev; (*tail)->prev = Null">NULL; } else (*head)->y++; break; } printSnake(tail, field); }
I jak wszystko sobie działa i chciałbym teraz dodać coś takiego aby po naciśnięciu np klawisza w lewo wąż poruszał się ciągle w lewo do momentu aż użytkownik nie klinknie kolejnego klawisza. Jestem pewnien że da się to zrobić tylko i wyłącznie za pomocą wątków. Chciałbym użyć tych z <process.h>. Tylko nie bardzo mi to wychodzi. Spłodziłem coś takiego.
typedef struct thread {   int speed, way;   snake **tail, **head;   WINDOW *field; }; void moving(void *parametr) //moj watek {   thread *arg;   arg = (thread*)parametr;   while(1)   {     moveSnake (arg->tail, arg->head, arg->way);     printSnake(arg->tail, (&arg)->field);      _sleep(arg->speed);   } }I miałby on być włączany na początku gry przerywany po naciśnięciu klawisza i znów uruchamiany z nowymi parametrami.
hero *head = player,     *tail = element2; ... thread a = new thread; a->head = &head; a->tail = &tail; a->way = key; a->speed = 100; a->field = field;           _beginthread(moving, 0, &a); Tylko nie bardzo wiem co robie źle ponieważ nic nie działa. Wątek jest uruchamiany ale albo sie wywala na printSnake(); albo (bez tego, powinno tez działać bo rysowanie jest także w samym moveSnake()) się nie porusza. Byłbym wdzięczny za wskazanie poprawnego rozwiązania. :/ A może dałoby się to zrobić bez używania wątków? O.o



witam, do zmiany kierunku stwórz sobie zmienna globalna która będzie zawierac wartosci od 0 do 3 (prawo, lewo, gora ,dol) i uzyj komunikatu WM_KEYDOWN do zmiany wartosci. Nastepnie musisz przy odrysowaniu weza sprawdzic jaki to jest kierunek i odrysowywac go odpowiednio. Ja napiaslem wezyka w c++ z winapi i nie korzystalem z watkow, a jak juz cos to uzyj CreateThread itp.

Wolałbym jednak rozwiązanie bez użycia WinApi, chciałbym później zająć się przenoszeniem kodu na linuksa.

Przenośność kodu: jak zwykle lansujęswoje ulubione, czyli polecam wxWidgets. Kod przenośny, graficzny i wiele innych... Niebawem spełnię obietnice co do kursu.



Yyy ale mi chodziło żeby nie używać Winapi zamiast wątków a nie jako środowisko graficzne bo do tego używam ncurses.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •