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

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

06.01.2012, 15:27. Показов 10337. Ответов 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
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 13
30.07.2012, 14:29
Студворк — интернет-сервис помощи студентам
Сделал два объекта (квадраты). Первый объект движется самостоятельно и отбивается от стен, второй управляется с клавиатуры. Каждый объект имеет свой класс.
Задача в том что бы при столкновении объектов первый отбивался от второго.

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

Вот код класса первого объекта:
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
 public class Cube
    {
        Texture2D cubeTexture;
        public Rectangle rect;
        int dx = 5;
        int dy = 5;
        Cube1 cube1;
        public BoundingBox bbCube;
    public Cube()
    {
        rect = new Rectangle(340, 150, 40, 40);
        cube1 = new Cube1();
     }
    public void Load(ContentManager Content, string cube)
    {
        cubeTexture = Content.Load<Texture2D>(cube);
    }
    public void Update(GameTime gameTime)
    {
        rect.Offset(dx * gameTime.ElapsedGameTime.Milliseconds / 30,
        dy * gameTime.ElapsedGameTime.Milliseconds / 30);
 
        if (rect.Right > 640)
            dx = -Math.Abs(dx);
        if (rect.Bottom > 480)
            dy = -Math.Abs(dy);
        if (rect.Left < 0)
            dx = Math.Abs(dx);
        if (rect.Top < 0)
            dy = Math.Abs(dy);
 
        if((rect.Bottom == cube1.rect1.Top)&&(rect.Width+rect.Left>cube1.rect1.Left)&&(rect.Right-rect.Width<cube1.rect1.Right))
            dy = -Math.Abs(dy);
        if ((rect.Left == cube1.rect1.Right)&&(rect.Height+rect.Top>cube1.rect1.Top)&&(rect.Bottom-rect.Height<cube1.rect1.Bottom))
            dx = Math.Abs(dx);
        if ((rect.Top == cube1.rect1.Bottom) && (rect.Width + rect.Left > cube1.rect1.Left) && (rect.Right - rect.Width < cube1.rect1.Right))
            dy = Math.Abs(dy);
        if ((rect.Right == cube1.rect1.Left) && (rect.Height + rect.Top > cube1.rect1.Top) && (rect.Bottom - rect.Height < cube1.rect1.Bottom))
            dx = -Math.Abs(dx);
    }
    public void Collision(GameTime gameTime)
    {
    }
    public void Draw(SpriteBatch SpriteBatch)
    {
        SpriteBatch.Draw(cubeTexture, rect, Color.White);
    }
    }
Вот код класса первого объекта:
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
class Cube1
    {
        Texture2D cubeTexture1;
        public Rectangle rect1;
        KeyboardState kbState;
        public Cube1()
        {
            rect1 = new Rectangle(180, 200, 40, 40);
        }
        public void Load(ContentManager Content, string cube1)
        {
            cubeTexture1 = Content.Load<Texture2D>(cube1);
        }
        public void Move()
        {
            kbState = Keyboard.GetState();
            if (kbState.IsKeyDown(Keys.Up)&&(rect1.Top>0))
                rect1.Offset(0, -5);
            if (kbState.IsKeyDown(Keys.Down) && (rect1.Bottom < 480))
                rect1.Offset(0, 5);
            if (kbState.IsKeyDown(Keys.Left) && (rect1.Left > 0))
                rect1.Offset(-5, 0);
            if (kbState.IsKeyDown(Keys.Right) && (rect1.Right < 640))
                rect1.Offset(5, 0);
        }
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(cubeTexture1, rect1, Color.White);
        }
    }
0
brony
77 / 57 / 4
Регистрация: 02.01.2012
Сообщений: 521
30.07.2012, 18:52
http://habrahabr.ru/post/147863/
2
24 / 23 / 3
Регистрация: 21.04.2012
Сообщений: 253
15.08.2012, 02:27
Первый раз пишу игру. Это для справки )
Это простенькое обучение, я уже сделал, чтобы герой двигался и т.п. Но мне надо, чтобы при столкновении спрайта kick и спрайта opponent происходило взаимодействие. То есть враг получал урон)
Как мне узнать : пересеклись ли они ?

Могу добавить, что координата Y всегда 200, а модель удара по размерам 175x200 . Противник 125x200.
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
15.08.2012, 13:02
http://www.techdays.ru/videos/2882.html
там есть ответ на твой вопрос с объяснением.
0
 Аватар для GDev
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
24.10.2012, 19:16
Возникла проблема с обработкой столкновения объектов.
Контекст следующий:
человечек бегает по блокам (типа вид сбоку)
Подробнее - массив из "блоков" - точнее двумерный массив enum`ов, содержит информацию о типе блока (0 - пустой, 1,2... - разные текстуры)
все блоки квадратные 32х32 и не двигаются. массив отрисовывается слева направо снизу вверх (то есть ось x обычная а ось y - как в обычной геометрии то есть инвертирована относительно игровой)
Кроме того есть игровой объект(ы) (типа игрок) который представлен в виде точки. нужно чтобы эта точка нормально перемещалась (управление с клавиатуры) учитывая ненулевые блоки.
казалось бы просто но наверное у меня кривые руки и я сделал не очень хорошо. подлагивает во всех смыслах. в смысле производительности и в смысле логичности.

вот код обновления игрока и то что с ним непосредственно связано. Int2 - просто структура типа Vector2 но с int вместо float и без функций (служит для хранения позиции в массиве, в том числе и мнимой позиции)
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
        public override void Update(GameTime gameTime)
        {
            p = BlockPos;
            if (hasGrav && !isStanding)
                vel = Vector2.Add(vel, TheGame.grav);
            TraceMove(ref pos, ref vel, gameTime, p);
            if (vel.Length()!=0)
            {
                vel = Vector2.Multiply(vel, 0.8f);
                if (vel.LengthSquared() < 0.01f)
                    vel = new Vector2(0, 0);
            }
            base.Update(gameTime);
        }
 
        public static void TraceMove(ref Vector2 pos, ref Vector2 svel, GameTime gTime, Int2 sp)
        {
            if (svel.Length() == 0)
                return;
            if (!CBlock.ValidP(sp.x, sp.y))
            {
                pos = new Vector2(0, CBlock.GetHeight(0)); 
                return;
            }
            Vector2 vel = Vector2.Multiply(svel, (float)gTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
            Vector2 target = Vector2.Add(pos, vel);
            Int2 ptarget = new Int2(target);
            if (sp.x == ptarget.x && sp.y == ptarget.y)
            {
                pos = Vector2.Add(pos, vel);
                return;
            }
            Vector2 delta = Vector2.Normalize(vel);
            Int2 p = sp;
            bool stX = (svel.X == 0);
            bool stY = (svel.Y == 0);
            while (true)
            {
                p = new Int2(pos);
                if (p.x == ptarget.x && p.y == ptarget.y)
                {
                    pos = Vector2.Add(pos, vel);
                    return;
                }
                
                if (delta.X > 0 && !stX)
                {
                    if (pos.X > target.X)
                    {
                        pos.X = target.X;
                        stX = true;
                        continue;
                    }
                    if (CBlock.GetID_RightBlock(p.x, p.y) == 0)
                    {
                        pos = Vector2.Add(pos, delta);
                    }
                    else
                    {
                        svel.X = svel.X / (-10f);
                        pos.X = (p.x - CBlock.widthD2) * 32;//TODO:SIZE
                        ptarget.x = p.x;
                        stX = true;
                    }
                }
                if (delta.X < 0 && !stX)
                {
                    if (pos.X < target.X)
                    {
                        pos.X = target.X;
                        stX = true;
                        continue;
                    }
                    if (CBlock.GetID_LeftBlock(p.x, p.y) == 0)
                    {
                        pos = Vector2.Add(pos, delta);
                    }
                    else
                    {
                        svel.X = svel.X / (-10f);
                        pos.X = (p.x + 0.9f - CBlock.widthD2) * 32;//TODO:SIZE
                        ptarget.x = p.x;
                        stX = true;
                    }
                }
                if (delta.Y > 0 && !stY)
                {
                    if (pos.Y > target.Y)
                    {
                        pos.Y = target.Y;
                        stY = true;
                        continue;
                    }
                    if (CBlock.GetID_UpperBlock(p.x, p.y) == 0)
                    {
                        pos = Vector2.Add(pos, delta);
                    }
                    else
                    {
                        //svel.Y = svel.Y / (-10f);
                        pos.Y = p.y * 32;//TODO:SIZE
                        ptarget.y = p.y;
                        stY = true;
                    }
                }
                if (delta.Y < 0 && !stY)
                {
                    if (pos.Y < target.Y)
                    {
                        pos.Y = target.Y;
                        stY = true;
                        continue;
                    }
                    if (CBlock.GetID_UnderBlock(p.x, p.y) == 0)
                    {
                        pos = Vector2.Add(pos, delta);
                    }
                    else
                    {
                        svel.Y = 0;// -svel.Y;
                        pos.Y = (p.y+0.5f) * 32;//TODO:SIZE
                        ptarget.y = p.y;
                        stY = true;
                    }
                }
            }
        }
способ наверно покажется глупым но мне другой в голову не пришел. обрабатывать весь массив скорее всего будет нерационально (размеры могут быть относительно большими - порядка 16384 х 512)
Подскажите пожалуйста, как исправить мое убожество или, быть может, есть алгоритм поумнее?
Весь проект вложен
Вложения
Тип файла: zip ball_rampage.zip (418.4 Кб, 12 просмотров)
0
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
25.10.2012, 00:37
Зачем обрабатывать весь массив ? Надо просто получить блок на котором стоит игрок, и взять для проверки все ближайшие к нему блоки на определённом расстоянии, например в 1 блок. и просто проверить коллизию с ними, если факт коллизии есть, тогда например выровнять перса или вернуть точку коллизии ...
Так же делать и с рендером мира, чтобы не рисовать 16384 х 512 блоков, а выбрать только видимые и нарисовать.
0
 Аватар для GDev
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
25.10.2012, 09:09
так я это и делаю. просто с поправкой на то что скорость и положение могут быть абсолютно любыми.
с рендером проблем нет
0
 Аватар для GDev
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
26.10.2012, 18:47
Ладно это вроде сам пофиксил пол проекта переписал вроде уже приемлимо работает. теперь у меня возник другой вопрос, впринципе похожий - как найти точку пересечения луча и некоторых блоков из этого массива?
выразить луч как уравнение прямой как я понимаю... а дальше с ним что делать? не все же блоки просматривать. даже если блоков будет не очень много то функция находящая эту самую точку пересечения будет вызываться достаточно часто так что она должна быть максимально эффективна.
Прежде всего функция эта мне необходимо для трассировки пуль.
0
0 / 0 / 0
Регистрация: 25.08.2012
Сообщений: 4
24.11.2012, 19:59
Собственно, делаю 2D rpg (этим мало кого удивишь тут), мой первый опыт так скажем, но если не будет проблем с художником, то игра будет очень не плохой, в плане механики куча идей, да и сюжет возможно не плох, но до этого ещё далеко...возник вопрос как же сделать коллизии и как вообще их считать в большом мире (единый мир, практически без отдельных локаций), про коллизии знаю много, но вот код популярнейших примеров понять до конца так и не смог, кто может пожалуйста объясните до мелочей (а лучше комментариями к каждой строке кода)?

На примере этого
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
public static bool IntersectPixels(Rectangle rectangleA, Color[] dataA, Rectangle rectangleB, Color[] dataB) 
{ 
     // Find the bounds of the rectangle intersection 
     int top = Math.Max(rectangleA.Top, rectangleB.Top); 
     int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom); 
     int left = Math.Max(rectangleA.Left, rectangleB.Left); 
     int right = Math.Min(rectangleA.Right, rectangleB.Right); 
   
     // Check every point within the intersection bounds 
     for (int y = top; y < bottom; y++) 
     { 
            for (int x = left; x < right; x++) 
         { 
             // Get the color of both pixels at this point 
             Color colorA = dataA[(x - rectangleA.Left) + 
                    (y - rectangleA.Top) * rectangleA.Width]; 
             Color colorB = dataB[(x - rectangleB.Left) + 
                    (y - rectangleB.Top) * rectangleB.Width]; 
   
             // If both pixels are not completely transparent, 
             if (colorA.A != 0 && colorB.A != 0) 
             { 
                 // then an intersection has been found 
                 return true; 
             } 
         } 
     } 
   
     // No intersection found 
     return false; 
}
или этого
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
class Sprite { 
 
     [...] 
 
     public bool CollidesWith(Sprite other) 
     { 
         // Default behavior uses per-pixel collision detection 
         return CollidesWith(other, true); 
     } 
 
     public bool CollidesWith(Sprite other, bool calcPerPixel) 
     { 
         // Get dimensions of texture 
         int widthOther = other.Texture.Width; 
         int heightOther = other.Texture.Height; 
         int widthMe = Texture.Width; 
         int heightMe = Texture.Height; 
 
         if ( calcPerPixel &&                    // if we need per pixel 
             (( Math.Min(widthOther, heightOther) > 100) ||  // at least avoid doing it 
             ( Math.Min(widthMe, heightMe) > 100)))          // for small sizes (nobody will notice :P) 
         { 
             return Bounds.Intersects(other.Bounds) // If simple intersection fails, don't even bother with per-pixel 
                 && PerPixelCollision(this, other); 
         } 
 
         return Bounds.Intersects(other.Bounds); 
     } 
 
     static bool PerPixelCollision(Sprite a, Sprite b) 
     { 
         // Get Color data of each Texture 
         Color[] bitsA = new Color[a.Texture.Width * a.Texture.Height]; 
         a.Texture.GetData(bitsA); 
         Color[] bitsB = new Color[b.Texture.Width * b.Texture.Height]; 
         b.Texture.GetData(bitsB); 
 
         // Calculate the intersecting rectangle 
         int x1 = Math.Max(a.Bounds.X, b.Bounds.X); 
         int x2 = Math.Min(a.Bounds.X + a.Bounds.Width, b.Bounds.X + b.Bounds.Width); 
 
         int y1 = Math.Max(a.Bounds.Y, b.Bounds.Y); 
         int y2 = Math.Min(a.Bounds.Y + a.Bounds.Height, b.Bounds.Y + b.Bounds.Height); 
 
          // For each single pixel in the intersecting rectangle 
          for (int y = y1; y < y2; ++y) 
          { 
              for (int x = x1; x < x2; ++x) 
              { 
                  // Get the color from each texture 
                  Color a = bitsA[(x - a.Bounds.X) + (y - a.Bounds.Y)*a.Texture.Width]; 
                  Color b = bitsB[(x - b.Bounds.X) + (y - b.Bounds.Y)*b.Texture.Width]; 
 
                  if (a.A != 0 && b.A != 0) // If both colors are not transparent (the alpha channel is not 0), then there is a collision 
                  { 
                      return true; 
                  } 
              } 
          } 
         // If no collision occurred by now, we're clear. 
         return false; 
     } 
 
     private Rectangle bounds = Rectangle.Empty; 
     public virtual Rectangle Bounds 
     { 
         get 
         { 
             return new Rectangle( 
                 (int)Position.X - Texture.Width, 
                 (int)Position.Y - Texture.Height, 
                 Texture.Width, 
                 Texture.Height); 
         } 
 
     }
Коллизии можно ещё понять, но если учитывать, что мир огромен, не считать же коллизии на каждом шаге относительно всех объектов, да и считать ближайшие объекты, а относительно них коллизии тоже не особо радует, собственно появилась идея сделать следующим образом, весь мир разделить на сетку из большого количества секторов, в каждом секторе будет список динамических (куда будет входить персонаж, противники, снаряды, другими словами всё что там находится в данный момент времени) и статических объектов (ну это понятно, окружающий мир), таким образом можно решить проблему с огромным количеством просчётов коллизий, каждый Update сектор в котором есть активные динамические объекты (персонаж например), будет просчитывать коллизию каждого динамического объекта относительно окружающих объектов, на самом деле так как мне кажется решается ещё и проблема отрисовки большого количества объектов, одновременно будут рисоваться только ближайшие к персонажу сектора, единственное, каждый Update, нужно будет определять принадлежность динамических объектов определённому сектору (понятное дело не всех в мире, а только тех которые находятся в ближайших секторах), как считаете так будет нормально работать или есть алгоритмы по проще?

P.S. сейчас реализовать секторы до конца не могу, из за того что тупо не дошёл до списков объектов в C#, встречался с ними, но сам не использовал. В плане знания ЯП: С++ доучиваю, C# в процессе изучения.

Заранее спасибо.

Добавлено через 4 часа 5 минут
Хах, только сейчас понял, что весь код уже с комментариями
Ладно, с коллизиями вопрос закрыт, а как на счёт разбиения на секторы? Есть у кого мысли по этому поводу?)
0
25 / 25 / 0
Регистрация: 02.10.2012
Сообщений: 63
26.11.2012, 11:15
Цитата Сообщение от Huntlier Посмотреть сообщение
Ладно, с коллизиями вопрос закрыт, а как на счёт разбиения на секторы? Есть у кого мысли по этому поводу?)
Выбери ширину и высоту сектора, подели размер мира на него, затем пройди двойным for по каждому сектору, и для каждого сектора создай очерчивающий прямоугольник, всё что входит в прямоугольник - объект сектора.
0
2 / 2 / 0
Регистрация: 10.06.2011
Сообщений: 26
21.02.2013, 01:21
Есть коллекция объектов пули и коллекция объектов ящики
мне нужно чтобы при попадании пули в ящик они пропадали.

Cначала я сделал так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void UpdateBullet()
        {
            for (int j = 0; j < bulletList.Count; j++)
            {
                BulletList curentBullet = bulletList[j];
                Vector2 pos = new Vector2(bulletList[j].rectangle.X + bulletList[j].g.X, bulletList[j].rectangle.Y + bulletList[j].g.Y);
                curentBullet.rectangle = new Rectangle(Convert.ToInt32(pos.X), Convert.ToInt32(pos.Y), 5, 5);
                bulletList[j] = curentBullet;
                Intersects();
            }
        }
 
 public void Intersects()
        {
                foreach (BulletList bullet in bulletList)
                {
                    foreach (BoxList box in boxList)
                    {
                        if (bullet.rectangle.Contains(box.rectangle))
                            bulletList.Remove(bullet);
                }
            }
        }
в итоге ничего не происходит, пули пролетают мимо.
сделал это через циклы в итоге ситуация та самая.
пошел дальше. проверял просто коллекцию пуль на попадание в один объект, ничего не получилось.


Потом я запихнул код проверки в метод апдейт и проверял на попадание с прямоугольником.
И наконец то заработало!!!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ublic void UpdateBullet()
        {
 
            for (int j = 0; j < bulletList.Count; j++)
            {
                BulletList curentBullet = bulletList[j];
                Vector2 pos = new Vector2(bulletList[j].rectangle.X + bulletList[j].g.X, bulletList[j].rectangle.Y + bulletList[j].g.Y);
                curentBullet.rectangle = new Rectangle(Convert.ToInt32(pos.X), Convert.ToInt32(pos.Y), 5, 5);
                bulletList[j] = curentBullet;
                //Создал прямоугольник 
                Rectangle rect = new Rectangle(20,20,50,50);
               //Проверяю  попадает пуля в rect
                if (curentBullet.rectangle.Intersects(rect))
                    bulletList.Remove(curentBullet);
 
            }
 
        }
Но проблема осталась. как же мне проверить все ящики.
На сколько я понял проблема в том что циклы с проверками не успевают обрабатываться.
Что мне делать?

Добавлено через 1 час 2 минуты
Тема закрыта, проблема найдена!
0
0 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 4
27.02.2013, 07:44
Небольшой совет:
Лучше используйте вместо
C#
1
Convert.ToInt32
явное преобразование
C#
1
(int)
Т.е. код такой будет:
curentBullet.rectangle = new Rectangle((int)pos.X, (int)pos.Y, 5, 5);
Намного удобнее
Точно также можно приводить и другие типы переменных.
0
 Аватар для CSharpCraft
58 / 58 / 9
Регистрация: 09.01.2013
Сообщений: 247
27.02.2013, 09:34
Цитата Сообщение от Jakota_sbor Посмотреть сообщение
Небольшой совет:
Лучше используйте вместо
C#
1
Convert.ToInt32
явное преобразование
C#
1
(int)
Т.е. код такой будет:
curentBullet.rectangle = new Rectangle((int)pos.X, (int)pos.Y, 5, 5);
Намного удобнее
Точно также можно приводить и другие типы переменных.
К тому же такой код работает немного быстрее
0
2 / 2 / 1
Регистрация: 08.08.2012
Сообщений: 27
20.06.2013, 22:09
как сделать так чтобы объект, которым я руковожу, не пересекал ящик-спрайт, а останавливался когда достигнет его границы. заранее спасибо!
0
2 / 2 / 1
Регистрация: 08.08.2012
Сообщений: 27
21.06.2013, 01:27
а что за переменная lp?
0
 Аватар для ImAlexSmith
325 / 114 / 7
Регистрация: 01.05.2011
Сообщений: 283
Записей в блоге: 3
22.06.2013, 18:01
Волшебные BoundingBox или Rectangle
0
 Аватар для Laun_MC
15 / 15 / 1
Регистрация: 02.05.2013
Сообщений: 104
30.06.2013, 14:12
Цитата Сообщение от Ressinel Посмотреть сообщение
как сделать так чтобы объект, которым я руковожу, не пересекал ящик-спрайт, а останавливался когда достигнет его границы. заранее спасибо!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Texture2D box_Texture;
Rectangle box_Rectangle;
 
Texture2D player_Texture;
Rectangle player_Rectangle;
 
...
 
void Update()
{
player_Rectangle.X += 1; // player будет ВСЕГДА идти вправо (можно сделать по нажатию клавиши)
 
  if(player_Rectangle.Intersects(box_Rectangle))
  {
     player_Rectangle.X = 0; // player остановится если соприкоснётся с box-ом
  }
}
Надо делать Player и Ящик не Vetor2, а Rectangle (Как в примере)
0
5 / 5 / 0
Регистрация: 10.05.2012
Сообщений: 63
11.07.2013, 02:46
Всем привет, возникла потребность в использовании спрайтов произвольной формы. Что можно использовать кроме Ректангла и БоундингБокса для выделения криволинейной области к примеру?
0
 Аватар для makedonsky94
45 / 45 / 4
Регистрация: 14.02.2013
Сообщений: 139
11.07.2013, 11:15
посмотри по пиксельную коллизию
http://www.youtube.com/watch?v=asU7afngQ8U
0
 Аватар для ImAlexSmith
325 / 114 / 7
Регистрация: 01.05.2011
Сообщений: 283
Записей в блоге: 3
11.07.2013, 15:08
Тогда уж оригинал там и код можно копирнуть
http://xbox.create.msdn.com/en... d_perpixel
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.07.2013, 15:08

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru