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

Prośba o wyjaśnienie kodu gry w C++

VPS Starter Arubacloud
+1 głos
412 wizyt
pytanie zadane 25 września 2016 w C i C++ przez AlanP Nowicjusz (240 p.)

Witam, aktualnie uczę się biblioteki SFML. Obejrzałem ten film: https://www.youtube.com/watch?v=7Vf_vQIUk5Q&list=PLB_ibvUSN7mzUffhiay5g5GUHyJRO4DYr&index=2
w którym gość robi grę Doodle Jump.
Nie mogę jednak zrozumieć logiki odpowiwadającej za odbijanie się postaci od obiektów, jak i rysowania kolejnych obiektów kiedy postać skacze do góry. Oto cały kod:

 

#include <SFML/Graphics.hpp>
#include <time.h>
using namespace sf;

struct point
{ int x,y;};

int main()
{
    srand(time(0));

    RenderWindow app(VideoMode(400, 533), "Doodle Game!");
    app.setFramerateLimit(60);

    Texture t1,t2,t3;
    t1.loadFromFile("images/background.png");
    t2.loadFromFile("images/platform.png");
    t3.loadFromFile("images/doodle.png");

    Sprite sBackground(t1), sPlat(t2), sPers(t3);

    point plat[20];

    for (int i=0;i<10;i++)
      {
       plat[i].x=rand()%400;
       plat[i].y=rand()%533;
      }

	int x=100,y=100,h=200;
    float dx=0,dy=0;

    while (app.isOpen())
    {
        Event e;
        while (app.pollEvent(e))
        {
            if (e.type == Event::Closed)
                app.close();
        }

    if (Keyboard::isKeyPressed(Keyboard::Right)) x+=3;
    if (Keyboard::isKeyPressed(Keyboard::Left)) x-=3;

    dy+=0.2;
    y+=dy;
    if (y>500)  dy=-10;

	if (y<h)
    for (int i=0;i<10;i++)
    {
      y=h;
      plat[i].y=plat[i].y-dy;
      if (plat[i].y>533) {plat[i].y=0; plat[i].x=rand()%400;}
    }

	for (int i=0;i<10;i++)
    && (y+70>plat[i].y) && (y+70<plat[i].y+14) && (dy>0))  dy=-10;
    if ((x+50>plat[i].x) && (x+20<plat[i].x+68)

	sPers.setPosition(x,y);

    app.draw(sBackground);
    app.draw(sPers);
    for (int i=0;i<10;i++)
    {
    sPlat.setPosition(plat[i].x,plat[i].y);
    app.draw(sPlat);
    }

    app.display();
}

    return 0;
}

 

Bardzo proszę o wyjaśnienie poniższego kawałku kodu jak i co oznaczają zmienne dx i dy oraz tablica plat (przynajmniej tak mi się wydaje że to tablica). Wklejam kod. Z góry dziękuję za odpowiedź.

 

dy+=0.2;
    y+=dy;
    if (y>500) dy=-10;

    if (y<h)
    for (int i=0; i<10; i++)
    {
        y=h;
        plat[i].y=plat[i].y-dy;
        if(plat[i].y>533) {plat[i].y=0; plat[i].x=rand()%400;}
    }

    {
            for (int i=0;i<10;i++) //logika odpowiadajaca za odbijanie sie od obiektow

                    for (int i=0;i<10;i++)
                    if ((x+50>plat[i].x) && (x+20<plat[i].x+68)
                    && (y+70>plat[i].y) && (y+70<plat[i].y+14) && (dy>0))
                    dy=-10;
            

           sPers.setPosition(x,y);
    }

 

komentarz 25 września 2016 przez criss Mędrzec (172,590 p.)
Za ten nazwy zmiennych gość powinien trafić do jakiegoś koderskiego piekła :| Nie da się tego czytać
komentarz 25 września 2016 przez AlanP Nowicjusz (240 p.)
Właśnie w tym problem ;/ Czuję że będę musiał spędzić dużo czasu żeby to ogarnąć. Niby bardzo prosta gra ale cóż, nie każdy rodzi się zawodowcem ;/
komentarz 25 września 2016 przez criss Mędrzec (172,590 p.)
Za każdym razem, kiedy spojrze na ten kod, to sie poddaje. Po prostu mi się nie chce. Może jutro jak nikt nie odpowie, to się zmusze, ale kod jest tragiczny.
komentarz 25 września 2016 przez Tomekku Bywalec (2,830 p.)
Mi się zachciało ;D
komentarz 25 września 2016 przez JAKUBW Nałogowiec (33,470 p.)
Plat to 20 elementowa tablica punktów, które zawierają lokalizację x,y platform. Pierwsza pętla for sprawdza czy platformy są poniżej widoku a jeżeli któraś jest to wyrzuca ją do góry oraz losuje pozycję x.  Druga pętla for sprawdza czy nie nastąpiła kolizja oraz dy czyli czy gracz już opada. Jeżeli tak to resetuje dy i gracz poleci w górę.

Tak ja to rozumiem, ale te zmienne to jakiś koszmar.
komentarz 26 września 2016 przez AlanP Nowicjusz (240 p.)
Dziękuję :)

1 odpowiedź

+2 głosów
odpowiedź 25 września 2016 przez Tomekku Bywalec (2,830 p.)
edycja 25 września 2016 przez Tomekku
#include <SFML/Graphics.hpp>
#include <time.h>
using namespace sf;
 
struct point
{ int x,y;};
 
int main()
{
    srand(time(0));
 
    RenderWindow app(VideoMode(400, 533), "Doodle Game!");
    app.setFramerateLimit(60);
 
    Texture t1,t2,t3;
    t1.loadFromFile("images/background.png");
    t2.loadFromFile("images/platformform.png");
    t3.loadFromFile("images/doodle.png");
 
    Sprite sBackground(t1), sPlat(t2), sPers(t3);
 
    point platform[20];
 
    for (int i=0;i<10;i++)
    {
       platform[i].x = rand()%400;
       platform[i].y = rand()%533;
    }
 
    int currentX = 100, currentY = 100, height = 200;
    float distanceX = 0, distanceY = 0;
 
    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == Event::Closed)
                app.close();
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Right)) 
            currentX += 3;
        if (Keyboard::isKeyPressed(Keyboard::Left)) 
            currentX -= 3;
     
        distanceY += 0.2;
        currentY += distanceY;

        if (currentY > 500)
            distanceY =- 10;
     
        if (currentY < height)
        {
            for (int i=0;i<10;i++)
            {
                currentY = height;
                platform[i].y = platform[i].y - distanceY;
                if (platform[i].y > 533)
                {
                    platform[i].y = 0;
                    platform[i].x = rand()%400;
                }
            }
        }
     
        for (int i=0;i<10;i++)
        {

            if ((currentX+50 > platform[i].x) && (currentX+20 < platform[i].x+68) && (currentY+70 > platform[i].y)
                && (currentY+70 < platform[i].y+14) && (distanceY > 0))
            {
                distanceY =- 10;
            }
        }
        
       
     
        sPers.setPosition(currentX,currentY);
     
        app.draw(sBackground);
        app.draw(sPers);
        for (int i=0;i<10;i++)
        {
            sPlat.setPosition(platform[i].x,platform[i].y);
            app.draw(sPlat);
        }
     
        app.display();
    }
 
    return 0;
}

No trochę się naszkubałem, ale myślę, że teraz Ci będzie wygodniej poszukać :D

komentarz 26 września 2016 przez AlanP Nowicjusz (240 p.)
Serdecznie dziękuję!!!!
komentarz 26 września 2016 przez Tomekku Bywalec (2,830 p.)
Luuzik :D ale dużo musiałem się domyślać, bo to była katorga z tymi "dx, dy" XD

Podobne pytania

0 głosów
1 odpowiedź 796 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez admaj1212 Początkujący (320 p.)
0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 9 października 2016 w PHP przez tirith Mądrala (5,940 p.)
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 4 listopada 2016 w C i C++ przez Emil Panecki Bywalec (2,100 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...