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

question-closed Problem z kolizjami

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 25 września 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)
zamknięte 28 września 2015 przez patryk16

Mam problem z funkcją Ai z class Ziemi dlatego .

Problem polega na tym że gdy wywołuje dwie funkcje Ai z obiektów class Ziemia.

To jeden obiekt nie działa.

#pragma once
#ifndef RESORCES_H_INCLUDED
#define RESORCES_H_INCLUDED
#endif  //RESORCES_H_INCLUDED
#include <TardiGrap.hpp>
#include "Level.h"
#include "Player.h"
#include "NPC.h"
#include "Object.h"
using namespace tge;


class Gra : public Game
{
private:

    vector <Object*> plan3;
    vector <Object*> plan2;
    vector <Object*> plan1;
    vector <Object*> npc;
    Player Gracz;
    Psychic *fizyka;
    int fps;
bool Pauzy;
public:
    Ziemia *po;
    Ziemia *up;
void Pauza()
{
  if(Pauzy)Sleep(15);
}
    Gra(int x,int y,string link)
    : Game(x,y,link)
    {
Gracz.create(1,800,50,4,"Lotos.png");
fps=60;
app.setFramerateLimit(fps);
po=new Ziemia(400,800,1000,400,"Pod.png");
plan1.push_back(po);
srand(time(NULL));
fizyka=new Psychic(0,0);
npc.push_back(&Gracz);
Pauzy=false;
up=new Ziemia(460,100,1000,400,"Pod.png");
plan1.push_back(up);
    }
    void Run()
    {
        while(app.isOpen())
        {

            while(app.pollEvent(event))
            {
                if(event.type=sf::Event::Closed)
                {
                    Ending(&app);
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                {
                      Ending(&app);
                }
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::P))
                {
                   if(Pauzy==false) Pauzy=true;
                   else Pauzy=false;
                }
                Gracz.Control(&event);
            }
            Gracz.Ai(&app);
po->Ai(&Gracz,po);//to są te funkcje.
up->Ai(&Gracz,up);

             app.clear();
for(int i=0;i<plan1.size();i++)
{
    app.draw(plan1[i]->GetBody());
}
        for(int i=0;i<npc.size();i++)
        {
            app.draw(npc[i]->GetBody());
        }

         app.display();
        }


    }
    Object* GetObject(int p,int i)
    {
        if(p==1) return plan1[i];
        else if(p==2)return plan2[i];
        else if(p==3)return plan3[i];
        else if(p==4)return npc[i];
    }
    void Ending(sf::RenderWindow *op)
    {
    npc.clear();
        plan1.clear();
        plan2.clear();
        plan3.clear();
        op->close();
    }
};

Ziemia

#pragma once
#ifndef OBJECT_H_INCLUDED
#define OBJECT_H_INCLUDED

#endif // OBJECT_H_INCLUDED
#include "Resorces.h"
#include "Player.h"
#include "NPC.h"
using namespace tge;
using namespace std;
class Ziemia : public Object
{
    int xs,ys;
public:
Ziemia(int x,int y,int bx,int by,string link);
    void Ai(Player *play,Ziemia *o);
    void NPCAi(NPC *npc);

};

funkcja Ai

#include "Resorces.h"
using namespace tge;
using namespace std;
void Ziemia::Ai(Player *play,Ziemia *o)
{

    if((play->GetBody().getPosition().y+50>=cialo.getPosition().y-20)&&(play->GetBody().getPosition().x>=cialo.getPosition().x)
   &&(play->GetBody().getPosition().x<=cialo.getPosition().x+xs)&&(play->GetBody().getPosition().y<cialo.getPosition().y+ys))
{
    play->SetGrav(false);play->EnabledR[1]=true;play->EnabledR[0]=true;
}
else play->SetGrav(true);

if((play->GetBody().getPosition().y<cialo.getPosition().y+ys)&&(play->GetBody().getPosition().y>cialo.getPosition().y-50)
   &&(play->GetBody().getPosition().x>=cialo.getPosition().x)  &&(play->GetBody().getPosition().x<=cialo.getPosition().x+xs))
{
    //lewy bok.

       if(play->GetBody().getPosition().x>cialo.getPosition().x-50)//kiedyś -40.
       {
        if(play->GetBody().getPosition().x<cialo.getPosition().x+xs/2)
          {play->EnabledR[1]=false;play->EnabledR[0]=true;
            play->CanJump=true;
          }

       }
       if(play->GetBody().getPosition().x<cialo.getPosition().x-90)
          {
            play->EnabledR[0]=true;play->EnabledR[1]=true;
          }
          //prawy bok.
           if(play->GetBody().getPosition().x<cialo.getPosition().x+xs+50)//kiedyś +40.
       {
        if(play->GetBody().getPosition().x>cialo.getPosition().x+xs/2)
          {play->EnabledR[0]=false;play->EnabledR[1]=true;
play->CanJump=true;
          }

       }
       if(play->GetBody().getPosition().x>cialo.getPosition().x+xs+90)
          {
            play->EnabledR[1]=true;play->EnabledR[0]=true;
          }


}
else play->EnabledR[1]=true;play->EnabledR[0]=true;
if((play->GetBody().getPosition().y<=cialo.getPosition().y+ys)&&(play->GetBody().getPosition().y>cialo.getPosition().y+ys-100)
   &&(play->GetBody().getPosition().x+50>=cialo.getPosition().x)&&(play->GetBody().getPosition().x<=cialo.getPosition().x+xs))
{
    play->CanJump=false;
}
else play->CanJump=true;



if(!play->EnabledR[0]) play->EnabledR[1]=true;
else if(!play->EnabledR[1])play->EnabledR[0]=true;


}

 

komentarz zamknięcia: Rozumiem problem

1 odpowiedź

0 głosów
odpowiedź 25 września 2015 przez niezalogowany
Możesz uściślić co rozumiesz pod wyrażeniem "obiekt nie działa"?
komentarz 25 września 2015 przez patryk16 Obywatel (1,080 p.)
Chodiz oto że jak jedna funkcja z jednego obiektu

to ta sama funkcja w jednym obiekcie nie działa.

A do tego działa jak by za drugą.
komentarz 26 września 2015 przez katolik6 Dyskutant (8,140 p.)
zaraz, zaraz, to wypowiedzenie się kupy nie trzyma. Dobrze rozumiem? Jak wywołujesz jedną funkcję, to jest ok, a jak drugą zanim pierwsza skończy, to nic się nie dzieje dopuki pierwsza nie skończy?
komentarz 26 września 2015 przez patryk16 Obywatel (1,080 p.)
Powiedzmy tylko że tylko jedna się wykonuje a druga nie.
komentarz 26 września 2015 przez niezalogowany
Ale w całości się nie wykonuje, czy objawia się to czymś szczególnym (np brakiem ruchu jednostki), może błąd leży gdzieś po stronie logicznej kodu i nie może się wykonać. Na początku i końcu badanych funkcji niech cout ci wypisze jakieś komunikaty, np "Start funkcji X", "Koniec funkcji X" (X to funkcja konkretnego obiektu, chodzi o to żeby każdy obiekt miał nieco inny komunikat), następnie sprawdź co się stanie w różnych przypadkach (będą istniały wywołania w kodzie to po->AI(), up->AI(), usuniesz 1 wywołanie i uruchomi się tylko po->AI() ), na podstawie tego być może uda ci się zaobserwować gdzie leży błąd, jeżeli zobaczysz że obie funkcje się wywołują od początku do końca to będzie oznaczało, że if'y nie mogą się spełnić i tutaj musisz coś pozmieniać.
komentarz 26 września 2015 przez patryk16 Obywatel (1,080 p.)
Kolizje drugiego obiektu nie działąją
komentarz 26 września 2015 przez niezalogowany
A zrobiłeś to o czym ci mówiłem? Posprawdzaj w ten sposób też warunki, jeżeli się wywołają, lecz dalej nie ma kolizji to oznacza tyle że źle napisałeś kolizje

Podobne pytania

0 głosów
2 odpowiedzi 482 wizyt
pytanie zadane 25 stycznia 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 6 września 2020 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)
+1 głos
0 odpowiedzi 235 wizyt

92,536 zapytań

141,376 odpowiedzi

319,451 komentarzy

61,920 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!

...