Форум программистов, компьютерный форум CyberForum.ru

Столкновение спрайта и закрашеного квадратика - C++

Восстановить пароль Регистрация
 
Lynatik001
 Аватар для Lynatik001
34 / 28 / 2
Регистрация: 28.09.2012
Сообщений: 560
28.07.2014, 07:17     Столкновение спрайта и закрашеного квадратика #1
Как мне реализовать столкновение, что бы не проходить сквозь закрашенные квадраты а стоять на их,В 2д игре.
За код сильно не судить брал примеры с видео урока в котором вся каша была в одном лиш маине, немного подкорректировал части)) библиотека SFM, а еще бы с объяснениями очень важно понять еще. От столкновений не какой там физики не надо отлетаний, просто что бы он не проходил сквозь их и мог стоять на них.
Mario.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "stdafx.h"
#include "Player.h"
#include "Map.h"
#include <SFML\Graphics.hpp>
using namespace sf;
int _tmain(int argc, _TCHAR* argv[])
{
        float offsetX=0, offsetY=0;
        const int H = 13;
        const int W = 40;
 
 
    RenderWindow window(VideoMode(1200, 800), "Test!");
    Map *map = new Map(window);
    Texture t;
    t.loadFromFile("D:\\vse.gif");
    float frame = 0;
 
    Player p(t,offsetX,offsetY);
    Clock clock;
    while(window.isOpen())
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        time = time/800;
        Event event;
        while(window.pollEvent(event))
        {
            if(event.type == Event::Closed)
            {
                window.close();
            }
        }
    
        RectangleShape rectangle;
    
                    
            window.clear(Color::White);
            map->loadmap();
            p.update(time);
        window.draw(p.sprite);
        window.display();
        
    }
    
    return 0;
}
Map.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <SFML\Graphics.hpp>
#include "stdafx.h"
using namespace sf;
class Map
{
public:
    static const int W = 40;
    static const int H = 13;
    
    RenderWindow *window;
    Map(RenderWindow &window);
    String createmap();
    void loadmap();
 
};
Map.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include "Map.h"
#include <SFML\Graphics.hpp>
using namespace sf;
 
 
Map::Map(RenderWindow &window)
{
    this->window = &window;
    
}
 
 
 
