Ситуация на позициониране в XNA

Опитвах се да реша този проблем, но нямам представа. Знам, че преди съм питал за произхода, но наистина не знам как да поправя това.

въведете описание на изображението тук

червена точка = координати x-y

жълта точка = произход, използван в spritebatch.draw

произход = нов вектор (img.width/2, img.height/2);

позиция = нов правоъгълник (400, 200, img.width, img.height);

center_x = position.center.x center_Y= position.center.y

Забелязах, че въпреки че поставих началото, когато използвах spritebatch.draw, позиционирането все още се извършва от началото 0,0 вместо от жълтата точка. Как мога да променя това? Забелязах го, когато проверих центъра за Y и X на правоъгълника на позицията и го сравних с действителните координати. Центърът беше по-висок от самите координати. Искам го така, че централните координати да са едни и същи от X и Y на позицията. Например, задавам 200 за X и 200 отзад Y в правоъгълника на позицията. Когато отида да проверя центъра на този правоъгълник, искам той да бъде 200 както на X, така и на Y. Освен това използвам правоъгълник за позициониране, защото също така тествам неща за сблъсък.

Един пример би бил добър, благодаря предварително


person Jcorretjer    schedule 28.08.2013    source източник
comment
игнорирайте зелената лента хаха   -  person Jcorretjer    schedule 28.08.2013
comment
spriteBatch.Draw(img, img_rec, null, Color.White, 0, origin_Img, SpriteEffects.None, 0); това е spritebatch.draw, за който говорех   -  person Jcorretjer    schedule 28.08.2013
comment
Просто ще коментирам едно нещо за вашия код тук; не използвайте кратки и неразбираеми имена на променливи като img, img_rec и origin_img. Дайте им правилни имена като изображение, източникПравоъгълник, произход и т.н. И не използвайте долна черта. C# използва CamelCase и/или PascalCase синтаксис.   -  person Stig-Rune Skansgård    schedule 28.08.2013
comment
Обикновено не ги наричам така. Искаше се просто като бързо име за тестови цели. Използвам долна черта, защото през нощта, ако използвам камилска нотация, става малко трудно за четене, особено ако пиша с часове.   -  person Jcorretjer    schedule 30.08.2013


Отговори (3)


Преминавате към позициониране на правоъгълник, вместо това използвайте Vector2 за позициониране:

  Vector2 origin = new Vector2(img.Width, img.Height) * 0.5f;
  Vector2 pos = new Vector2(400,200) + origin;
  spriteBatch.Draw(img, pos, null, Color.White, 0, origin, SpriteEffects.None, 0)

Това работи със сигурност.

РЕДАКТИРАНЕ: ако искате да работите с правоъгълници, уверете се, че произходът е свързан с размера на текстурата.

  Rectangle bounds = new (400,200, img.Width, img.Height);
  Vector2 origin = new Vector2(img.Width, img.Height) * 0.5f;
  spriteBatch.Draw(img, bounds, null, Color.White, 0, origin, SpriteEffects.None, 0)

  This works too. 

  The position of the yellow dot will be (400,200)
  if you don't use origin, the red dot position will be (400,200)
person Blau    schedule 28.08.2013

не виждам позиция в нашия пример за spriteBatch. опитайте да го използвате с всички свойства.

SpriteBatch.Draw (Texture2D, ImgPosition, ImgRect, ImgColor, ImgRotate, ImgOrigin, Scale, SpriteEffects, Layer)

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.draw.aspx

person Davor Mlinaric    schedule 28.08.2013

Ако се опитвате да нарисувате спрайт, поставяйки неговия Origin в центъра му, вие го правите правилно. Вашата жълта точка е на позиция (400, 200) и точката на екранната снимка е разумно в тази позиция, като се има предвид размерът на екрана от 800x480. Но ако искате горният ляв ъгъл на вашия спрайт да има тази позиция, трябва да промените вашето Draw повикване.

Когато указвате Origin, опитайте да използвате Vector2 позиция вместо Rectangle за втория параметър на Draw, за да зададете позицията на вашия спрайт.

Посочете Vector2 позиция и произход:

origin = newVector2(img.Width, img.Heigth) / 2;
pos = new Vector2(400, 200) + origin;
spriteBatch.Draw(img, pos, null, Color.White, 0, origin, SpriteEffects.None, 0);

Или използвайте само позицията Rectangle:

posRect = new Rectangle(400, 200, img.Width, img.Heigth);
spriteBatch.Draw(img, posRect, Color.White);
person pinckerman    schedule 28.08.2013
comment
Благодаря. Подобно на минал отговор, но всеки отговор е много добре дошъл в моята книга. Хареса ми твоето обяснение. - person Jcorretjer; 30.08.2013
comment
работата е там, че се опитвам да тествам сблъсък, докато тествам това. А сблъсъкът без правоъгълник е много сложен. Може би не съм обяснил правилно проблема си и се извинявам за това. По принцип искам координатите да са там, където е жълтата точка, вместо там, където е червената точка. Ако опитах това, което повечето от вас препоръчват, центърът е далеч от мястото, където трябва да бъде - person Jcorretjer; 30.08.2013