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

SFML - problem z kolizją między Tilemap a Player.

Object Storage Arubacloud
0 głosów
350 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Szedou Nowicjusz (200 p.)

Witam,

Staram się stworzyć prostą platformówke 2d w SFML coś jak Mario. Klasa Player do kolizji używa sf::RectangleShape, stworzyłem Tilemap wszystko się wyświetla jak powinno, Player colliduje z podlożem(1) i nie wylatuje poza mape. Moim problemem jest kolizja z Tilem - 2 czyli jezeli Playerem wejde w "2" z lewej lub prawej strony to sie zatrzymuje jezeli "wskocze" to na nim "stoje" :D coś takiego.

 

Wrzucam kod do Tilemap.h i Tilem.cpp

 

#pragma once

#include <SFML/Graphics.hpp>
#include <iostream>

#include "Player.h"

#include "Enemy.h"

using namespace std;
using namespace sf;

class newTiled{
    public:
        newTiled(void);
        ~newTiled(void);

        void draw(RenderWindow &);
        void Update(Player &player);

    private:

        int map_width = 42;
        int map_height = 12;


        Texture tileset_texture;
        Sprite tileset_sprite;

        Texture bg_txt;
        Sprite bg_sprite;

    int level[42 * 12] ={
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    };



};

#include "newTiled.h"
#include <cmath>

using namespace sf;
using namespace std;

newTiled::newTiled(){
    if(!tileset_texture.loadFromFile("assets/images/tajlmap.png"))
       return;

    if(!bg_txt.loadFromFile("assets/images/bg2.png"))
       return;


    tileset_sprite.setTexture(tileset_texture);
    bg_sprite.setTexture(bg_txt);


}

newTiled::~newTiled(){

}

void newTiled::draw(RenderWindow &window){
      window.draw(bg_sprite);

    for(int y = 0; y < map_height; ++y){
        for(int x = 0; x < map_width; ++x){
            int tilecount = x + y * map_width;

            tileset_sprite.setPosition(x * 64, y * 64);
            tileset_sprite.setTextureRect(IntRect(level[tilecount] * 64, 0, 64, 64));



            window.draw(tileset_sprite);
        }
    }

}

void newTiled::Update(Player &player){
        int playerTileX = floor((int)(player.getRect().getPosition().x / 64));
        int playerTileY = floor((int)(player.getRect().getPosition().y / 64));

      
                int tilecount = playerTileX + playerTileY * map_width;

                    if (level[tilecount] == 1){
                        player.m_onGround = true;
                    }else {
                        player.m_onGround = false;
                    }


                    if (level[tilecount] == 2){
                        //kolizja .....

                    }

}

 

komentarz 5 stycznia 2017 przez criss Mędrzec (172,590 p.)

Moim problemem jest kolizja z Tilem - 2 czyli jezeli Playerem wejde w "2" z lewej lub prawej strony to sie zatrzymuje jezeli "wskocze" to na nim "stoje" :D coś takiego.

Tzn. co jest problemem? To co napisałeś, to wizja jak powinno wyglądać, tak? Opisz co jest nie tak. 

komentarz 5 stycznia 2017 przez Szedou Nowicjusz (200 p.)
W sensie nie wiem jak obliczyć czy Player jest z lewej / prawej strony Tile'a czy od góry.

2 odpowiedzi

0 głosów
odpowiedź 5 stycznia 2017 przez Knayder Nałogowiec (37,640 p.)
A może spróbuj przesuwać obiekt, potem sprawdzać czy nie koliduje, a jeżeli tak to cofnij i przesuwaj o jeden tak długo, aż nie zacznie kolidować.
komentarz 5 stycznia 2017 przez criss Mędrzec (172,590 p.)
Koszmarnie kosztowny sposób :x
0 głosów
odpowiedź 5 stycznia 2017 przez criss Mędrzec (172,590 p.)
Policz najbliżej którego boku jednego obiektu znajduje się się kolidujący wierzchołek drugiego obiektu. Jeśli najbliżej mu do prawego/lewego, to oblicz różnice między x wierzchołka i x boku i odpowiednio przesuń drugi obiekt. Jeśli najbliżej do górnego boku, to ustaw go na platformie.

To na pewno nie jest najlepszy sposób (myśle, że nawet słaby), ale nie mam innego pomysłu.

Podobne pytania

0 głosów
1 odpowiedź 571 wizyt
pytanie zadane 31 lipca 2018 w C i C++ przez HitMan Użytkownik (850 p.)
0 głosów
0 odpowiedzi 158 wizyt
pytanie zadane 14 marca 2018 w C i C++ przez zpawlo00 Początkujący (310 p.)
0 głosów
1 odpowiedź 628 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Programeł Gaduła (3,500 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

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

...