Gra 2D

0

Dzień dobry
Czy możliwe jest wykonanie gry typu "air hockey" konsolowo?
Stworzyłem mapę i przy pomocy conio.h moge ruszać się postacią.
Póki co są to dopiero początki i bardziej próbuje się bawić funkcjami ale pytanie czy taka gra (z dosyć prostym mechanizmem) jest do wykonania konsolowo?

3

Jak najbardziej jest do wykonania konsolowo. Np. możesz użyć ncurses.

0
kq napisał(a):

Jak najbardziej jest do wykonania konsolowo. Np. możesz użyć ncurses.

nie znam póki co za bardzo tej biblioteki i jeżeli chodzi o samo progrmaowanie to jestem bardzo zielony więc pytanie może głupie no ale cóż ;)

czy mape stworzoną przy pomocy ascii mogę połączyć tak żeby krążek odbijał się od tych znaków?

2
Trad d napisał(a):

czy mape stworzoną przy pomocy ascii mogę połączyć tak żeby krążek odbijał się od tych znaków?

Tak.

Zanim Twój krążek zmieni pozycję, wiesz dokładnie w którą stronę leci, więc możesz sprawdzić na jaki znak trafi.

0

@Spine @kq
dzięki //zaraz sie biore za studiowanie i jak coś ciekawego uskrobe bądź będę miał jakieś pytania to dam znać
miłej niedzieli!

2

Czy możliwe jest wykonanie gry typu "air hockey" konsolowo?

W <a href=https://www.youtube.com/watch?v=xW8skO7MFYw>konsoli można skodzić FPSa</a>, więc "air hockey" też się da.

0

troche czasu już minęło, ale w końcu się za to zabrałem
zacząłem powoli bawić się biblioteką allegro i teraz kolejne pytanie

wstępnie narysowałem boisko, oraz graczy statycznie
coś w stylu

 void gracz1(){
int x=240;
int y=460;
circle(screen, x, y, 20, makecol(255, 0, 0));
}

teraz pytanie/// jak w nieskończonej pętli while prawidłowo wprawić postać w ruch/ bądź całkowicie inaczej prawidłowo powinno sie rysować postać, więc jak zabrać sie do tego żeby było dobrze?

0

W najprostszym przypadku musisz przed pętlą zadeklarować zmienne x, y i nadać im początkową wartość. W pętli sprawdzasz czy odpowiednie klawisze są naciśnięte i w zależności od naciśniętego klawisza zwiększasz bądź zmniejszasz wartości zmiennych x, y o ustalone wartości, stanowiące prędkość poruszania się. Jeśli ustalisz stałą liczbę klatek na sekundę, to nie będziesz musiał mnożyć prędkości poruszania przez czas trwania klatki. I tak przy typie int dla pozycji postaci mnożenie przez czas klatki jest bez sensu ;)

0

cały dom obudziłem jak postać sie poruszyła :D no ale niestety nie działa to tak jak chyba chciałem żbey działało
funkcję gracza przerobiłem tak

void gracz1(int x, int y){
circle(screen, x, y, 20, makecol(255, 0, 0));
}

przed pętlą raz jeszcze zainicjowałem x i y

    int x=240;
    int y=460;

a pętla nieskończona wygląda tak, przez co kółko sie powiela i robi smugę taką jak na obrazku
https://www33.zippyshare.com/v/nKuzbXsz/file.html

	while (!key[KEY_ESC])
	{
gracz1(x,y);
 if(key[KEY_A]) x--;

to pewnie przez tą inicjację gracza na początku pętli
jak to moge obejść //

0

Musisz w tej pętli nieskończonej przy każdym obrocie czyścić ekran. Bo inaczej ciągle rysujesz na tym samym buforze.

W pętli musisz zachować taką kolejność.

  1. Czyszczenie bufora ekranu.
  2. Rysowanie wszystkich obiektów w buforze - tło, gracz, wrogowie...
  3. Wrzucenie bufora na ekran.
1

Postać sie odświeża i działa płynnie! no ot jedno z głowy, więc męcze was dalej :D

teraz pytanie co zrobić w przypadku gdy postać dotknie linii
nie wiem czy dobrze myśle, ale w pętli nieskończonej zaraz za sterowaniem umieszczam warunek if z założeniem że jeśli np. gracz1_x==1 (1 piksel to wtępnie moje obramowanie) to... no właśnie
czym mogę "odciąć" klawisz żeby już nie dało sie przejechać dlaej?

1

Jeśli to jest krawędź ekranu (nie potrzebujesz obustronnej kolizji z linią), to wystarczy w kodzie obsługi klawisza skrócić przesunięcie gracza tak, żeby nigdy nie przekroczył linii.
Np. jak wciśnięta jest strzałka w lewo, to jeśli gracz1_x - przesunięcie_x < 1, to gracz1_x = 1;
W przeciwnym razie wykonujemy normalny kod przesunięcia gracz1_x -= przesunięcie_x;

0

awww po 3 godzinach walki chyba sie poddaje i męczę dalej o podpowiedź,,

została chyba najtrudniejsza część a mianowicie
1.jak prawidłowo narysować "piłke" do bufora?
2.jak prawidłowo wprawić ją w ruch?

0

http://cpp0x.pl/kursy/Kurs-Allegro-4-x-C++/Podwojne-buforowanie/69 - pewnie stary C++, może już jest nowsza wersja allegro, ale analogicznie powinieneś załapać o co biega.

Nie napisałeś w czym problem.

Prawidłowo to dobrze by było napisać jakieś klasy zgodne z allegro i Twoim silnikiem. Znacznie łatwiej się połapać w programowaniu obiektowym, niż strukturalnym. Obiekty, które się ruszają, wyświetlają itp. mają cechy wspólne. Więc można je wsadzić w jeden vector. Klasy obiektów mogą spokojnie dziedziczyć po klasie bazowej Twojego silnika, która by miała metody wirtualne służące do rysowania i poruszania. Te wszystkie metody Twoich obiektów z vectora będziesz mógł wywoływać w odpowiednich miejscach pętli nieskończonej.

Niestety Allegro i C++ nie ułatwiają zbytnio prowadzenia projektu gry. Zanim zrobisz rzeczy "jak należy", musisz sporo się nauczyć i zaprogramować odpowiednie mechanizmy.

W takim Unity 3D wyświetlanie, obiektów i ładowanie plików graficznych masz w standardzie. Wrzucasz obrazek na scenę, dołączasz do niego pusty skrypt i już możesz kodować zachowanie tego obiektu korzystając z bogatego zestawu klas i metod.

1

Chwilowo z powodu braku czasu będę zmuszony odłożyć projekt
Myśle że w przyszłości do niego wrócę ale już w innej bibliotece ;
mimo wszyskto i tak chyba jestem zadowolony z tego co zrobiłem zabierając sie z zerową wiedzą na temat tworzenia gier ;

Dziękuje każdemu za pomoc a w szczególności @Spine

1 użytkowników online, w tym zalogowanych: 0, gości: 1