Воскресенье, 22 Декабря 2024, 07:03

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Метод Texture.GetData()
arthurfokДата: Четверг, 18 Октября 2012, 19:29 | Сообщение # 1
частый гость
Сейчас нет на сайте
Есть sprite-sheet.


если сделать так:
Code

Rectangle rec = new Rectangle((int)pos.X, (int)pos.Y, sprite.Width, sprite.Height);
Corol[] runnerData = new Color[rec.Width * rec.Height];
sprite.GetData(runnerData);

То в runnerData будут ВСЕ пиксели данного спрайта.
Теперь вопрос,, как сделать так, что бы в runnerData были только пиксели определенного "кадра" ??

П.С. я пытаюсь сделать per pixel collision detection для анимированного спрайта (т.к. мой персонаж бегает :)) )
UndeadДата: Четверг, 18 Октября 2012, 19:49 | Сообщение # 2
NeoAxis User
Сейчас нет на сайте
Как вижу XNA.
Видел на msdn про это ссылка
Посмотри здесь. Глава - спрайты/анимация, там описан способ получения определённого кадра анимации.
У тебя платформер? попиксельная колизия тут наверное лишней будет, бокса должно хватить.
можно так, должно работать
Code
Point currentFrame = нужный кадр анимации.  
Point frameSize = размер кадра анимации
Rectangle rec = new Rectangle(currentFrame.X * frameSize.X,
currentFrame.Y * frameSize.Y,
frameSize.X, frameSize.Y)



Вcем зла.

Сообщение отредактировал Undead - Четверг, 18 Октября 2012, 21:55
arthurfokДата: Четверг, 18 Октября 2012, 23:30 | Сообщение # 3
частый гость
Сейчас нет на сайте
Я нашел решение))
Разделяем наш спрайт-шит на отдельные спрайты:
Code

public Texture2D[] Split(Texture2D original, int partWidth, int partHeight, out int xCount, out int yCount)
     {
         yCount = original.Height / partHeight;//The number of textures in each horizontal row
         xCount = original.Width / partWidth;//The number of textures in each vertical column
         Texture2D[] r = new Texture2D[xCount * yCount];//Number of parts = (area of original) / (area of each part).
         int dataPerPart = partWidth * partHeight;//Number of pixels in each of the split parts

         //Get the pixel data from the original texture:
         Color[] originalData = new Color[original.Width * original.Height];
         original.GetData<Color>(originalData);

         int index = 0;
         for (int y = 0; y < yCount * partHeight; y += partHeight)
             for (int x = 0; x < xCount * partWidth; x += partWidth)
             {
                 //The texture at coordinate {x, y} from the top-left of the original texture
                 Texture2D part = new Texture2D(original.GraphicsDevice, partWidth, partHeight);
                 //The data for part
                 Color[] partData = new Color[dataPerPart];

                 //Fill the part data with colors from the original texture
                 for (int py = 0; py < partHeight; py++)
                     for (int px = 0; px < partWidth; px++)
                     {
                         int partIndex = px + py * partWidth;
                         //If a part goes outside of the source texture, then fill the overlapping part with Color.Transparent
                         if (y + py >= original.Height || x + px >= original.Width)
                             partData[partIndex] = Color.Transparent;
                         else
                             partData[partIndex] = originalData[(x + px) + (y + py) * original.Width];
                     }

                 //Fill the part with the extracted data
                 part.SetData<Color>(partData);
                 //Stick the part in the return array:                     
                 r[index++] = part;
             }
         //Return the array of parts.
         return r;
     }


Использование:
Code

Texture2D spriteSheet=Content.Load<Texture2D>("Run");
int xCount,yCount;
Texture2d[] parts = Split(spriteSheet, 10, 10, out xCount, out yCount);
///
///...
///
parts[frame].GetData(runnerData);

где frame - текущий кадр.
UndeadДата: Суббота, 20 Октября 2012, 10:57 | Сообщение # 4
NeoAxis User
Сейчас нет на сайте
Англоязычные друзья подкинули ссылку по per pixel collision, ВОТ может пригодится. Сам сайтик довольно интересный, по xna немало полезного ссылка. smile

Вcем зла.

Сообщение отредактировал Undead - Суббота, 20 Октября 2012, 10:57
arthurfokДата: Суббота, 20 Октября 2012, 22:34 | Сообщение # 5
частый гость
Сейчас нет на сайте
Да , я у меня тоже этот алгоритм )))
wcptДата: Суббота, 20 Октября 2012, 22:39 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Вот у меня тоже этот алгоритм, только вот не в нем счастье - координаты столкновения он не возвращает!
arthurfokДата: Суббота, 20 Октября 2012, 22:59 | Сообщение # 7
частый гость
Сейчас нет на сайте
это можно вычислить smile
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг