mirror of
https://github.com/Stone-Red-Code/StoneRed.LogicSimulator.git
synced 2026-09-04 00:56:23 +02:00
Update logic gate selection and grid snapping with scaling corrections
This commit is contained in:
@@ -159,8 +159,8 @@ internal class WorldScreen : SrlsScreen<Grid>
|
|||||||
if (selectedLogicGate is not null)
|
if (selectedLogicGate is not null)
|
||||||
{
|
{
|
||||||
richTextLayout.Text = selectedLogicGate.WorldData.Name.Truncate(10);
|
richTextLayout.Text = selectedLogicGate.WorldData.Name.Truncate(10);
|
||||||
richTextLayout.Draw(srls.SpriteBatch, selectedLogicGate.WorldData.Position + (new Vector2(2, 2) * srls.Scale), Color.White, new Vector2(srls.Scale, srls.Scale), layerDepth: 0);
|
richTextLayout.Draw(srls.SpriteBatch, (selectedLogicGate.WorldData.Position + new Vector2(2, 2)) * srls.Scale, Color.White, new Vector2(srls.Scale, srls.Scale), layerDepth: 0);
|
||||||
srls.SpriteBatch.DrawRectangle(selectedLogicGate.WorldData.Position, logicGateSize * srls.Scale, Color.Red, 2 * srls.Scale);
|
srls.SpriteBatch.DrawRectangle(selectedLogicGate.WorldData.Position * srls.Scale, logicGateSize * srls.Scale, Color.Red, 2 * srls.Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
srls.SpriteBatch.End();
|
srls.SpriteBatch.End();
|
||||||
@@ -208,6 +208,11 @@ internal class WorldScreen : SrlsScreen<Grid>
|
|||||||
|
|
||||||
foreach (LogicGate logicGate in simulator.GetLogicGates())
|
foreach (LogicGate logicGate in simulator.GetLogicGates())
|
||||||
{
|
{
|
||||||
|
if (logicGate == selectedLogicGate)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle rectangle = new Rectangle((logicGate.WorldData.Position * srls.Scale).ToPoint(), (logicGateSize * srls.Scale).ToPoint());
|
Rectangle rectangle = new Rectangle((logicGate.WorldData.Position * srls.Scale).ToPoint(), (logicGateSize * srls.Scale).ToPoint());
|
||||||
|
|
||||||
if (rectangle.Contains(camera.ScreenToWorld(mouseState.Position.ToVector2())))
|
if (rectangle.Contains(camera.ScreenToWorld(mouseState.Position.ToVector2())))
|
||||||
@@ -220,6 +225,10 @@ internal class WorldScreen : SrlsScreen<Grid>
|
|||||||
{
|
{
|
||||||
simulator.RemoveLogicGate(logicGate);
|
simulator.RemoveLogicGate(logicGate);
|
||||||
}
|
}
|
||||||
|
else if (!srls.Desktop.IsMouseOverGUI && keyboardState.IsKeyDown(Keys.M) && connectionContext is null)
|
||||||
|
{
|
||||||
|
selectedLogicGate = logicGate;
|
||||||
|
}
|
||||||
else if (!srls.Desktop.IsMouseOverGUI && logicGate is IInteractable interactable)
|
else if (!srls.Desktop.IsMouseOverGUI && logicGate is IInteractable interactable)
|
||||||
{
|
{
|
||||||
interactable.OnInteraction(mouseState, previousMouseState, keyboardState);
|
interactable.OnInteraction(mouseState, previousMouseState, keyboardState);
|
||||||
@@ -236,14 +245,16 @@ internal class WorldScreen : SrlsScreen<Grid>
|
|||||||
|
|
||||||
if (selectedLogicGate is not null)
|
if (selectedLogicGate is not null)
|
||||||
{
|
{
|
||||||
Vector2 position = camera.ScreenToWorld(mouseState.Position.ToVector2());
|
// Convert screen to world coordinates and then to unscaled grid coordinates
|
||||||
position = new Vector2(position.X - RealMod(position.X, 100 * srls.Scale), position.Y - RealMod(position.Y, 100 * srls.Scale));
|
Vector2 position = camera.ScreenToWorld(mouseState.Position.ToVector2()) / srls.Scale;
|
||||||
|
|
||||||
|
// Snap to 100-unit grid (in unscaled coordinates)
|
||||||
|
position = new Vector2(position.X - RealMod(position.X, 100), position.Y - RealMod(position.Y, 100));
|
||||||
|
|
||||||
selectedLogicGate.WorldData.Position = position;
|
selectedLogicGate.WorldData.Position = position;
|
||||||
|
|
||||||
if (mouseState.WasButtonJustDown(MouseButton.Left) && !mouseOverGate && !srls.Desktop.IsMouseOverGUI)
|
if (mouseState.WasButtonJustDown(MouseButton.Left) && !mouseOverGate && !srls.Desktop.IsMouseOverGUI)
|
||||||
{
|
{
|
||||||
selectedLogicGate.WorldData.Position /= srls.Scale;
|
|
||||||
simulator.AddLogicGate(selectedLogicGate);
|
simulator.AddLogicGate(selectedLogicGate);
|
||||||
|
|
||||||
if (keyboardState.IsShiftDown())
|
if (keyboardState.IsShiftDown())
|
||||||
|
|||||||
Reference in New Issue
Block a user