Форум программистов, компьютерный форум, киберфорум
XNA/MonoGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 16

Столкновение 2D объектов

06.01.2012, 15:27. Показов 10345. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю игру -арканоид, и сталкнулся с такой проблемой, когда шарик сталкивается с правой или левой стороной ракетки(пратформы), он(шарик) залетает в нутрь платформы, а не отталкивается от неё. Также дела обстоят и с блоками, которые он(шарик) должен сбивать.

Вот кусок кода, представляющий коллизию между шариком и платфомой:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 if ((ball.ballPosition.Y <= platform.platformPosition.Y + platform.platformSize.Y) && //граница платформы снизу
                    (ball.ballPosition.Y + ball.ballSize.Y >= platform.platformPosition.Y) &&         //граница платформы сверху
                    (ball.ballPosition.X + ball.ballSize.X >= platform.platformPosition.X) &&         //граница платформы слева
                    (ball.ballPosition.X <= platform.platformPosition.X + platform.platformSize.X))   //граница платформы справа
                {
                    if ((ball.ballPosition.Y <= platform.platformPosition.Y + platform.platformSize.Y) && (ball.ballPosition.Y + ball.ballSize.Y >= platform.platformPosition.Y))
                    {
                        ball.ballVelocity.Y = -r.Next(0, 6);
                    }
                    else if ((ball.ballPosition.X + ball.ballSize.X >= platform.platformPosition.X) && (ball.ballPosition.X <= platform.platformPosition.X + platform.platformSize.X))
                    {
                        ball.ballVelocity.X = -r.Next(0, 6);
                    }
                }
Код для коллизии с блоками аналогичен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2012, 15:27
Ответы с готовыми решениями:

Столкновение объектов
Добрый день. Столкнулся с следующей проблемой. Я с помощью коллекции прорисовываю звезды. При столкновении персонажа с звездой текстура...

Столкновение объектов
Делаю игру Танчики. Возникла проблема при столкновении Танка со стенами. Сделал движение танка, но я не понимаю, как заставить его...

Как сделать, чтобы столкновение объектов было абсолютно неупругим
Нашел пример попиксельного столкновения. Работает прекрасно, но что делать в момент столкновения, если нужно, чтоб оно было абсолютно...

69
3 / 3 / 0
Регистрация: 22.01.2014
Сообщений: 38
24.01.2014, 18:55
Студворк — интернет-сервис помощи студентам
Вложение 358145

Нужно вычислить уголы -- от каждой крайней точки прямоугольника к его центру.
Потом угол от точки объекта (маленькая чёрная) к центру прямоугольника.
Далее проверять этот угол на принадлежность к опр. сектору, учитывая его dX и dY

Например: если точка объекта в правом секторе и dX влево, то надо отразить. Так уже не будет лишний раз отражаться отражённое (т.к DX уже вправо).
Миниатюры
Столкновение 2D объектов  
0
0 / 0 / 0
Регистрация: 28.08.2013
Сообщений: 7
25.01.2014, 21:10
Цитата Сообщение от quqeiqa Посмотреть сообщение
Вложение 358145

Нужно вычислить уголы -- от каждой крайней точки прямоугольника к его центру.
Потом угол от точки объекта (маленькая чёрная) к центру прямоугольника.
Далее проверять этот угол на принадлежность к опр. сектору, учитывая его dX и dY

Например: если точка объекта в правом секторе и dX влево, то надо отразить. Так уже не будет лишний раз отражаться отражённое (т.к DX уже вправо).
Вы наверно имеете в виду по очереди проверять по очереди отрезки координат на то что перекрещиваются ли они с другими координатами? Если да то можно ли по подробнее или ссылку на статью? Давно такая мысль но как то тяжело толком осознать. Я умею расчитывать центр массы объекта но чтобы создать полную симуляцию физики мне не хватает реализовать нормальную коллизию объектов.
0
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 12
18.03.2014, 16:19

Начал пару дней назад изучать XNA и никак не могу понять как сделать так, что бы тот красный чувак при пересечении с паутиной тормозился.


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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
namespace _123{
    public class Game1 : Microsoft.Xna.Framework.Game{
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
 
