Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
1

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

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

Author24 — интернет-сервис помощи студентам
Как мне реализовать столкновение, что бы не проходить сквозь закрашенные квадраты а стоять на их,В 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2014, 07:17
Ответы с готовыми решениями:

Столкновение прямоугольника и спрайта
Уже 2 дня мучаюсь, вообщем: У меня есть прямоугольник, который всегда движется с верху в низ, то...

Столкновение Image и спрайта
Здравствуйте! Пишу небольшую игру на делфи и столкнулась с таким вопросом, можно ли как-то...

Размер квадратика в checkedListBox
Как изменить размер квадратика в checkedListBox? При изменении размера шрифта меняется лишь сам...

Анимация падения квадратика
Здравствуйте, нужно сделать анимацию, чтобы нарисованный квадратик падал вниз через какие-то...

3
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.07.2014, 12:15 2
Цитата Сообщение от Lynatik001 Посмотреть сообщение
сквозь закрашенные квадраты а стоять на их,В 2д игре
брать rect у игрока и у препятствия и чекать на пересечение(у rect есть свой метод для этого), если стали пересекаться, не двигаться

Добавлено через 2 минуты
хотя правильнее будет так, вот есть игрок, у него есть rect, при попытке движения создать новый rect с новыми координатами(сдвинутый) и его прочекать что он не пересекается ни с одним из rect-ов препятствий, или проверить границы rect-а что они находятся в области допустимых значений
1
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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
47 / 39 / 15
Регистрация: 28.09.2012
Сообщений: 818
28.07.2014, 15:07  [ТС] 4
Цитата Сообщение от Людвиг Бодмер Посмотреть сообщение
так там же в видео про это рассказывается, функция Collision за это отвечает. Вот такой примерно код:
Да но я не понял просто как он прощитивает именно берет те квадраты вокруг себя которые надо.
Я то могу скопировать, но мне интересно понять как). Что бы в след раз знать если что-то подобное понадобится
0
28.07.2014, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2014, 15:07
Помогаю со студенческими работами здесь

Перемещение квадратика по периметру экрана
Помогите, нужно написать код Перемещение квадратика по периметру экрана, по часовой стрелке (до тех...

Рандомное движение нарисованного квадратика по форме
Всем привет. Начал изучать язык Python. Появился вопрос, как сделать так чтобы нарисованный мной...

Показать движение квадратика по траектории состоящей из точек
Создайте программу которая показывает движение квадратика по траектории состоящей из 100 точек,...

Размер CheckBox и RadioButton (самого квадратика и кружочка)
Добрый День! Как при проектировании в дизайнере, или при выполнении программы изменить размер...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru