• 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.

Aruba Cloud - Virtual Private Server VPS
0 głosów
523 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ź 867 wizyt
pytanie zadane 31 lipca 2018 w C i C++ przez HitMan Użytkownik (850 p.)
0 głosów
0 odpowiedzi 178 wizyt
pytanie zadane 14 marca 2018 w C i C++ przez zpawlo00 Początkujący (310 p.)
0 głosów
1 odpowiedź 914 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Programeł Gaduła (3,500 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...