        private Texture2D snowman_texture_to_rihgt;
        private Texture2D snowman_texture_to_left;
        private Texture2D snowman_texture_steal_to_right;
        private Texture2D snowman_texture_steal_to_left;
        private Rectangle snowman_rectangle;
        private Rectangle snowman_rectangle_steal;
        private Vector2 snowman_position;
        private Vector2 snowman_velocity;
        private Texture2D web_1_texture;
        private Rectangle web_1_rectangle;
 
        private bool smAlreadyJump = true;
        private float main_velocity = 5f;
        private int current_texture_snowman;
 
 
        public Game1(){
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.PreferredBackBufferWidth = 960;
            graphics.PreferredBackBufferHeight = 540;
            IsMouseVisible = true;
        }
 
        protected override void Initialize(){
            base.Initialize();
        }
 
        protected override void LoadContent(){
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            snowman_texture_to_rihgt = Content.Load<Texture2D>("snowman");
            snowman_texture_to_left = Content.Load<Texture2D>("snowman_reverse");
            snowman_rectangle = new Rectangle(0, 0, snowman_texture_to_rihgt.Width, snowman_texture_to_rihgt.Height);
 
            snowman_texture_steal_to_left = Content.Load<Texture2D>("snowman_steal");
            snowman_texture_steal_to_right = Content.Load<Texture2D>("snowman_steal_reverse");
            snowman_rectangle_steal = new Rectangle(0, 0, snowman_texture_steal_to_right.Width, snowman_texture_steal_to_right.Height);
 
 
            web_1_texture = Content.Load<Texture2D>("web_1");
            web_1_rectangle = new Rectangle(350, 340, 300, 200);
 
        }
 
        protected override void UnloadContent(){}
 
        protected override void Update(GameTime gameTime){
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
            base.Update(gameTime);
 
            snowman_position += snowman_velocity;
 
            //Управление
            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                snowman_velocity.X = main_velocity; current_texture_snowman = 1;
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                snowman_velocity.X = -main_velocity; current_texture_snowman = 2;
            }
            else
                snowman_velocity.X = 0f;
            if (Keyboard.GetState().IsKeyDown(Keys.Up) && smAlreadyJump == false)
            {
                snowman_position.Y -= 10f;
                snowman_velocity.Y = -5f;
                smAlreadyJump = true;
            }
 
            bool a = snowman_rectangle.Intersects(web_1_rectangle);
            if (a == true) snowman_velocity.X = 1f;
 
            if (Keyboard.GetState().IsKeyDown(Keys.Down) && Keyboard.GetState().IsKeyDown(Keys.Left))
                current_texture_snowman = 3;
            if (Keyboard.GetState().IsKeyDown(Keys.Down) && Keyboard.GetState().IsKeyDown(Keys.Right))
                current_texture_snowman = 4;
 
            //Ограничитель
            if (snowman_position.X <= 0)
                snowman_position.X = 0;
            if (snowman_position.Y <= 0)
                snowman_position.Y = 0;
 
            if (current_texture_snowman == 1 || current_texture_snowman == 2){
                if (snowman_position.X + snowman_texture_to_rihgt.Width >= 960)
                    snowman_position.X = 960 - snowman_texture_to_rihgt.Width;
                if (snowman_position.Y + snowman_texture_to_rihgt.Height >= 540)
                    snowman_position.Y = 540 - snowman_texture_to_rihgt.Height;
            }
 
 
            if (current_texture_snowman == 3 || current_texture_snowman == 4){
                if (snowman_position.Y + snowman_texture_to_rihgt.Height >= 540)
                    snowman_position.Y = 540 - snowman_texture_steal_to_right.Height;
                if (snowman_position.X + snowman_texture_to_rihgt.Width >= 960)
                    snowman_position.X = 960 - snowman_texture_steal_to_right.Width;
            }
 
 
 
            //Гравитация
            if (smAlreadyJump == true)
            {
                float i = 1;
                snowman_velocity.Y += 0.20f * i;
            }
            if (snowman_position.Y + snowman_texture_to_rihgt.Height >= 540)
                smAlreadyJump = false;
            if (smAlreadyJump == false)
                snowman_velocity.Y = 0f;
 
            
        }
 
        protected override void Draw(GameTime gameTime){
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            base.Draw(gameTime);
 
            spriteBatch.Begin();
 
            spriteBatch.Draw(web_1_texture, web_1_rectangle, Color.White);
            if (current_texture_snowman == 1) spriteBatch.Draw(snowman_texture_to_rihgt, snowman_position, snowman_rectangle, Color.White);
            if (current_texture_snowman == 2) spriteBatch.Draw(snowman_texture_to_left, snowman_position, snowman_rectangle, Color.White);
            if (current_texture_snowman == 3) spriteBatch.Draw(snowman_texture_steal_to_right, snowman_position, snowman_rectangle_steal, Color.White);
            if (current_texture_snowman == 4) spriteBatch.Draw(snowman_texture_steal_to_left, snowman_position, snowman_rectangle_steal, Color.White);
            
            spriteBatch.End();
        }
 
    }//public class Game1 : Microsoft.Xna.Framework.Game
}//namespace
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.03.2014, 07:57
на форуме есть специальная тема для XNA, там есть раздел Книги и ресурсы по Майкрософт XNA, в котором есть ссылка на видео уроки Ивана Андреева, который доступным языком объясняет и показывает как взаимодействуют и сталкиваются объекты.
2
0 / 0 / 1
Регистрация: 11.12.2013
Сообщений: 28
23.03.2014, 20:55
Всем здрасьте! Нужно немного помощи. Пытаюсь написать какое-то подобие battle-city с дэнди. Есть 2 вектора2 (для каждого танка свой). Есть ли у vector2 что-то подобное Rectangle.Intersects()??? Нужно прописать, что если края текстурок прикасаются, то танк не может двикаться в сторону прикосновения. Поможете с кодом?

Game1.cs
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
namespace My_battle_city_OK
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
 
 
        Texture2D p1_tank_texture;
        Vector2 p1_tank_position;
 
        P1_Tank p1_tank;
 
 
        Texture2D p2_tank_texture;
        Vector2 p2_tank_position;
 
        P2_Tank p2_tank;
 
 
 
 
 
        public Game1()  //CONSTRUCTOR
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.PreferredBackBufferWidth = 1000;
            graphics.PreferredBackBufferHeight = 650;
        }//CONSTRUCTOR
 
 
 
 
 
        protected override void Initialize()    //INITIALIZE
        {
            base.Initialize();
        }//INITIALIZE
 
 
 
 
 
 
        protected override void LoadContent()   //LOAD
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            p1_tank_texture = Content.Load<Texture2D>(@"textures\p1_tank");
            p1_tank_position = new Vector2(25 * 3, 25 * 23);//hor - 40/25, vert - 26/25
            p1_tank = new P1_Tank(p1_tank_texture, p1_tank_position);
 
            p2_tank_texture = Content.Load<Texture2D>(@"textures\p2_tank");
            p2_tank_position = new Vector2(25 * 37, 25 * 3);
            p2_tank = new P2_Tank(p2_tank_texture, p2_tank_position);
        }//LOAD
 
 
 
 
 
        protected override void UnloadContent() //UNLOAD
        {
 
        }//UNLOAD
 
 
 
 
 
        protected override void Update(GameTime gameTime)   //UPDATE
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
            KeyboardState kbState = Keyboard.GetState();
            p1_tank.Move(gameTime);
            p2_tank.Move(gameTime);
 
            base.Update(gameTime);
        }//UPDATE
 
 
 
 
 
        protected override void Draw(GameTime gameTime) //DRAW
        {
            GraphicsDevice.Clear(Color.Black);
 
            spriteBatch.Begin();
 
                p1_tank.Draw(spriteBatch);
                p2_tank.Draw(spriteBatch);
 
            spriteBatch.End();
 
            base.Draw(gameTime);
        }//DRAW
    }
}
Танк первого игрока
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input; 
 
namespace My_battle_city_OK
{
    class P1_Tank
    {
        Texture2D tank_texture;
        Vector2 tank_position;
 
        enum direction {up, down, left, right};
        direction move; //направления движения танка
 
        float tank_speed = 0.4f;
 
        float tank_rotation; //Угол поворота танка
        float PI = (float)Math.PI;
 
        bool move_up;   //4 переменных должны использоваться для блокировки движения
        bool move_down;
        bool move_left;
        bool move_right;
 
 
 
 
 
        public P1_Tank(Texture2D texture, Vector2 position)//CONSTRUCTOR
        {
            tank_texture = texture;
            tank_position = position;
            move_up = true;
            move_down = true;
            move_left = true;
            move_right = true;
        }//CONSTRUCTOR
 
 
 
 
 
        public void Move(GameTime gameTime)  //MOVE
        {
            KeyboardState kbState = Keyboard.GetState();
            #region MOVING KEYS PRESS
            if (kbState.IsKeyDown(Keys.W) && !kbState.IsKeyDown(Keys.S) && !kbState.IsKeyDown(Keys.A) && !kbState.IsKeyDown(Keys.D))
            {
                if (move_up)
                {
                    move = direction.up;
                    tank_position.Y -= tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = 0;
                    move_down = true;
                    move_left = true;
                    move_right = true;
                }
            }//Up
 
            if (kbState.IsKeyDown(Keys.S) && !kbState.IsKeyDown(Keys.W) && !kbState.IsKeyDown(Keys.A) && !kbState.IsKeyDown(Keys.D))
            {
                if (move_down)
                {
                    move = direction.down;
                    tank_position.Y += tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = PI;
                    move_up = true;
                    move_left = true;
                    move_right = true;
                }
            }//Down
 
            if (kbState.IsKeyDown(Keys.A) && !kbState.IsKeyDown(Keys.W) &&  !kbState.IsKeyDown(Keys.S) && !kbState.IsKeyDown(Keys.D))
            {
                if (move_left)
                {
                    move = direction.left;
                    tank_position.X -= tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = -PI / 2;
                    move_up = true;
                    move_down = true;
                    move_right = true;
                }
            }//Left
 
            if (kbState.IsKeyDown(Keys.D) && !kbState.IsKeyDown(Keys.W) && !kbState.IsKeyDown(Keys.A) && !kbState.IsKeyDown(Keys.S))
            {
                if (move_right)
                {
                    move = direction.right;
                    tank_position.X += tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = PI / 2;
                    move_up = true;
                    move_down = true;
                    move_left = true;
                }
            }//Right
            #endregion
        }//MOVE
 
 
 
 
 
        public void Draw(SpriteBatch spriteBatch)   //DRAW
        {
            spriteBatch.Draw(tank_texture,
                       new Vector2(tank_position.X, tank_position.Y), //drawing position
                       new Rectangle(0, 0, tank_texture.Width, tank_texture.Height),
                       Color.White,
                       tank_rotation, //Angle(in radian)
                       new Vector2(tank_texture.Width / 2, tank_texture.Height / 2), //rotation center
                       1, //Коэфф. масштабирования
                       SpriteEffects.None,
                       0);
        }//DRAW
    }
}
Танк второго игрока
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input; 
 
namespace My_battle_city_OK
{
    class P2_Tank
    {
        Texture2D tank_texture;
        Vector2 tank_position;
 
        enum direction { up, down, left, right};
        direction move;
 
        float tank_speed = 0.4f;
 
        float tank_rotation;
        float PI = (float)Math.PI;
 
        bool move_up;
        bool move_down;
        bool move_left;
        bool move_right;
 
 
 
 
 
        public P2_Tank(Texture2D texture, Vector2 position)//CONSTRUCTOR
        {
            tank_texture = texture;
            tank_position = position;
            move_up = true;
            move_down = true;
            move_left = true;
            move_right = true;
        }//CONSTRUCTOR
 
 
 
 
 
