Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Добавляем радар (мини-карта) к уроку Heightmap Collision
За основу берем урок Collision Series 5: Heightmap Collision with Normals с сайта creators.xna.com. В графическом редакторе вроде Paint.NET создаем изображение размером 4х4, закрашиваем его красным цветом и сохраняем в папку с контентом нашего проекта. Изображение это будем использовать для обозначеия позиции танка на мини-крте.

В классе HeightMapInfo добавляем новые поля -

1
2
3
4
public readonly int XDimension;
public readonly int ZDimension;
public readonly float MinHeight;
public readonly float MaxHeight;

 

В конструктор HeightMapInfo добавляем код инициализации этих полей -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
            XDimension = heights.GetLength(0);
ZDimension = heights.GetLength(1);
 
for (int x = 0; x < XDimension; x++)
{
for (int z = 0; z < ZDimension; z++)
{
if (heights[x, z] < MinHeight)
MinHeight = heights[x, z];
if (heights[x, z] > MaxHeight)
MaxHeight = heights[x, z];
}
}
 

 


А так же два новых метода для упрощения конверсии координат танка от 3D к 2D относительно карты высот  -

1
2
3
4
5
6
7
8
9
10
11
12
13
        public float GetHeight(int x, int z)
{
return heights[x, z];
}
 
public void GetPos(Vector3 position, out int left, out int top)
{
Vector3 positionOnHeightmap = position - heightmapPosition;
 
left = (int)positionOnHeightmap.X / (int)terrainScale;
top = (int)positionOnHeightmap.Z / (int)terrainScale;
}
 


Теперь открвыаем основной класс приложения TanksOnAHeightmapGame и добавляем новые поля -

1
2
3
4
5
Texture2D circle;
Texture2D mapTexture;
SpriteBatch batch;
Color circleColor;
 

 


В метод LoadContent добавляем код инициализации изображения мини-карты и загрузку новой текстуры -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
batch = new SpriteBatch(GraphicsDevice);
 
circle = Content.Load<Texture2D>("circle");
mapTexture = new Texture2D(GraphicsDevice, heightMapInfo.XDimension,
heightMapInfo.ZDimension, 0, TextureUsage.None, SurfaceFormat.Color);

 
Color[] mapColors = new Color[heightMapInfo.XDimension* heightMapInfo.ZDimension];
float max = Math.Abs(heightMapInfo.MaxHeight - heightMapInfo.MinHeight);
 
for (int x = 0; x < heightMapInfo.XDimension; x++)
{
for (int z = 0; z < heightMapInfo.ZDimension; z++)
{
float lerp = (heightMapInfo.GetHeight(x, z) - heightMapInfo.MinHeight) / max;
byte val = (byte)(lerp * 255);
mapColors[x + z * heightMapInfo.ZDimension] = new Color(val, val, val);
}
}
 
mapTexture.SetData<Color>(mapColors);
 

 


Теперь отрисовка, сначала идет ландшафт с танком, потом уже мини-карта с указателем -

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
protected override void Draw(GameTime gameTime)
{
GraphicsDevice device = graphics.GraphicsDevice;
 
device.Clear(Color.Black);
 
DrawModel(terrain);
 
tank.Draw(viewMatrix, projectionMatrix);
 
 
// new code
Rectangle mapRect = new Rectangle(600, 10, 180, 180);
Vector2 pos = Vector2.Zero;
int top, left;
heightMapInfo.GetPos(tank.Position, out left, out top);
pos.X = mapRect.X + left * ((float)mapRect.Width / (float)heightMapInfo.XDimension);
pos.Y = mapRect.Y + top * ((float)mapRect.Height / (float)heightMapInfo.ZDimension);
batch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.SaveState);
batch.Draw(mapTexture, mapRect, Color.White);
batch.Draw(circle, pos, circleColor);
batch.End();
 
byte r = circleColor.R;
r+=4;// скорость пульсации указателя
 
if (r > 255)
r = 40;
 
circleColor = new Color(r, 0, 0);
 
// If there was any alpha blended translucent geometry in
// the scene, that would be drawn here.
 
base.Draw(gameTime);
}

 


Все, во время инициализации загружается новая текстура для отображения позиции танка на радаре. Вторая текстура, сама мини-карта, создается из карты высот ландшафта. В методе Draw получаем координаты танка относительно карты высот и корректируем их относительно позиции мини-карты на экране. Затем рисуем мини-карту и точку (4х4).




Комментарии
#1 | Chort 26.02.2009 16:34:48
Быстро Smile Наверное потому и код такой... "узко направленный". Но думаю народ разберется.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Отлично! Отлично! 0% [Нет голосов]
Очень хорошо Очень хорошо 100% [1 Голос]
Хорошо Хорошо 0% [Нет голосов]
Удовлетворительно Удовлетворительно 0% [Нет голосов]
Плохо Плохо 0% [Нет голосов]
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,04 секунд 8,709,453 уникальных посетителей