1 / 1 / 0
Регистрация: 12.01.2012
Сообщений: 27
1

XNA 4.0 спрайт не изменяет координаты

13.01.2012, 18:43. Показов 1673. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал программу на xna 4.0, до этого писал на 3.1.
Рисую спрайт с координатами vec, потом изменяю vec, а объект координаты не изменяет!
В чём может быть дело?


Класс Pole.
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
public class Pole : Microsoft.Xna.Framework.GameComponent
    {
        public Pole(Game game)
            : base(game)
        {
            // ЗАДАЧА: здесь создаются дочерние компоненты
        }
        
        public Texture2D notTap;
        public Rectangle[] rect = new Rectangle[1000];
        
        Vector2 vec = new Vector2();
        /// <summary>
        /// Позволяет игровому компоненту выполнить необходимую инициализацию перед\r\запуском.               ////Здесь можно запросить нужные службы и загрузить контент.
        /// 
        /// </summary>
        public override void Initialize()
        {
            // ЗАДАЧА: добавьте здесь код инициализации
 
            base.Initialize();
        }
 
        public void DRAW(SpriteBatch batch, ContentManager content)
        {
            
            notTap = new Texture2D(batch.GraphicsDevice, 175, 100);
            notTap = content.Load<Texture2D>("notTap");
           
           rect[1] = new Rectangle(0, 0, 175, 100);
 
           
           
 
 
 
           batch.Draw(notTap, vec, null, Color.White, 0, new Vector2(175 / 2, 100 / 2), 1.0f, SpriteEffects.None, 0.0f);
           vec.X = 100;
           vec.Y = 100;
        }
 
        /// <summary>
        /// Позволяет игровому компоненту обновиться.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        public override void Update(GameTime gameTime)
        {
            // ЗАДАЧА: добавьте здесь код обновления
           
            base.Update(gameTime);
        }
    }

Класс Game1
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
public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
 
            // Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
            TargetElapsedTime = TimeSpan.FromTicks(333333);
 
            // Дополнительный заряд аккумулятора заблокирован.
            InactiveSleepTime = TimeSpan.FromSeconds(1);
 
            graphics.PreferredBackBufferHeight = 480;
            graphics.PreferredBackBufferWidth = 800;
 
            
        }
 
        /// <summary>
        /// Позволяет игре выполнить инициализацию, необходимую перед запуском.
        /// Здесь можно запросить нужные службы и загрузить неграфический
        /// контент.  Вызов base.Initialize приведет к перебору всех компонентов и
        /// их инициализации.
        /// </summary>
        protected override void Initialize()
        {
            // ЗАДАЧА: добавьте здесь логику инициализации
 
            base.Initialize();
        }
 
        /// <summary>
        /// LoadContent будет вызываться в игре один раз; здесь загружается
        /// весь контент.
        /// </summary>
        protected override void LoadContent()
        {
            // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            // ЗАДАЧА: используйте здесь this.Content для загрузки контента игры
        }
 
        /// <summary>
        /// UnloadContent будет вызываться в игре один раз; здесь выгружается
        /// весь контент.
        /// </summary>
        protected override void UnloadContent()
        {
            // ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
        }
 
        /// <summary>
        /// Позволяет игре запускать логику обновления мира,
        /// проверки столкновений, получения ввода и воспроизведения звуков.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        protected override void Update(GameTime gameTime)
        {
            // Позволяет выйти из игры
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
            // ЗАДАЧА: добавьте здесь логику обновления
 
            base.Update(gameTime);
        }
 
        /// <summary>
        /// Вызывается, когда игра отрисовывается.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        Pole pole;
        protected override void Draw(GameTime gameTime)
        {
            pole = new Pole(this);
            
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
            pole.DRAW(spriteBatch, Content);
            spriteBatch.End();
            
 
            // ЗАДАЧА: добавьте здесь код отрисовки
 
            base.Draw(gameTime);
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2012, 18:43
Ответы с готовыми решениями:

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

XNA действие при наведении на спрайт
Как сделать действие при наведении на спрайт(Rectangle) мышью?

Определить координаты прямоугольного выделения, если нужен не весь спрайт, а его часть
Извиняюсь за глупый вопрос, недавно начал изучать XNA. В данный момент изучаю его по книге и...

XNA 4.0. Зачем при построении модели указывать координаты камеры
Объясните кто нибудь. зачем при построении модели указывать координаты камеры? что если я хочу...

5
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
13.01.2012, 19:30 2
Может не то, но попробуйте вынести из метода Draw() в классе Game1 строчку
C#
1
pole = new Pole(this);
в инициализацию. В любом случае нет смысла при каждой перерисовке новый объект создавать.
Если это то, что я думаю, то
C#
1
2
vec.X = 100;
vec.Y = 100;
присваиваются уже после прорисовки объекта, а так как объект каждый раз новый, до использования этих величин не доходит никогда.

Добавлено через 16 минут
Ну или просто вместо
C#
1
2
3
batch.Draw(notTap, vec, null, Color.White, 0, new Vector2(175 / 2, 100 / 2), 1.0f, SpriteEffects.None, 0.0f);
vec.X = 100;
vec.Y = 100;
написать
C#
1
2
3
vec.X = 100;
vec.Y = 100;
batch.Draw(notTap, vec, null, Color.White, 0, new Vector2(175 / 2, 100 / 2), 1.0f, SpriteEffects.None, 0.0f);
Но лучше сделать и то, и то.
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
13.01.2012, 21:34 3
тут вообще куча ошибок. у вас неправильный весь метод Draw
почитайте основы рисовки в XNA.
0
1 / 1 / 0
Регистрация: 12.01.2012
Сообщений: 27
13.01.2012, 22:00  [ТС] 4
Незнаю, ошибок компилятор не находит.
Таким способом я написал часы и ракету летающую с помощью регулирования силы прикладываемой к трём соплам, но там запутался в физике с расчётом угла наклона и ракета летала криво. :-)
А здесь надо чтоб координаты объекта изменялись после его прорисовки.
0
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
14.01.2012, 00:02 5
Цитата Сообщение от SL RU Посмотреть сообщение
Незнаю, ошибок компилятор не находит.
Таким способом я написал часы и ракету летающую с помощью регулирования силы прикладываемой к трём соплам, но там запутался в физике с расчётом угла наклона и ракета летала криво. :-)
А здесь надо чтоб координаты объекта изменялись после его прорисовки.
Нет, ещё раз...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected override void Draw(GameTime gameTime)
        {
            pole = new Pole(this);
            
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
            pole.DRAW(spriteBatch, Content);
            spriteBatch.End();
            
 
            // ЗАДАЧА: добавьте здесь код отрисовки
 
            base.Draw(gameTime);
        }
При каждой прорисовке создаётся новый объект с координатами 0, 0. Затем он отрисовывается, затем меняются его координаты на 100, 100. Затем заканчивается цикл прорисовки. Затем начинается новый, в котором создаётся новый объект с координатами 0, 0, отрисовывается, и затем уже координаты нового объект опять меняются на 100, 100. И так в цикле. Если я всё правильно понял, объект всегда будет в точке 0, 0. Чтобы этого не было, надо вынести строчку
C#
1
pole = new Pole(this);
из метода Draw() в конструктор Game1 или в Initialize().
0
1 / 1 / 0
Регистрация: 12.01.2012
Сообщений: 27
14.01.2012, 07:21  [ТС] 6
Ура! Заработало я перенёс строчку создания объекта, я сам бы не догадался об этой ошибки никогда.
0
14.01.2012, 07:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2012, 07:21
Помогаю со студенческими работами здесь

Как конвертировать готовый рабочий проект написаный на xna 3.1 в xna 4.0?
Помогите пожалуйста ! Есть рабочий проект игры &quot;Mario&quot; написанный на xna 3.1 нужно как то исправить...

Насколько актуальна XNA и будет ли XNA 5.0
Насколько актуально сейчас изучение/разработка на XNA? Я пока не очень хорошо разбираюсь в вопросе,...

XNA или Monogame? Чем Monogame лучше XNA?
Добрый день! Занимаюсь разработкой игр на xna на vcs2010. Вроде все хорошо идет, но тут наткнулся...

Спрайт
Люди помогите я язнаю что такое спрайт но немогу найти как их создать дайте ссилки на литературу...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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