Bugi z wykrywaniem kolizji i błąd, którego nie rozumiem w ogóle

0

Kod:
http://pastebin.com/4cwGxr0x
Exe:
http://www.sendspace.com/filegroup/bU4WIdaA0OqmrhiVozPsMg8kDws0RHWj

pierwszy problem jest z tym podnoszeniem przedmiotu. zeby zobaczyc tego buga trzeba nacisnac enter i prawym przyciskiem myszy spawnac item. gdy sie go podniesie nowo tworzone sciany w ogole nie maja kolizji, do tego jak sie otworzy inventory powinien 1 slot w plecaku byc zolty - ale jest zolty tylko gdy sie idzie postacia do gory. jak tak sie moze dziac? :D

drugi: kompletnie nie wiem jak sie zabrac za te kolizje, to w ogole nie chce dzialac i nie moge znalezc w internecie tego jak to zrobic. wiem co to jest bounding box collision detection, ale nie wiem jak to zrobic z uwzglednieniem kierunkow (ktora strona postaci koliduja ze sciana).

2

Oooollaaaaboga, ten kod to się nadaje jedynie do śmieci - napisz go od nowa, porządnie, obiektowo, z podziałem na pliki, używając jednej konwencji nazewnictwa (...).

ale nie wiem jak to zrobic z uwzglednieniem kierunkow

Porównać prędkości? :|

Btw, co to znaczy xLefter?

0

Oooollaaaaboga, ten kod to się nadaje jedynie do śmieci - napisz go od nowa, porządnie, obiektowo, z podziałem na pliki, używając jednej konwencji nazewnictwa (...).

ucze sie dopiero xd

"Porównać prędkości? :|"
jak to sie robi dokladnie?

xLefter to jest polozenie x lewej krawedzi danej sciany (prostokata)

1

ucze sie dopiero xd

Więc tym bardziej przepisanie tego od nowa nie zaszkodzi.

jak to sie robi dokladnie?

Machnąłem się - chodziło mi o pozycje.
Jeżeli nastąpiła kolizja (i wiesz tylko tyle, bo przykładowo sprawdzasz tylko prostokąt-prostokąt, a nie bok-bok), no to pomyśl, tak na logikę: jeżeli prostokąt A zderzył się z prostokątem B, to zwrot kolizji będzie "w lewo" w przypadku, gdy A znajduje się po lewej stronie B (każdy jego wierzchołek ma pozycję X mniejszą od iksów prostokąta B) etc.

xLefter to jest polozenie x lewej krawedzi danej sciany (prostokata)

Miałem na myśli - co znaczy lefter po angielsku.

1

przy kolizji sterowanie działa na odwrót

skoro nie działa
inventory.slot[8]
i przestaje działać co innego to obstawiam że mażesz sobie po pamięci w tym miejscu zastępując inną zmienną

pokaz kod obiektu plecak

0

Jeżeli nastąpiła kolizja (i wiesz tylko tyle, bo przykładowo sprawdzasz tylko prostokąt-prostokąt, a nie bok-bok), no to pomyśl, tak na logikę: jeżeli prostokąt A zderzył się z prostokątem B, to zwrot kolizji będzie "w lewo" w przypadku, gdy A znajduje się po lewej stronie B (każdy jego wierzchołek ma pozycję X mniejszą od iksów prostokąta B) etc.

to juz mam cos takiego podobnego ale to nie chce dzialac poprawnie, wlasnie jak ide do gory stykajac sie ze sciana i na bok to postac idzie w druga strone albo przechodzi na druga strone prostokata. jest jeszcze problem jak postac ma miec predkosc niecalkowita (np. 2,236) to wtedy nie przylega ze scianami bo dokladnosc kolizji jest do 1.

Miałem na myśli - co znaczy lefter po angielsku.

no bo jak jest higher i lower to sobie wymyslilem lefter i righter xd

pokaz kod obiektu plecak

tylko tyle:

struct plecak
{
	int slot[];
}; 
2
TadzikT napisał(a):
struct plecak
{
	int slot[];
}; 

no i tu jest pies pogrzebany?
gdzie tworzysz miejsce w pamięci na sloty?
pisząc slot[5] mażesz w pamięci w komórce oddalonej o 5 od miejsca gdzie umieściłeś wskaźnik slot, ale nie ma tam wolnego miejsca bo nie użyłeś nigdzie new ani malloc
przykładowo pierwszy slot jest prawdopodobnie w tym samym miejscu pamięci gdzie, key[up] dlatego masz coś w slocie tylko idąc w górę
ósmy slot jest zdecydowanie powiązany ze zmienną włączającą kolizję

witaj w c++ gdzie błąd w jednym miejscu może zepsuć cały program

0

Ejj, dobra, naprawiłem ten błąd z żółtym slotem w plecaku (usunąłem gdzieś jakiś numerek w dwóch miejscach i jakoś działa) ale dalej kolizje z nowymi ścianami nie działają jak się zrobi funkcja StartItem czyli dalej coś maże po pamięci. Nie mam tego struct plecak już. Nie wiem czemu tamta tablica mazała po pamięci, a inne zmienne w structach nie? Może dlatego, że to była jedyna tablica jaką miałem w structach i nie miała zdefiniowanej wielkości. W każdym razie, dalej coś nadpisuje na zajęte komórki i nie wiem dlaczego. Nie używam "new", wydaję mi się że jak coś definiuje to powinno to się zapisywać na nowej pamięci, więc w czym mam błąd? Nie można potem zrobić "delete" w runtime jakiemuś obiektowi albo zmiennej, ale przy takim małym programiku to nie ma znaczenia.

No i kolizje dalej pobugowane, jak się przesuwa kwadrat w dwóch kierunkach naraz.

0

Ok, naprawiłem brak kolizji z nowymi ścianami. To nawet nie był błąd funkcji StartItem, tylko problem z przyciskami myszki.

Próbowałem naprawić te kolizje, sprawdzać osobno każdy bok kwadratu gracza, ale to dalej jest pobugowane. Szukałem na necie jak to zrobić ale nie mogę nic znaleźć. Na tym zdjęciu jest przykład najważniejszego z problemów z kolizją.

JaVvzwJ.jpg

Powinno się wyświetlać w konsoli tylko "up" a wyświetlają się też dodatkowo left i right.

Kod źródłowy: https://www.dropbox.com/sh/y5d3wpxu3agjbcz/AAD0Q-mFVmZRQ0A52xqTSnzqa?dl=0 Kod kolizji jest w sciana.h i w głównym pliku gfdgd.cpp od 158 lini (powyżej wykomentowany, stary kod kolizji).

Rysunek pomocniczy: https://www.dropbox.com/s/a98k3xxb9idvxyr/adfga.jpg?dl=0

dodanie obrazka do załączników i treści posta - @furious programming

0

Zacznij od sensownego nazywania zmiennych... Co to ma być w ogóle lefter, higher - co to za słowa? :|
Nazwij je tak, aby niepotrzebny był żaden rysunek pomocniczy.

Btw, kwadrat zdefiniuj za pomocą dwóch lub czterech punktów, a nie nieokreślonej liczby zmiennych...
Btw2, a to, że szerokość gracza definiujesz przy użyciu nazwy boundx zasługuje na jakąś perełkę. width - mówi Ci to coś? :P

0

Po co mam zmieniać nazwy tych zmiennych, xLefter i xRighter dobrze opisują o co chodzi. Używam tyle zmiennych, dlatego że w programie te prostokąty są rysowane tak jak te niebieskie zaznaczenie w Windowsie lewym przyciskiem myszki - jeśli zaczniesz rysowanie od prawego wierzchołka to x2 będzie na lewo od x, podobnie na przemian może być w osi y, dlatego zmieniam je później tak, by było wiadomo który wierzchołek jest po której stronie używając dodatkowych zmiennych. Pewnie dało by się to lepiej rozwiązać, ale chciałbym żeby w ogóle coś działało, a nie, żeby było zoptymalizowane.

boundx używam bo tak było w tutorialu tutaj

1

No ale nie ma takiego słowa, jak lefter!
A higher znaczy coś zupełnie innego niż myślisz - jak już to upper albo top, ale i tak źle.

class Point { // lub `struct`, jak tam wolisz
  float x, y;
}

class Rectangle { // tutaj można by zrobić ładne dziedziczenie po jakimś `AbstractFigure`
  Point a, b;
}

To. To dobrze opisuje o co chodzi.

Edit: a ten tutorial jest beznadziejny (dziwne, bezcelowe komentarze, podejrzane nazewnictwo i zabawa w strukturalne C++) - wyrzuć go do kosza i zainwestuj w książkę :P

0
             
while (sciany[numScian].updateCollisions(player, sciany, numScian))
            {               
                player.reverseMove(keys);
            }
bool updateCollisions (Player &player, Sciana sciany[], int numScian) //wywoluje sie ta funkcje jako argument
        {                                                   //petli while: dopoki jest true to cofac polozenie obiektu
            int i = 0;                                  
            while (i < numScian)
            {
                if(sciany[i].live)
                {   
                    if ((player.x >= sciany[i].xRighter - camX) ||
                        (player.y >= sciany[i].yLower - camY) ||                             
                        (sciany[i].xLefter - camX >= player.x + player.boundx) ||                
                        (sciany[i].yHigher - camY >= player.y + player.boundy))              
                        i++;                        //jesli nie ma kolizji, to sprawdz nastepna sciane.                                                     
                    else return true;                                                                    
                }                                              
                else return false;
            }
            return false;
        }   
        void reverseMove (bool keys[])
        {
            camX -= keys[right];
            camX += keys[left];             
            camY -= keys[down];             
            camY += keys[up];
        }

Tak wyglada kod kolizji. Dalej nie działa dobrze, klinuje sie na scianach, przeskakuje przez nie, i dodatkowo po przejsciu na floatu w zmiennych poruszania sie, jest jitter gdy sie porusza na ukos "w sciane".
Tutaj cały kod https://www.dropbox.com/sh/y5d3wpxu3agjbcz/AAD0Q-mFVmZRQ0A52xqTSnzqa?dl=0
W zalaczniku gra do odpalenia. Trzeba nacisnac enter i potem myszka tworzymy sciany, jak zaznaczanie w windowsie i mozna sprawdzic wtedy te kolizje ze scianami.

0

pomocy

0

Pobrałem grę, kompletnie nie rozumiem co się tam dzieje, nawet nie wiem czy to są bugi czy to jest celowe, proszę, popraw ten kod, jest bardzo nieczytelny, te nazwy, to inicjowanie zmiennych, podziel kod na oddzielne pliki, to bardzo pomoże, ja bym zabrał się za to jeszcze raz i skupił się nad dopracowaniem wszystkiego po kolei, Ty wiesz co tam się dzieje, Ty wiesz jak to ma działać, ja nie i nawet nie wiem jak pomóc i jak zidentyfikować problem patrząc na tą grę.

0

pomocy

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