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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lynatik001
38 / 32 / 4
Регистрация: 28.09.2012
Сообщений: 620
#1

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

28.07.2014, 07:17. Просмотров 824. Ответов 3
Метки нет (Все метки)

Как мне реализовать столкновение, что бы не проходить сквозь закрашенные квадраты а стоять на их,В 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 минуты
оуу
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 07:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Столкновение спрайта и закрашеного квадратика (C++):

Вместо отображения спрайта выводится белый квадрат в окне: в чём ошибка? - C++
В чем может быть ошибка? Вместо отображения спрайта выводиться белый квадрат в окне. #include &lt;SFML\Graphics.hpp&gt; class test { ...

столкновение - C++
Ф ребята, я вот хочу написать примитивную игру, типа гонки(так сказать) на С++, но никак не могу реализовать сталкивание(((... Посмотрите...

Столкновение функций - C++
У меня при работе программы получается странная ситуация: 1) включается программа 2) в дополнительном потоке включается...

Столкновение шаров - C++
Помогите пожалуйста написать условие столкновения шаров void impact(Sphera &amp; a,Sphera &amp; b) { ...

Столкновение окружности с прямоугольником - C++
1) Как определить момент столкновения окружности с прямоугольником? 2) Как отразить направление окружности в момент столкновения с одной...

Центральное столкновение шаров - C++
Здравствуйте! Написал программу для центрального столкновения двух шаров...но программа выполняется некорректно....подскажите, что не так...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.07.2014, 12:15 #2
Цитата Сообщение от Lynatik001 Посмотреть сообщение
сквозь закрашенные квадраты а стоять на их,В 2д игре
брать rect у игрока и у препятствия и чекать на пересечение(у rect есть свой метод для этого), если стали пересекаться, не двигаться

Добавлено через 2 минуты
хотя правильнее будет так, вот есть игрок, у него есть rect, при попытке движения создать новый rect с новыми координатами(сдвинутый) и его прочекать что он не пересекается ни с одним из rect-ов препятствий, или проверить границы rect-а что они находятся в области допустимых значений
1
Людвиг Бодмер
345 / 342 / 132
Регистрация: 29.03.2013
Сообщений: 848
Завершенные тесты: 4
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;}
            }
        }
}
1
Lynatik001
38 / 32 / 4
Регистрация: 28.09.2012
Сообщений: 620
28.07.2014, 15:07  [ТС] #4
Цитата Сообщение от Людвиг Бодмер Посмотреть сообщение
так там же в видео про это рассказывается, функция Collision за это отвечает. Вот такой примерно код:
Да но я не понял просто как он прощитивает именно берет те квадраты вокруг себя которые надо.
Я то могу скопировать, но мне интересно понять как). Что бы в след раз знать если что-то подобное понадобится
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 15:07
Привет! Вот еще темы с ответами:

Столкновение двух окружностей - C++
Итак,я сталкиваю два шарика(но вообще их больше,массив). Какое-то время после старта программы все нормально,однако спустя некоторое...

Столкновение объектов в играх - C++
Кто что подскажет/посоветует_почитать по поводу физики в играх, в частности столкновения объектов. (интересует само решение задач,...

Графика С++, столкновение шаров - C++
дана задача: на экране движутся два шара разного размера и разной скоростью. Начальны размер выбирается пользователем (из 3-х вариантов),...

Реализовать столкновение шарика со стенкой - C++
Делаю очень примитивную игру - лабиринт, необходимо чтобы шарик сталкивался со стенкой. Условие столкновения есть: if (ball.x &lt; h_wall.x...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.07.2014, 15:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru