| hugerth Temat założony przez niniejszego użytkownika | [C++] Motyw z TheMatrix » 2012-11-23 14:34:53 Witajcie, piszę sobie prosty konsolowy program do tworzenia efektu spadających znaków z matrixa. I mam problem :)
 Napisałem funkcję, która tworzy ciąg znaków w danej (lub losowej) kolumnie, następnie ciąg "przejeżdża" na dół okienka konsoli i znika. No dobra, dla jednej kolumny to wygląda fajnie, ale ja potrzebuję na dobrą sprawę 79 takich samych wywołań odpalonych równolegle.
 
 Miałoby to wyglądać tak: w pętli losuję kolumnę i dla tej kolumny wywołuję funkcję Kolumna. Ale nie chcę czekać zanim funkcja dojdzie do końca, tylko np. po wyświetleniu n znaków w kolumnie startuje już druga kolumna (czyli wywołuję tę samą funkcję).
 | 
|  | 
| jsc | » 2012-11-23 14:39:33 Zainteresuj się biblioteką thread. Jest natywna w C++11 lub w boost. | 
|  | 
| m4tx | » 2012-11-23 15:14:26 @up ta, nie ma to jak odpalić 79 wątków dla prościutkiej aplikacji... :P @hugerth - napisałeś co chcesz uczynić, napisałeś jak to chcesz uczynić, więc... w czym właściwie masz problem? :) Generalnie ja bym to zrobił tak, że czekam  rand() % 100  milisekund, w  rand() % 10  losowo wybranych kolumnach dodaję  rand() % 3  (dla każdej kolumny inna wartość) znaków. I tak w nieskończoność. :P | 
|  | 
| jsc | » 2012-11-23 15:25:47 | nie ma to jak odpalić 79 wątków dla prościutkiej aplikacji... | 
 Jak przyjdzie do trudniutkiej to nie wiadomo się gdzie podziać, więc trzeba się wdrażać, im szybciej tym lepiej. | 
|  | 
| akwes | » 2012-11-23 15:29:58 Wiele osób robi konsolę z matriksu i prawie każda jest niezadowolona. Efekt w konsoli nie wyjdzie taki jak w matriksie. Ponieważ konsola w matriksie to animacja, w której literki spadają płynnie co x pikseli a nie o jeden rząd. 
 Po prostu za każdym razem trzeba by rysować całą konsolę (45x70?) pamiętać gdzie jest jaka literka i tyle... Ja bym zrobił to na klasach... Ale ponieważ to Twój pierwszy post to podpowiem, że przecież można zrobić duży std::string i co "x" czasu przenosić literkę "piętro niżej" pamiętając ile ma piętro (70?)
 | 
|  | 
| hugerth Temat założony przez niniejszego użytkownika | » 2012-11-23 15:32:09 @m4tx - no chciałbym żeby to tak szło - wymyślam, piszę, działa. Ale niestety nie.
 Na razie mam tak, że przelatuje jedna kolumna od góry do dołu i dopiero jak zniknie ostatni znak to funkcja się kończy. I jak tu kilka jednocześnie odpalić?
 
 Klasy dopiero przede mną. Jestem uber newbie, dopiero zaczynam.
 
 Mogę niby zrobić tablicę długości 80 (szer. konsoli) i w losowe miejsce wpisywać losowy znak i znowu przechodzić do nowego wiersza itd... ale będzie mizerny efekt.
 | 
|  | 
| pekfos | » 2012-11-23 15:51:59 Zrób bufor 80x25 i na nim operuj. Później wyświetlaj go w konsoli jakąś funkcją (np z WinAPI). Wtedy wystarczy ci do tego jedna prosta pętla. (I nie potrzeba żadnych klas)79 wątków to najgorsze możliwe rozwiązanie.
 | 
|  | 
| akwes | » 2012-11-23 15:53:01 // szkic
 // tablica dla całego ekranu o wielkości całego ekranu
 std::string konsola[70*45];
 
 // jeżeli znajdziesz znaczek, to przesuń go o wiersz niżej
 for (int i =0; i<konsola.size; i++)
 {
 konsola[i] != ' ';
 konsola[i+45] = konsola[i];
 konsola[i] = ' ';
 }
 
 
 // rysujemy z podziałem na wiersze
 for (int i =0; i<konsola.size(); i++)
 {
 
 std::cout << konsola[i];
 
 if (i%75 == 0) std::cout << "\n";
 }
 
 @pekfos  | (I nie potrzeba żadnych klas)
 
 | 
 Dlatego podałem dwa rozwiązania, co nie zmienia faktu, że jednak na klasach byłoby to wygodniejsze, czytelniejsze i przenośne na bibliotekę 2D przy nie wielkim nakładzie pracy.  | 
|  | 
| « 1 »  2 3 |