• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML - pierwsze gry

Object Storage Arubacloud
+3 głosów
848 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez Żyrosławw Bywalec (2,300 p.)
edycja 16 lutego 2017 przez Żyrosławw

Cześć!

Wrzucam moje dwie pierwsze proste gry w sfmlu. Najpierw napisałem Arkanoida, potem Tetrisa.

Folder z grami

Jakby komuś wywalało błąd o braku plików czy coś

Arkanoid umożliwia dodawanie nowych plansz poprzez dodawanie nowych plików tekstowych z mapami:

-0 - brak klocka,

-1 - klocek o jednym życiu,

-2 - dwa życia

Niestety nowe plansze trzeba też dodawać w kodzie gry.

Sterowanie - strzałki.

 

Tetris umożliwia dodawanie nowych klocków bez ponownej kompilacji, wystarczy zedytować plik figures dodając nową linijkę z nazwą pliku zawierającego nowego klocka i prawdopodobieństwo jego spadnięcia (oddzielone znakiem białym). Niestety obawiam się że losowanie klocków nie odbywa się poprawnie, jakby ktoś był w stanie powiedzieć czy mój pomysł był dobry to bym był wdzięczny. Poniżej zamieszczam kod.

Sterowanie:

-strzałki lewo, prawo - ruch klocka, 

-strzałka w górę obrót klocka

-F1, F2, F3 zmiana poziomu trudności (prędkości)

 

Kod losowania klocków:

void GameModel::choosePattern(){
    srand(time(NULL));

    int x = (rand()%100)+0;

    int i=0;

    int interval=getPatternProbability(i) * 100;

    while(x>interval){
        interval += getPatternProbability(i) * 100;
        i++;
    }

    if(i>=getPatternsCount()) i--;

    *figure = *patterns[i];
}

 

3 odpowiedzi

+4 głosów
odpowiedź 16 lutego 2017 przez adrian17 Ekspert (344,860 p.)
srand(time(NULL));

srand() raz, na początku programu, albo w ogóle (#include <random>)

#define left  1

enum?

GameObject **patterns;

std::vector?

class Collision

Po co klasa, skoro to pojedyncza funkcja?

template <int x, int y, class Type>
class Matrix
{
    public:
        Type **matrix;

        Matrix(){
            matrix = new Type*[y];

Doskonale znasz wymiary, nie ma powodu by bawić się z ręczną alokacją jak można mieć lokalne Type[y][x] lub std::vector lub std::array...

To tak z szybkiego rzutu okiem.

komentarz 16 lutego 2017 przez Żyrosławw Bywalec (2,300 p.)
Stosowanie enum jest w jakiś sposób lepsze od takich makr?

Co do bezsensownej klasy matrix - to jednym z wymogów zadania było użycie szablonu klas.

Przyznaje że mogłem wymyślić sensowniejszy sposób
komentarz 16 lutego 2017 przez adrian17 Ekspert (344,860 p.)

Stosowanie enum jest w jakiś sposób lepsze od takich makr?

Tak, jest wygodniejsze do debugowania, odrobinę bezpieczniejsze, a z `enum class` znacznie bezpieczniejsze.

Co do bezsensownej klasy matrix - to jednym z wymogów zadania było użycie szablonu klas.

Szablon jest OK, mówię o ręcznej alokacji pamięci.

komentarz 17 lutego 2017 przez Ehlert Ekspert (212,670 p.)
Od siebie dodam że skoro bawisz się w poważne projekty (a gierki mimo swej prostoty, to od strony implementacyjnej wyglądają przyzwoicie i z pomysłem) to unikaj przyjaźni.
komentarz 17 lutego 2017 przez draghan VIP (106,230 p.)

Stosowanie enum jest w jakiś sposób lepsze od takich makr?

Zobacz, co na ten temat ma do powiedzenia Stroustrup.

0 głosów
odpowiedź 16 lutego 2017 przez Żyrosławw Bywalec (2,300 p.)
Strasznie przyzwyczajony jestem do ręcznej alokacji, wynika to pewnie z tego że dość długo uczyłem się C.

Ciągle wydaje mi się że moje rozwiązanie dot. losowania liczb o zadanym prawdopodbieństwie jest błędne (losowanie tego, który klocek ma spaść). Podczas grania spadające klocki jakby w ogóle mu nie odpowiadały, ma ktoś pomysł co jest nie tak?
0 głosów
odpowiedź 16 lutego 2017 przez niezalogowany

Mam kilka uwag :)

Arkanoid

  1. Czemu obsługę klawiszy robisz w warunku sf::Event::KeyPressed? W tetrisie to jest ok no, ale tutaj chyba lepiej korzystać z funkcji sf::Keyboard::isKeyPressed(...). Poruszanie się byłoby znacznie mniej "toporne" czyli bardziej płynne przy startowaniu zwłaszcza.
  2. Kolizje są dość dziwne. Często piłka potrafi odbijać się w zupełnie przypadkowe kierunki, wlatywać do środka bloków, a czasami nawet zbugować na rogu paletki.
  3. Czemu kod prowadzisz tak bardzo rozlegle? Klasy są ważne, ale tutaj troszkę za duże rozdrobnienie jest jak na takie proste gry. Dla porównania bardziej czytelny kod tutaj (chociaż bez opcji zapisu czy kilku ważnych elementów (a i jeszcze jedna tam jest seria 16 prostych gier od podstaw ) ).

Podobne pytania

+1 głos
1 odpowiedź 628 wizyt
pytanie zadane 18 maja 2016 w Nasze projekty przez sofnir Gaduła (4,690 p.)
+1 głos
2 odpowiedzi 641 wizyt
pytanie zadane 1 maja 2016 w C i C++ przez Curiosity Nowicjusz (130 p.)
+1 głos
2 odpowiedzi 263 wizyt
pytanie zadane 31 grudnia 2016 w C i C++ przez Patryk Krajewski Nałogowiec (26,170 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...