void Map::loadmap()
{
                    String TileMap[H] = {
 
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B                                B     B",
"B         0000                BBBB     B",
"B                                B     B",
"BBB                              B     B",
"B              BB                BB    B",
"B              BB                      B",
"B    B         BB         BB           B",
"B    B         BB         BB           B",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",};
 
    RectangleShape rectangle( Vector2f(64, 64));
         for (int i=0; i<H; i++)
             for (int j=0; j<W ; j++)
                { 
                  if (TileMap[i][j]=='B') rectangle.setFillColor(Color::Black);
 
                  if (TileMap[i][j]=='0')  rectangle.setFillColor(Color::Green);
 
                  if (TileMap[i][j]==' ') continue;
 
                  rectangle.setPosition(j*64,i*64);
                  window->draw(rectangle);
 
                 
             }
}
Player.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <SFML\Graphics.hpp>
using namespace sf;
class Player {
 
 
 
 
    public:
        float currentFrame;
        bool onGround;
        FloatRect rect;
        Sprite sprite;
        float dx,dy;
        Player(Texture &image,float offsetX, float offsetY);
        void walk();
        void update(float time);
};
Player.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "stdafx.h"
#include "Player.h"
 
    Player::Player(Texture &image,float offsetX, float offsetY)
   {
    dx = dy = 0;
    sprite.setTexture(image);
    rect = FloatRect(75,17,75,80);
    currentFrame = 0;
    sprite.setTextureRect(IntRect(10,17,75,80));
   }
   void Player::walk()
   {
        if(Keyboard::isKeyPressed(Keyboard::Left))
        {
            dx = - 0.1;
        }
 
        if(Keyboard::isKeyPressed(Keyboard::Right))
        {
            dx =  0.1;
        }
 
        if(Keyboard::isKeyPressed(Keyboard::Up))
        {
            if(onGround){dy=-0.4;onGround=false;}
        }
   }
 
        
   void Player::update(float time)
   {
     
 
     if (!onGround) dy=dy+0.0005*time;
     rect.top += dy*time;
     onGround=false;
     if(rect.top > 700){rect.top=700;onGround=true;dy=0;}
 
      currentFrame += 0.005*time;
      if (currentFrame > 6) currentFrame -=6 ;
 
      walk();
        rect.top += dy * time;
        rect.left += dx * time;
 
      if (dx>0) sprite.setTextureRect(IntRect(75*int(currentFrame),17,75,80));
      if (dx<0) sprite.setTextureRect(IntRect(75*int(currentFrame)+75,17,-75,80));
      sprite.setPosition(rect.left, rect.top);
 
      dx=0;
   }
Добавлено через 2 часа 32 минуты
оуу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 07:17     Столкновение спрайта и закрашеного квадратика
Посмотрите здесь:

Графика С++, столкновение шаров C++
столкновение C++
C++ Столкновение объектов в играх
C++ Builder Движение спрайта по синусоиде
C++ Центральное столкновение шаров
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.07.2014, 12:15     Столкновение спрайта и закрашеного квадратика #2
Цитата Сообщение от Lynatik001 Посмотреть сообщение
сквозь закрашенные квадраты а стоять на их,В 2д игре
брать rect у игрока и у препятствия и чекать на пересечение(у rect есть свой метод для этого), если стали пересекаться, не двигаться

Добавлено через 2 минуты
хотя правильнее будет так, вот есть игрок, у него есть rect, при попытке движения создать новый rect с новыми координатами(сдвинутый) и его прочекать что он не пересекается ни с одним из rect-ов препятствий, или проверить границы rect-а что они находятся в области допустимых значений
Людвиг Бодмер
 Аватар для Людвиг Бодмер
212 / 209 / 70
Регистрация: 29.03.2013
Сообщений: 555
Завершенные тесты: 2
28.07.2014, 13:50     Столкновение спрайта и закрашеного квадратика #3
Lynatik001, так там же в видео про это рассказывается, функция Collision за это отвечает. Вот такой примерно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void update(float time)
    {
        rect.left+=dx*time;
        Collision(0);
        if (!onGround) dy=dy+0.001*time;
        rect.top +=dy*time;
        onGround=false;
        Collision(1);
        
 
        currentFrame+=0.005*time;
            if (currentFrame>6) currentFrame-=6;
 
            if (dx>0) sprite.setTextureRect(IntRect(356*int(currentFrame),17,75,80));
            if (dx<0) sprite.setTextureRect(IntRect(356*int(currentFrame)+75,17,-75,80));
 
        sprite.setPosition(rect.left,rect.top);
        dx=0;
    }
 
void Collision(int dir)
{
    for (int i=rect.top/32; i<(rect.top+rect.height)/32; i++)
        for (int j=rect.left/32; j<(rect.left+rect.width)/32; j++)
        {
            if (TileMap[i][j]=='B')
            {
                if ((dx>0) && (dir==0)) rect.left=j*32 - rect.width;
                if ((dx<0) && (dir==0)) rect.left=j*32+32;
                if ((dy>0) && (dir==1)) {rect.top=i*32 - rect.height; dy=0; onGround=true;}
                if ((dy<0) && (dir==1)) {rect.left=j*32+32; dy=0;}
            }
        }
}
Lynatik001
 Аватар для Lynatik001
34 / 28 / 2
Регистрация: 28.09.2012
Сообщений: 560
28.07.2014, 15:07  [ТС]     Столкновение спрайта и закрашеного квадратика #4
Цитата Сообщение от Людвиг Бодмер Посмотреть сообщение
так там же в видео про это рассказывается, функция Collision за это отвечает. Вот такой примерно код:
Да но я не понял просто как он прощитивает именно берет те квадраты вокруг себя которые надо.
Я то могу скопировать, но мне интересно понять как). Что бы в след раз знать если что-то подобное понадобится
Yandex
Объявления
28.07.2014, 15:07     Столкновение спрайта и закрашеного квадратика
Ответ Создать тему
Опции темы

Текущее время: 17:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru