Diskuze: Pohyb s objektem
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Já bych udělal každý objekt jako samovykreslovací komponentku - Drawable
Component. A v Update si hlídal, zda já.Intersects(rectangle myši - cca
6x6). Takže "já" bude buď nově vytvořený Rectangle z vastnosti Position,
nebo si pozici objektu můžeš zaznamenávat rovnou v Rectangle - v případě,
že je každý objekt jinak veliký bych ukládal pozici v Rectangle i za cenu,
že se mu hůře mění pozice - při kliknutí a překrývání s myší budeš
muset nesutále vytvářet nové Rectangly - ovšem s X a Y v smoatatných
proměnných by bylo asi mnohem více práce... Takže abych to shrnul - každý
objekt udělej jako Drawable Component. Předávej si jeden SpriteBatch a v
komponentkách již nemusíš volat Begin a End. A v update hlídej kolize s
ostatnímy obekty včetně myši, atp...
PS.: Intersects je skutečně metoda Rectangle...
Domy jako komponenty prosím nedělej, je to hloupost a už jsem to Matesaxovi několikrát říkal. Pokud je každý dům stejně velký, mohl by sis to velmi zjednodušit 2D polem místo toho listu. Pokud ne, je list nutný. Tvůj kód se mi moc nelíbí, proč si prostě neuložíš aktuálně držený dům do proměnné? Pokud dům držet nebudeš, bude v proměnné hodnota null. Vůbec nechápu všechny ty cykly a asi ani nechci chápat.
Souhlasím se Sdracem, komponenta se v tomto pripade nehodi. Nastesti jsem
pohyb objektu uz delal. Trochu jsem to zjednodusil, snad si to preberes, kdyby
neco nebylo jasne, klidne se zeptej.
public class ObjectMover : GameComponent
{
InputState inputState;
public MovementObject movementObject;
MovementObject selectedObject;
bool isPressed = false;
Vector2 lastCursorPosition;
Point mousePressedPoint;
public ObjectMover(Game1 game)
: base(game)
{
this.inputState = new InputState();
}
public override void Initialize()
{
base.Initialize();
}
public override void Update(GameTime gameTime)
{
inputState.Update();
MouseState mouse = inputState.CurrentMouseState;
if (inputState.IsNewMouseLeftButtonPress())
mousePressedPoint = new Point(mouse.X, mouse.Y);
if (movementObject != null)
{
if (mouse.LeftButton == ButtonState.Released)
reset();
if (!isPressed)
if (movementObject.rectangle.Contains(mouse.X, mouse.Y) && mouse.LeftButton == ButtonState.Pressed && movementObject.rectangle.Contains(mousePressedPoint))
selectObject(entity);
if (isPressed && movementObject == selectedObject)
{
movementObject.isInMove = true;
Move(entity);
}
else
movementObject.isInMove = false;
}
base.Update(gameTime);
}
public void reset()
{
isPressed = false;
selectedObject = null;
}
private void selectObject(MovementObject entity)
{
isPressed = true;
selectedObject = entity;
lastCursorPosition = new Vector2(inputState.CurrentMouseState.X, inputState.CurrentMouseState.Y);
}
private void Move(MovementObject entity)
{
Vector2 drift = new Vector2(inputState.CurrentMouseState.X - lastCursorPosition.X, inputState.CurrentMouseState.Y - lastCursorPosition.Y);
entity.position += drift;
lastCursorPosition = new Vector2(inputState.CurrentMouseState.X, inputState.CurrentMouseState.Y);
}
}
Díky za rady. Pomocí proměnné mě to vůbec nenapadlo.
David Hartinger Ty cykly jsem tam měl z důvodu, abych rozpoznal na kterém domku
jsem najetý.
Zobrazeno 5 zpráv z 5.