Воскресенье, 05 Мая 2024, 07:38

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » Программирование .NET » Помогите с кодом
Помогите с кодом
AmriДата: Понедельник, 18 Февраля 2013, 11:51 | Сообщение # 1
Auriss IGD
Сейчас нет на сайте
Доступно только для пользователей

Сообщение отредактировал Amri - Пятница, 01 Марта 2013, 00:53
zodiakДата: Понедельник, 18 Февраля 2013, 12:33 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Цитата (Amri)
Что за ошибка?

А что хоть пишет? Или тупо не рисуется?


Точка зору окремо взятого індивіда завжди суб'єктивна!

Взломщик
Battle City.Net


Сообщение отредактировал zodiak - Понедельник, 18 Февраля 2013, 12:34
AmriДата: Вторник, 19 Февраля 2013, 12:19 | Сообщение # 3
Auriss IGD
Сейчас нет на сайте
zodiak, сначала просто не отрисовывались машинки, а потом вот такая фигня

Добавлено (19.02.2013, 12:19)
---------------------------------------------
Никто не знает?

IIyxMASTERДата: Вторник, 19 Февраля 2013, 12:58 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
судя по тому, что на скриншоте - у тебя spriteTexture равен null
Судя по тому, что я увидел, ты создаешь объект
car = new Sprite(spritePosition, spriteTexture);
однако я не вижу присвоения spriteTexture какого-либо значения, хотя может невнимательно смотрю
AmriДата: Вторник, 19 Февраля 2013, 13:02 | Сообщение # 5
Auriss IGD
Сейчас нет на сайте
Код
protected override void LoadContent()  
            {  
                // Create a new SpriteBatch, which can be used to draw textures.  
                spriteBatch = new SpriteBatch(GraphicsDevice);  
                spriteTexture = Content.Load<Texture2D>("car1");  
                //car.LoadContent(content, "Content\\car1");  
                sprite[0].LoadContent(content, "Content\\car2");  
                sprite[1].LoadContent(content, "Content\\car3");  
                sprite[2].LoadContent(content, "Content\\car4");  
                sprite[3].LoadContent(content, "Content\\car5");  
                    
                fon = Content.Load<Texture2D>("fon");  
                fon2 = Content.Load<Texture2D>("fon2");  

                menu.LoadContent(Content);  

                
                // TODO: use this.Content to load your game content here  
            }

Вот тут.
IIyxMASTERДата: Вторник, 19 Февраля 2013, 13:09 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
просто с хна не работал, незнаю как устроено там все изнутри :-)
Тогда начинай методично отлавливать, в какой момент времени spriteTexture становится null, и вообще получает ли она свое значение в LoadContent
AmriДата: Вторник, 19 Февраля 2013, 14:46 | Сообщение # 7
Auriss IGD
Сейчас нет на сайте
В классе Sprites если два конструктора. Один для анимированных спрайтов, другой для неанимированных. И соответственно две отрисовки - для анимированных и нет. Так вот, объект car нужно сделать через неанимированные, а он выпендривается.

Добавлено (19.02.2013, 13:13)
---------------------------------------------
IIyxMASTER, она все время становится. Но если делать кар через анимированный отрисовщик, то тогда просто не грузится его спрайт. А ограничивающий прямоугольник работает.

Добавлено (19.02.2013, 13:21)
---------------------------------------------
может создать carTexture, но оно тож не фурычит sad

Добавлено (19.02.2013, 14:46)
---------------------------------------------
Еще есть какие-либо предложения???

Stalker_ShooterДата: Четверг, 21 Февраля 2013, 09:53 | Сообщение # 8
3D XNA'шник
Сейчас нет на сайте
Тут все понятно. Типичная ошибка. Ты сначала извлекаешь значение, а только потом его присваиваешь.
Klkz начала в классе Sprites перенеси

Код
center = new Vector2(spriteTexture.Height / 2, spriteTexture.Width / 2);

В конец метода LoadContent

После чего в классе Game1 удали строчки

Код
car = new Sprite(spritePosition, spriteTexture);

и
Код
car.spritePosition = new Vector2(300, 300);


А после
Код
spriteTexture = Content.Load<Texture2D>("car1");

напиши
Код
spritePosition = new Vector2(300, 300);  
car = new Sprite(spritePosition, spriteTexture);

Добавлено (21.02.2013, 09:53)
---------------------------------------------
А вообще, если честно в твоем классе я не вижу смысла. Я не знаю, будет ли выше представленый код корректно работать, т.к. загрузка спрайта у тебя происходит два раза, чего быть категорически не должно" Это пагубно влияет на производительность, да и вообще, лишняя, совершенно ненужная работ. Не нужно загружать текстуру в Game1, там просто создается объект Sprites, а в него просто просто передается Content и путь. Загружает все Sprites. Вот, так же передавать текстуру в конструктор не нужно, т.к. сама текстура в Game1 тебе не нужна. Просто создай текстуру в Sprites, загрузи ее в Sprites и отрисуй ее в Sprites/ Game1 тут вообще не при делах. Корочего говоря, я бы на твоем месте полностью переписал бы оба класса =)


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
AmriДата: Пятница, 01 Марта 2013, 01:01 | Сообщение # 9
Auriss IGD
Сейчас нет на сайте
Маленько переделал, но теперь этот долбаный кар1 не едет в ту сторону, которую надо - нажимаешь Up, а он вправо. И поворачивается не так , как надо, а вокруг непонятного центра, на вроде спутника.

Добавлено (22.02.2013, 19:57)
---------------------------------------------
Ну я и идиот happy , понял, в чем косяк с поворотом. Надо было в этой строчке

Цитата (Amri)
spriteBatch.Draw(spriteTexture, spritePosition, rectangle, Color.White, 0f, center, 1,SpriteEffects.None, 0);

заменить 0f на rotation. Получило, что я поворот заблокировал. А теперь все норм happy

Добавлено (01.03.2013, 01:01)
---------------------------------------------
Думаю, что нет смысла создавать новую тему, поэтому спрошу здесь.

Есть такая проблема. Имеется вот такой код

Код

st = false; //это изначальное значение
  if (/*тут какое-то событие*/)
     {
      st = true; // переменная принимает это значение
     }
  switch (st)
     {
      case false:
        //тут какие-то действия, не суть
      break;

      case true:
        //тут тоже некие действия
      break;
       }

Так вот, как сделать так, что бы переменная st не меняла своего значения после выхода из цикла? То есть, что бы после события она осталась true, а не перекидывалась обратно в false. Но что бы до события она осталась false.


Сообщение отредактировал Amri - Четверг, 21 Февраля 2013, 17:14
pelmenkaДата: Пятница, 01 Марта 2013, 02:19 | Сообщение # 10
Драгоценный Тунеядец
Сейчас нет на сайте
Amri, может просто не стоит изменять переменную st после присвоения ей значения true?
Цитата (Amri)
То есть, что бы после события она осталась true, а не перекидывалась обратно в false

Так сделай ее изначально false

Добавлено (01.03.2013, 02:19)
---------------------------------------------

Цитата (Amri)
Имеется вот такой код
Код
  switch (st)  
      {  
       case false:  
         //тут какие-то действия, не суть  
       break;  

       case true:  
         //тут тоже некие действия  
       break;  
        }

А зачем ты используешь case на булевую переменную? Тогда уж логичнее юзать if
Код

if (st)
{
  /* Тут действия */
}
else
{
/* И тут действия */
}


Сталина в каждый дом!
AmriДата: Пятница, 01 Марта 2013, 09:23 | Сообщение # 11
Auriss IGD
Сейчас нет на сайте
Сначала я if и юзал. В принципе, результат такой же. Необходимо, чтобы переменная st приняла значение true до следующего события, в данном случае - что бы она после принятия значения true не менялась обратно на false.
pelmenkaДата: Пятница, 01 Марта 2013, 09:36 | Сообщение # 12
Драгоценный Тунеядец
Сейчас нет на сайте
Amri, если ты не меняешь, то она и должна остаться true. Хотя я может чего-то не понимаю, я не знаком с xna. Тогда попробуй сохранять значение переменной с помощью другой переменной и когда тебе надо, переменной st присваивай значение переменной, в которую ты ранее сохранил значение переменной st. wacko

Сталина в каждый дом!
AmriДата: Пятница, 01 Марта 2013, 11:48 | Сообщение # 13
Auriss IGD
Сейчас нет на сайте
Это уже не хна, это просто шарп .
Тогда может попробовать int вместо bool. Сейчас мне не возможно проверить, ибо я на работе, а компа под рукой нет. Попробую и твой вариант. Но, думаю, есть способ проще.

Добавлено (01.03.2013, 11:48)
---------------------------------------------
Это уже не хна, это просто шарп .
Тогда может попробовать int вместо bool. Сейчас мне не возможно проверить, ибо я на работе, а компа под рукой нет. Попробую и твой вариант. Но, думаю, есть способ проще.

pelmenkaДата: Пятница, 01 Марта 2013, 18:16 | Сообщение # 14
Драгоценный Тунеядец
Сейчас нет на сайте
Amri, я и с "просто шарпом" не особо дружу.

Сталина в каждый дом!
TreinDSMДата: Суббота, 02 Марта 2013, 11:01 | Сообщение # 15
почетный гость
Сейчас нет на сайте
Все равно что использовать switch или if, хотя switch обычно используют, если проверяемое условие может иметь больше двух вариантов.
Чтобы переменная st не меняла свое значение нужно просто использовать дополнительную переменную, которой будет присваиваться значение переменной st:
Код

st = false;

bool stLoc = st;

if(/* какое-то условие*/)
{
stLoc = true;
}

if(stLoc)
{
// Первый вариант развития событий
}
else
{
// Второй вариант развития событий
}
AmriДата: Суббота, 02 Марта 2013, 11:11 | Сообщение # 16
Auriss IGD
Сейчас нет на сайте
TreinDSM, значит switch тут и должно быть happy планируется вариантов больше, чем два. Но тогда получается, что bool в этом случае не катит. Необходимо использовать int.

TreinDSM, этот вариант тоже не помогает. Оно перекидывается обратно. Хм.. Надо думать дальше.
TreinDSMДата: Суббота, 02 Марта 2013, 11:18 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Amri, Ага. Я то понял, что нужно, чтобы st не меняла своего изначального значения.
Вот этот код выполняется внутри цикла?
Код

st = false; //это изначальное значение
   if (/*тут какое-то событие*/)
      {
       st = true; // переменная принимает это значение
      }
   switch (st)
      {
       case false:
         //тут какие-то действия, не суть
       break;

       case true:
         //тут тоже некие действия
       break;
        }  
AmriДата: Суббота, 02 Марта 2013, 11:56 | Сообщение # 18
Auriss IGD
Сейчас нет на сайте
TreinDSM, нет. Изначальное значение переменной st - false. Значение true приобретается в результате выполнения условия. Необходимо, что бы значение true осталось до следующего условия, где явно прописано, что st = false. Но конкретно сейчас такого нет, поэтому требуется, что бы st = true и после того, как условие выполнено.
А приведенный код - это не цикл, это метод целиком. Вот полный код, возможно это поможет лучше разобраться
Код
public void AIBot()
             {
             st = false;
              
             if (bbkr.Intersects(bbcar2))
                 {
                 st = true;
                 }

             switch (st)
                 {
                 case false:
                     car2.spritePosition += car2.speedSprite;
                     car2.speedSprite = new Vector2(1, 0);
                     car2.rotation = 0.0f;
                     car2.velocity = new Vector2();
                     break;

                 case true:
                     car2.rotation = 3.1f;
                     car2.velocity = new Vector2();
                     car2.speedSprite = new Vector2(-1, 0);
                     car2.spritePosition += car2.speedSprite;
                     break;
                 }
TreinDSMДата: Суббота, 02 Марта 2013, 12:21 | Сообщение # 19
почетный гость
Сейчас нет на сайте
Тогда не переопределяй st в начале метода AIBot, а вынеси ее определение в тело класса. Если я правильно понял, то нужно, чтобы переменная st была изначально инициализирована значение false, после чего ее изменение происходит только при определенных условиях, таких как bbkr.Intersects(bbcar2) == true.
Тогда как то так:
Код

private bool st = false;
public void AIBot()
              {
                
              if (bbkr.Intersects(bbcar2))
                  {
                  st = true;
                  }

              switch (st)
                  {
                  case false:
                      car2.spritePosition += car2.speedSprite;
                      car2.speedSprite = new Vector2(1, 0);
                      car2.rotation = 0.0f;
                      car2.velocity = new Vector2();
                      break;

                  case true:
                      car2.rotation = 3.1f;
                      car2.velocity = new Vector2();
                      car2.speedSprite = new Vector2(-1, 0);
                      car2.spritePosition += car2.speedSprite;
                      break;
                  }
AmriДата: Суббота, 02 Марта 2013, 12:32 | Сообщение # 20
Auriss IGD
Сейчас нет на сайте
Так тоже не получается. St принимает почему-то значение true, еще задолго до события, в данном случае - столкновения. И в итоге машинка едет в другую сторону, но она должна развернуться только тогда, когда пересечет линию, а этого не происходит. она сразу едет обратно.
Форум игроделов » Программирование » Программирование .NET » Помогите с кодом
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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