        public void Move(GameTime gameTime)  //MOVE
        {
            KeyboardState kbState = Keyboard.GetState();
            #region MOVING KEYS PRESS
            if (kbState.IsKeyDown(Keys.Up) && !kbState.IsKeyDown(Keys.Down) && !kbState.IsKeyDown(Keys.Left) && !kbState.IsKeyDown(Keys.Right))
            {
                if (move_up)
                {
                    move = direction.up;
                    tank_position.Y -= tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = 0;
                    move_down = true;
                    move_left = true;
                    move_right = true;
                }
            }//Up
 
            if (kbState.IsKeyDown(Keys.Down) && !kbState.IsKeyDown(Keys.Up) && !kbState.IsKeyDown(Keys.Left) && !kbState.IsKeyDown(Keys.Right))
            {
                if (move_down)
                {
                    move = direction.down;
                    tank_position.Y += tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = PI;
                    move_up = true;
                    move_left = true;
                    move_right = true;
                }
            }//Down
 
            if (kbState.IsKeyDown(Keys.Left) && !kbState.IsKeyDown(Keys.Up) &&  !kbState.IsKeyDown(Keys.Down) && !kbState.IsKeyDown(Keys.Right))
            {
                if (move_left)
                {
                    move = direction.left;
                    tank_position.X -= tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = -PI / 2;
                    move_up = true;
                    move_down = true;
                    move_right = true;
                }
            }//Left
 
            if (kbState.IsKeyDown(Keys.Right) && !kbState.IsKeyDown(Keys.Up) && !kbState.IsKeyDown(Keys.Left) && !kbState.IsKeyDown(Keys.Down))
            {
                if (move_right)
                {
                    move = direction.right;
                    tank_position.X += tank_speed * gameTime.ElapsedGameTime.Milliseconds;
                    tank_rotation = PI / 2;
                    move_up = true;
                    move_down = true;
                    move_left = true;
                }
            }//Right
            #endregion
        }//MOVE
 
 
 
 
 
        public void Draw(SpriteBatch spriteBatch)   //DRAW
        {
            spriteBatch.Draw(tank_texture,
                       new Vector2(tank_position.X, tank_position.Y), //drawing position
                       new Rectangle(0, 0, tank_texture.Width, tank_texture.Height),
                       Color.White,
                       tank_rotation, //Angle(in radian)
                       new Vector2(tank_texture.Width / 2, tank_texture.Height / 2), //rotation center
                       1, //Коэфф. масштабирования
                       SpriteEffects.None,
                       0);
        }//DRAW
    }
}
0
 Аватар для makedonsky94
45 / 45 / 4
Регистрация: 14.02.2013
Сообщений: 139
24.03.2014, 11:02
Vector2 - это точка в двумерном пространстве, используйте Rectangle
0
 Аватар для CSharpCraft
58 / 58 / 9
Регистрация: 09.01.2013
Сообщений: 247
25.03.2014, 09:55
А может использовать Vector2.Distance? если меньше суммы радиусов объектов - пересечение есть
0
13 / 13 / 3
Регистрация: 30.06.2013
Сообщений: 168
07.05.2014, 14:08
C#
1
if (ball.rect2.Intersects(box[j, i].rect2))
как сделать столкновение с разными краями? например с верхом низом правой стороной левой стороной? (ball.rect2.Intersects(box[j, i].rect2.Bottom)) // есть такое но не работает

Добавлено через 6 часов 15 минут
как узнать с какой гранью столкнулся мяч?
0
 Аватар для nikita12100
3 / 3 / 1
Регистрация: 19.09.2012
Сообщений: 22
07.05.2014, 20:34
Добрый день.
Если мне не изменяет память , то вот так :
C#
1
2
3
4
5
6
if (ball.rect2.Top > box.rect1.Bottom)  //если верх первого прямоугольника выше , чем низ второго .
/* Top - верх
    Bottom - низ 
    Right - правая сторона 
    Left - левая сторона
*/
0
0 / 0 / 0
Регистрация: 04.05.2014
Сообщений: 28
08.07.2014, 11:33
Допустим есть List, в нем 3 Rectangle, как можно обработать их столкновение с другим Rectangle?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.07.2014, 11:33

Столкновение Объектов в Играх
Код определяет столкновение по х и y. if ((obj1.x + obj1.width &gt;= obj2.x) &amp;&amp; (obj1.x &lt;= obj2.x + obj2.width)) XColl = true; if...

Столкновение объектов
Стоит задача, нужно что бы сгенерированые объекты двигались в сторону сферы(которая может менять положение) с которой затем бы...

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

Столкновение объектов
Нужна помощь по столкновению. Нашол код столкновения в инете, и вставил в свой код. Столкновение работает как бы, но если два препядствия...

Столкновение объектов в 3d
Есть несколько фигур - примитивов(куб, сфера, Прямоугольный параллелепипед). У куба и ПП даны: позиция, вершины, поворот; У сферы:...


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

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru