Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 10. únor 2012, 07:08:23 Předmět: |
|
|
V initialize si zaregistruji dva komponenty a ty vykresluji v jejich vlastní Draw metodě. Právě kde jsem koukal na tutorialy o komponentech, tak jsem si nešiml, že by to někdo řešil. Ve třídě Game1 si udělal pozadí a komponety se normálně vykreslovaly přes ně.
public override void Initialize()
{
// TODO: Add your initialization code here
RecPozadi = new Rectangle(0,0,(int)MeritkoX*100,(int)MeritkoY*9;
Stav = "hra";
hracA = new HracA.HracA(G, MeritkoX, MeritkoY, Graphics);
hracB = new HracB.HracB(G, MeritkoX, MeritkoY, Graphics);
G.Components.Add(hracA);
G.Components.Add(hracB);
base.Initialize();
} |
|
Návrat nahoru |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 10. únor 2012, 08:17:31 Předmět: |
|
|
Mělo by to tak být ok, více do toho nevidím, šlo by poslat ten projekt, abych se na to podíval ? |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
|
Návrat nahoru |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 10. únor 2012, 09:58:18 Předmět: |
|
|
Tak se to zdá jasné, Ty tam ty komponenty jen tak dáváš a mažeš, tím se Ti přehazuje pořadí a může se to vykreslovat pokaždé jinak. Doporučuji nedělat třídy hráče jako DrawableGameComponent ale jen jako obyčejné třídy a hráče nedávat přímo do Game1 ale Hra, kde si pak budeš i sám volat Update() a Draw() v pořadí jak potřebuješ. |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 10. únor 2012, 10:17:57 Předmět: |
|
|
Chtěl jsem se právě naučit používat komponenty abych si oddělil kód. Pokud bych chtěl zachovat strukturu jakou mám, šlo by to tedy nějak upravit aby se to vykreslovalo dobře? Přesto si myslím, že by to mělo fungovat dobře, protože když vytvořím komponent Hra, tak se mi potom vytvoří ty komponenty HracA a HracB. |
|
Návrat nahoru |
|
|
Manox
Založen: 30. 07. 2007 Příspěvky: 140 Bydliště: Brno
|
Zaslal: 10. únor 2012, 10:23:24 Předmět: |
|
|
Osobně se mi Tvoje struktura hry moc nelíbí, všechno strkat do třídy game, chtělo by to více oddělit.
Nicméně jak se dívám, ještě jedna možnost by tu byla a to sice použití vrstev (layer) u SpriteBatch. SpriteSortMode nastavíš na BackToFront a pak u metody SpriteBatch.Draw dáš jako parametr i vrstvu - většinou poslední parametr. |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 10. únor 2012, 11:10:40 Předmět: |
|
|
Mám to. Poředí vykreslování komponentů lze nastavit v DrawOrder relativně k ostatním komponentů ve stejné kolekci
hra.DrawOrder = 1;
hracA.DrawOrder = 2;
hracB.DrawOrder = 3;
Mockrát děkuji za pomoc, pomohlo mi to ponořit se zase trochu hlouběji do problematiky. Nejdůležitější je dozvědět se co má člověk hledat a potom si to už vždycky nějak najde
Ještě jednou děkuji |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 10. únor 2012, 17:07:49 Předmět: |
|
|
Je nejaky konkretny dovod, pre ktory to takto rozbijas do komponentov, ktore treba separe registrovat a potom sa same obsluhuju ?
Stracas tym totiz dost velku davku kontroly a rozbija to celu strukturu (aj ked na papieri to vyzera pekne a cisto) a dost to komplikuje debugovanie.
Ako dizajnersky pocin je to mozno pekne, ale je to dost neprakticke. Nevidis ten kod hned, ked to debugujes, mnohe zavislosti ti mozu uniknut ciste z titulu, ze casom detaily proste zabudnes.
Pokial ich mas 1-2, tak mozno - ale viac by som urcite nedoporucoval. |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 11. únor 2012, 08:38:43 Předmět: |
|
|
V tomto případě šlo o to, že jde o první program v xna a tak jsem si chtěl komponenty vyzkoušet. Nejsem zkušený programátor, tak bohužel většinou pracuji metodou pokus-omyl. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 11. únor 2012, 14:08:51 Předmět: |
|
|
Dobře, tak sis vyzkoušel ten omyl. _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 10. červen 2012, 17:53:52 Předmět: |
|
|
Chtěl bych poprosit jestli by mi nebyl někdo schopen vysvětlit kde je chyba. Podle mě se mají takto sprity vykreslit na sebe vystředěně, ale výsledek je tento
http://imgur.com/aTzXd
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Dzembero
{
/// <summary>
/// This is a game component that implements IUpdateable.
/// </summary>
public class Postava : Microsoft.Xna.Framework.DrawableGameComponent
{
SpriteBatch spriteBatch;
ContentManager contentManager;
Texture2D TexTelo, TexHlava;
Rectangle RecTelo, RecHlava;
Vector2 PolohaPostavy;
Vector2 StredTela, StredHlavy;
double MeritkoX;
double MeritkoY;
float UhelTela;
float UhelHlavy;
int VelikostTela, VelikostHlavy;
public Postava(Game game, double meritkoX, double meritkoY, Vector2 startovniPoloha)
: base(game)
{
// TODO: Construct any child components here
contentManager = new ContentManager(game.Services);
contentManager.RootDirectory = "Content/Postava";
PolohaPostavy = startovniPoloha;
MeritkoX = meritkoX;
MeritkoY = meritkoY;
VelikostTela = 4 * (int)MeritkoX;
VelikostHlavy = 2 * (int)MeritkoX;
}
/// <summary>
/// Allows the game component to perform any initialization it needs to before starting
/// to run. This is where it can query for any required services and load content.
/// </summary>
public override void Initialize()
{
// TODO: Add your initialization code here
RecTelo = new Rectangle((int)(PolohaPostavy.X - (VelikostTela / 2)), (int)(PolohaPostavy.Y - (VelikostTela / 2)),
VelikostTela, VelikostTela);
RecHlava = new Rectangle((int)(PolohaPostavy.X - (VelikostHlavy / 2)), (int)(PolohaPostavy.Y - (VelikostHlavy / 2)),
VelikostHlavy, VelikostHlavy);
UhelTela = 0;
UhelHlavy = 0;
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(Game.GraphicsDevice);
TexTelo = contentManager.Load<Texture2D>("ctverec");
TexHlava = contentManager.Load<Texture2D>("kruh_smerovka");
StredTela = new Vector2(TexTelo.Width / 2, TexTelo.Height / 2);
StredHlavy = new Vector2(TexHlava.Width / 2, TexHlava.Height / 2);
base.LoadContent();
}
/// <summary>
/// Allows the game component to update itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
public override void Update(GameTime gameTime)
{
// TODO: Add your update code here
base.Update(gameTime);
}
public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.Draw(TexTelo, RecTelo, null, Color.Black, UhelTela, StredTela, SpriteEffects.None, 0);
spriteBatch.Draw(TexHlava, RecHlava, null, Color.Black, UhelHlavy, StredHlavy, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
Pokud v metodě draw použiji toto, tak se to zobrazí správně takže v poloze rectanglu problém není
spriteBatch.Draw(TexTelo, RecTelo, Color.Black);
spriteBatch.Draw(TexHlava, RecHlava, Color.Black);
http://imgur.com/nSXNY
Díky za případnou odpověď |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 14. červen 2012, 13:22:45 Předmět: |
|
|
Asi jsem to napsal tak, že se nedalo pochopit o co mi jde. Omlouvám se.
Můj problém je v tom, že si nastavím rectangly sprytů pro vykreslení a pokud použiji v metodě draw toto, tak se vše vykreslí jak potřebuji.
spriteBatch.Begin();
spriteBatch.Draw(TexTelo, RecTelo, Color.Black);
spriteBatch.Draw(TexHlava, RecHlava, Color.Black);
spriteBatch.End();
Viz obrázek:
http://imgur.com/nSXNY
Protože, ale v budoucnu budu potřebovat se spryty otáčet podle středu, tak jsem metodu přetížil takto
spriteBatch.Begin();
spriteBatch.Draw(TexTelo, RecTelo, null, Color.Black, UhelTela, StredTela, SpriteEffects.None, 0);
spriteBatch.Draw(TexHlava, RecHlava, null, Color.Black, UhelHlavy, StredHlavy, SpriteEffects.None, 0);
spriteBatch.End();
Kde polohy rectanglů jsou stejné jako v prvním případě a je to doplněno o úhel natočení a střed obrázku (StredTela a StredHlavy). V tomto druhém případě se však spryty nezobrazují tak jak bych si přál, ale takto:
http://imgur.com/aTzXd
Polohu bych rád upřesňoval pomocí rectanglu a né pomocí vectoru kvůli velikosti u různých rozlišení monitoru, ale nikde jsem nenašel odpověď. Všude jsem našel.
Děkuji za případné objasnění |
|
Návrat nahoru |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 14. červen 2012, 14:04:45 Předmět: xna hmm |
|
|
zdravim,
podla http://msdn.microsoft.com/en-us/library/ff433992.aspx ->
``The sprite origin; the default is (0,0) which represents the upper-left corner.''
ako tak pozeram na ten druhy obrazok, tak lavy horny roh je v strede,
nestaci posunut o ``width/2'' a ``height/2''??
zatim... _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
|
Qweek
Založen: 06. 02. 2012 Příspěvky: 13
|
Zaslal: 15. červen 2012, 06:47:24 Předmět: |
|
|
Díky, to bylo ono. Pro samotné vykreslení jsem si ty rectangly posunul a už se to kreslí dobře. Já jsem pochopil, že origin je pouze pro určení okolo jakého bodu se má obrázek otáčet. Jakmile jsem si nechal vykreslit obě varianty přes sebe, tak mi to taky došlo.
Díky |
|
Návrat nahoru |
|
|
|