.[ ČeskéHry.cz ].
XNA 2D tutorial
Jdi na stránku Předchozí  1, 2
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 10. únor 2012, 07:08:23    Předmět: Odpovědět s citátem

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*9Cool;
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 10. únor 2012, 08:17:31    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 10. únor 2012, 09:46:26    Předmět: Odpovědět s citátem

V metodě Draw třídy Hra mám zakomentovaný řádek s pozadím. Do hry se dostaneš enterem (zatím to je rozpracované). Po stažení to posím smaž.

http://www.uloz.to/xw22o1T/dotwar-zip
http://www.uloz.to/smazat/xw22o1T/1225975800
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 10. únor 2012, 09:58:18    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 10. únor 2012, 10:17:57    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Manox



Založen: 30. 07. 2007
Příspěvky: 140
Bydliště: Brno

PříspěvekZaslal: 10. únor 2012, 10:23:24    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 10. únor 2012, 11:10:40    Předmět: Odpovědět s citátem

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 Very Happy

Ještě jednou děkuji
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 10. únor 2012, 17:07:49    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 11. únor 2012, 08:38:43    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 11. únor 2012, 14:08:51    Předmět: Odpovědět s citátem

Dobře, tak sis vyzkoušel ten omyl.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 10. červen 2012, 17:53:52    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 14. červen 2012, 13:22:45    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 14. červen 2012, 14:04:45    Předmět: xna hmm Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Qweek



Založen: 06. 02. 2012
Příspěvky: 13

PříspěvekZaslal: 15. červen 2012, 06:47:24    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna