stairs fix, wraptext fix, moved drawing sprites from GUIFrame to GUIComponent, server name and "welcome text" in netlobby

This commit is contained in:
Regalis
2015-07-21 18:43:57 +03:00
parent 326b46cf18
commit 9a7eae8ace
15 changed files with 158 additions and 59 deletions
@@ -48,7 +48,8 @@ namespace Subsurface
} }
break; break;
case Physics.CollisionPlatform: case Physics.CollisionPlatform:
if (IgnorePlatforms || stairs != null) return -1; Structure platform = fixture.Body.UserData as Structure;
if (IgnorePlatforms || LowestLimb.Position.Y < platform.Rect.Y) return -1;
break; break;
case Physics.CollisionWall: case Physics.CollisionWall:
break; break;
@@ -353,7 +354,7 @@ namespace Subsurface
Limb head = GetLimb(LimbType.Head); Limb head = GetLimb(LimbType.Head);
if (currentHull != null && currentHull.Volume < currentHull.FullVolume && !head.inWater) if (currentHull != null && (currentHull.Rect.Y - currentHull.Surface > 50.0f) && !head.inWater)
{ {
surfaceLimiter = (ConvertUnits.ToDisplayUnits(head.SimPosition.Y)-surfaceY); surfaceLimiter = (ConvertUnits.ToDisplayUnits(head.SimPosition.Y)-surfaceY);
surfaceLimiter = Math.Max(1.0f, surfaceLimiter); surfaceLimiter = Math.Max(1.0f, surfaceLimiter);
@@ -399,7 +400,7 @@ namespace Subsurface
movement = MathUtils.SmoothStep(movement, TargetMovement, 0.3f); movement = MathUtils.SmoothStep(movement, TargetMovement, 0.3f);
//dont try to move upwards if head is already out of water //dont try to move upwards if head is already out of water
if (surfaceLimiter > 1.0f) if (surfaceLimiter > 1.0f && TargetMovement.Y > 0.0f)
{ {
if (TargetMovement.X == 0.0f) if (TargetMovement.X == 0.0f)
{ {
+5
View File
@@ -74,6 +74,11 @@ namespace Subsurface
get { return doesFlip; } get { return doesFlip; }
} }
public Vector2 Position
{
get { return ConvertUnits.ToDisplayUnits(body.Position); }
}
public Vector2 SimPosition public Vector2 SimPosition
{ {
get { return body.Position; } get { return body.Position; }
+8 -2
View File
@@ -268,11 +268,17 @@ namespace Subsurface
if (ignorePlatforms) return false; if (ignorePlatforms) return false;
//the collision is ignored if the lowest limb is under the platform //the collision is ignored if the lowest limb is under the platform
if (lowestLimb==null || lowestLimb.SimPosition.Y < f2.Body.Position.Y) return false; if (lowestLimb==null || lowestLimb.Position.Y < structure.Rect.Y) return false;
} }
else if (structure.StairDirection!=Direction.None) else if (structure.StairDirection!=Direction.None)
{ {
if (inWater || !(targetMovement.Y>Math.Abs(targetMovement.X/2.0f)) && lowestLimb.body.Position.Y < ConvertUnits.ToSimUnits(structure.Rect.Y - structure.Rect.Height) + 0.5f) if (inWater || !(targetMovement.Y>Math.Abs(targetMovement.X/2.0f)) && lowestLimb.Position.Y < structure.Rect.Y - structure.Rect.Height + 50.0f)
{
stairs = null;
return false;
}
if (targetMovement.Y >= 0.0f && lowestLimb.SimPosition.Y > ConvertUnits.ToSimUnits(structure.Rect.Y - Submarine.GridSize.Y * 8.0f))
{ {
stairs = null; stairs = null;
return false; return false;
+3 -3
View File
@@ -47,11 +47,11 @@
</GUIScrollBar> </GUIScrollBar>
<GUITextBox <GUITextBox
color="0.8, 0.8, 0.8, 1.0" color="0.5, 0.5, 0.5, 1.0"
textcolor="0.0, 0.0, 0.0, 1.0" textcolor="1.0, 1.0, 1.0, 1.0"
outlinecolor="0.5, 0.57, 0.6, 1.0"> outlinecolor="0.5, 0.57, 0.6, 1.0">
<Sprite texture="Content\UI\uiBackground.png" size="0.0, 1.0" sourcerect ="0.0, 0.0, 0.0, 90.0"/> <Sprite texture="Content\UI\uiBackground.png" size="0.0, 0.0" sourcerect ="0.0, 90.0, 0.0, 100.0"/>
</GUITextBox> </GUITextBox>
<GUIMessageBox <GUIMessageBox
+18
View File
@@ -194,7 +194,25 @@ namespace Subsurface
public virtual void Draw(SpriteBatch spriteBatch) public virtual void Draw(SpriteBatch spriteBatch)
{ {
Color currColor = color;
if (state == ComponentState.Selected) currColor = selectedColor;
if (state == ComponentState.Hover) currColor = hoverColor;
GUI.DrawRectangle(spriteBatch, rect, currColor * (currColor.A / 255.0f), true);
if (sprites != null)
{
foreach (Sprite sprite in sprites)
{
Vector2 startPos = new Vector2(rect.X, rect.Y);
Vector2 size = new Vector2(sprite.SourceRect.Width, sprite.SourceRect.Height);
if (sprite.size.X == 0.0f) size.X = rect.Width;
if (sprite.size.Y == 0.0f) size.Y = rect.Height;
sprite.DrawTiled(spriteBatch, startPos, size, currColor * (currColor.A / 255.0f));
}
}
//Color newColor = color; //Color newColor = color;
//if (state == ComponentState.Selected) newColor = selectedColor; //if (state == ComponentState.Selected) newColor = selectedColor;
+2 -15
View File
@@ -39,27 +39,14 @@ namespace Subsurface
public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch) public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
{ {
base.Draw(spriteBatch);
Color currColor = color; Color currColor = color;
if (state == ComponentState.Selected) currColor = selectedColor; if (state == ComponentState.Selected) currColor = selectedColor;
if (state == ComponentState.Hover) currColor = hoverColor; if (state == ComponentState.Hover) currColor = hoverColor;
GUI.DrawRectangle(spriteBatch, rect, currColor * (currColor.A/255.0f), true); GUI.DrawRectangle(spriteBatch, rect, currColor * (currColor.A/255.0f), true);
base.Draw(spriteBatch);
if (sprites != null)
{
foreach (Sprite sprite in sprites)
{
Vector2 startPos = new Vector2(rect.X, rect.Y);
Vector2 size = new Vector2(sprite.SourceRect.Width, sprite.SourceRect.Height);
if (sprite.size.X == 0.0f) size.X = rect.Width;
if (sprite.size.Y == 0.0f) size.Y = rect.Height;
sprite.DrawTiled(spriteBatch, startPos, size, currColor * (currColor.A / 255.0f));
}
}
if (OutlineColor != Color.Transparent) if (OutlineColor != Color.Transparent)
{ {
+11 -7
View File
@@ -19,7 +19,9 @@ namespace Subsurface
public delegate string TextGetterHandler(); public delegate string TextGetterHandler();
public TextGetterHandler TextGetter; public TextGetterHandler TextGetter;
private bool wrap; public bool Wrap;
public override Vector4 Padding public override Vector4 Padding
{ {
@@ -111,7 +113,7 @@ namespace Subsurface
//if (wrap) //if (wrap)
//{ //{
this.wrap = wrap; this.Wrap = wrap;
// this.text = ToolBox.WrapText(this.text, rect.Width); // this.text = ToolBox.WrapText(this.text, rect.Width);
//} //}
@@ -124,19 +126,19 @@ namespace Subsurface
Vector2 size = MeasureText(); Vector2 size = MeasureText();
if (wrap && rect.Width>0) if (Wrap && rect.Width>0)
{ {
text = text.Replace("\n"," "); //text = text.Replace("\n"," ");
text = ToolBox.WrapText(text, rect.Width, Font); text = ToolBox.WrapText(text, rect.Width, Font);
Vector2 newSize = MeasureText(); Vector2 newSize = MeasureText();
Rectangle newRect = rect; //Rectangle newRect = rect;
//newRect.Width += (int)(newSize.X-size.X); //newRect.Width += (int)(newSize.X-size.X);
newRect.Height += (int)(newSize.Y - size.Y); //newRect.Height += (int)(newSize.Y - size.Y);
Rect = newRect; //Rect = newRect;
size = newSize; size = newSize;
} }
@@ -184,6 +186,8 @@ namespace Subsurface
GUI.DrawRectangle(spriteBatch, rect, currColor*(currColor.A/255.0f), true); GUI.DrawRectangle(spriteBatch, rect, currColor*(currColor.A/255.0f), true);
base.Draw(spriteBatch);
if (TextGetter != null) text = TextGetter(); if (TextGetter != null) text = TextGetter();
if (!string.IsNullOrEmpty(text)) if (!string.IsNullOrEmpty(text))
+11 -4
View File
@@ -24,6 +24,12 @@ namespace Subsurface
public delegate bool OnTextChangedHandler(GUITextBox textBox, string text); public delegate bool OnTextChangedHandler(GUITextBox textBox, string text);
public OnTextChangedHandler OnTextChanged; public OnTextChangedHandler OnTextChanged;
public bool Wrap
{
get { return textBlock.Wrap; }
set { textBlock.Wrap = value; }
}
public bool Enabled public bool Enabled
{ {
get; get;
@@ -74,9 +80,9 @@ namespace Subsurface
textBlock.Text = filtered; textBlock.Text = filtered;
if (Font.MeasureString(textBlock.Text).X > rect.Width) if (!Wrap && Font.MeasureString(textBlock.Text).X > rect.Width)
{ {
//recursion to ensure that text cannot be larger than the box //ensure that text cannot be larger than the box
Text = textBlock.Text.Substring(0, textBlock.Text.Length - 1); Text = textBlock.Text.Substring(0, textBlock.Text.Length - 1);
} }
} }
@@ -111,7 +117,7 @@ namespace Subsurface
if (parent != null) if (parent != null)
parent.AddChild(this); parent.AddChild(this);
textBlock = new GUITextBlock(new Rectangle(0,0,0,0), "", color, textColor, textAlignment, null, this); textBlock = new GUITextBlock(new Rectangle(0,0,0,0), "", color, textColor, textAlignment, style, this);
textBlock.Padding = new Vector4(10.0f, 0.0f, 10.0f, 0.0f); textBlock.Padding = new Vector4(10.0f, 0.0f, 10.0f, 0.0f);
if (style != null) style.Apply(textBlock, this); if (style != null) style.Apply(textBlock, this);
@@ -121,6 +127,7 @@ namespace Subsurface
public void Select() public void Select()
{ {
Selected = true;
keyboardDispatcher.Subscriber = this; keyboardDispatcher.Subscriber = this;
if (Clicked != null) Clicked(this); if (Clicked != null) Clicked(this);
} }
@@ -172,7 +179,7 @@ namespace Subsurface
{ {
GUI.DrawLine(spriteBatch, GUI.DrawLine(spriteBatch,
new Vector2((int)caretPos.X + 2, caretPos.Y + 3), new Vector2((int)caretPos.X + 2, caretPos.Y + 3),
new Vector2((int)caretPos.X + 2, caretPos.Y + rect.Height - 3), new Vector2((int)caretPos.X + 2, caretPos.Y + Font.MeasureString(Text).Y - 3),
textBlock.TextColor * (textBlock.TextColor.A / 255.0f)); textBlock.TextColor * (textBlock.TextColor.A / 255.0f));
} }
+1 -1
View File
@@ -44,7 +44,7 @@ namespace Subsurface
private string RandomName(LocationType type) private string RandomName(LocationType type)
{ {
string name = ToolBox.GetRandomLine("Content/Map/locationNames.txt"); string name = ToolBox.GetRandomLine("Content/Map/locationNames.txt");
int nameFormatIndex = Rand.Int(type.NameFormats.Count); int nameFormatIndex = Rand.Int(type.NameFormats.Count, false);
return type.NameFormats[nameFormatIndex].Replace("[name]", name); return type.NameFormats[nameFormatIndex].Replace("[name]", name);
} }
} }
+1 -1
View File
@@ -47,7 +47,7 @@ namespace Subsurface
{ {
Debug.Assert(list.Count > 0, "LocationType.list.Count == 0, you probably need to initialize LocationTypes"); Debug.Assert(list.Count > 0, "LocationType.list.Count == 0, you probably need to initialize LocationTypes");
int randInt = Rand.Int(totalWeight); int randInt = Rand.Int(totalWeight, false);
foreach (LocationType type in list) foreach (LocationType type in list)
{ {
+1 -2
View File
@@ -64,8 +64,7 @@ namespace Subsurface
iceTexture = Game1.TextureLoader.FromFile("Content/Map/iceSurface.png"); iceTexture = Game1.TextureLoader.FromFile("Content/Map/iceSurface.png");
iceCraters = Game1.TextureLoader.FromFile("Content/Map/iceCraters.png"); iceCraters = Game1.TextureLoader.FromFile("Content/Map/iceCraters.png");
iceCrack = Game1.TextureLoader.FromFile("Content/Map/iceCrack.png"); iceCrack = Game1.TextureLoader.FromFile("Content/Map/iceCrack.png");
Rand.SetSyncedSeed(this.seed); Rand.SetSyncedSeed(this.seed);
GenerateLocations(); GenerateLocations();
+20 -2
View File
@@ -208,7 +208,7 @@ namespace Subsurface
bodies = new List<Body>(); bodies = new List<Body>();
Body newBody = BodyFactory.CreateRectangle(Game1.World, Body newBody = BodyFactory.CreateRectangle(Game1.World,
ConvertUnits.ToSimUnits(rect.Width * Math.Sqrt(2.0) - Submarine.GridSize.X), ConvertUnits.ToSimUnits(rect.Width * Math.Sqrt(2.0) + Submarine.GridSize.X*3.0f),
ConvertUnits.ToSimUnits(10), ConvertUnits.ToSimUnits(10),
1.5f); 1.5f);
@@ -218,7 +218,6 @@ namespace Subsurface
(StairDirection == Direction.Right) ? -Submarine.GridSize.X*1.5f : Submarine.GridSize.X*1.5f, (StairDirection == Direction.Right) ? -Submarine.GridSize.X*1.5f : Submarine.GridSize.X*1.5f,
- Submarine.GridSize.Y*2.0f); - Submarine.GridSize.Y*2.0f);
newBody.Position = ConvertUnits.ToSimUnits(stairPos); newBody.Position = ConvertUnits.ToSimUnits(stairPos);
newBody.Rotation = (StairDirection == Direction.Right) ? MathHelper.PiOver4 : -MathHelper.PiOver4; newBody.Rotation = (StairDirection == Direction.Right) ? MathHelper.PiOver4 : -MathHelper.PiOver4;
newBody.Friction = 0.8f; newBody.Friction = 0.8f;
@@ -228,6 +227,25 @@ namespace Subsurface
newBody.UserData = this; newBody.UserData = this;
bodies.Add(newBody); bodies.Add(newBody);
//newBody = BodyFactory.CreateRectangle(Game1.World,
// ConvertUnits.ToSimUnits(Submarine.GridSize.X*2),
// ConvertUnits.ToSimUnits(10.0f),
// 1.5f);
//newBody.BodyType = BodyType.Static;
////newBody.IsSensor = true;
//newBody.Position = ConvertUnits.ToSimUnits(
// new Vector2(Position.X + (rect.Width/2 + Submarine.GridSize.X) * ((StairDirection == Direction.Right) ? -1.0f : 1.0f), rect.Y + 5.0f));
////newBody.Rotation = (StairDirection == Direction.Right) ? MathHelper.PiOver4 : -MathHelper.PiOver4;
////newBody.Friction = 0.8f;
//newBody.CollisionCategories = Physics.CollisionStairs;
//newBody.UserData = this;
//bodies.Add(newBody);
} }
} }
+35 -10
View File
@@ -32,6 +32,7 @@ namespace Subsurface
private float camAngle; private float camAngle;
public bool IsServer; public bool IsServer;
public string ServerName, ServerMessage;
public Submarine SelectedMap public Submarine SelectedMap
{ {
@@ -44,6 +45,16 @@ namespace Subsurface
get { return modeList.SelectedData as GameModePreset; } get { return modeList.SelectedData as GameModePreset; }
} }
//for guitextblock delegate
public string GetServerName()
{
return ServerName;
}
public string GetServerMessage()
{
return ServerMessage;
}
public TimeSpan GameDuration public TimeSpan GameDuration
{ {
get get
@@ -145,8 +156,8 @@ namespace Subsurface
textBox.Select(); textBox.Select();
new GUITextBlock(new Rectangle(0, 30, 0, 30), "Selected submarine:", GUI.style, infoFrame); new GUITextBlock(new Rectangle(0, 110, 0, 30), "Selected submarine:", GUI.style, infoFrame);
subList = new GUIListBox(new Rectangle(0, 60, 200, 200), Color.White, GUI.style, infoFrame); subList = new GUIListBox(new Rectangle(0, 140, 200, 200), Color.White, GUI.style, infoFrame);
subList.OnSelected = SelectMap; subList.OnSelected = SelectMap;
subList.Enabled = (Game1.Server != null); subList.Enabled = (Game1.Server != null);
@@ -169,8 +180,8 @@ namespace Subsurface
return; return;
} }
new GUITextBlock(new Rectangle(220, 30, 0, 30), "Selected game mode: ", GUI.style, infoFrame); new GUITextBlock(new Rectangle(220, 110, 0, 30), "Selected game mode: ", GUI.style, infoFrame);
modeList = new GUIListBox(new Rectangle(220, 60, 200, 200), GUI.style, infoFrame); modeList = new GUIListBox(new Rectangle(220, 140, 200, 200), GUI.style, infoFrame);
modeList.Enabled = (Game1.Server != null); modeList.Enabled = (Game1.Server != null);
foreach (GameModePreset mode in GameModePreset.list) foreach (GameModePreset mode in GameModePreset.list)
@@ -186,29 +197,39 @@ namespace Subsurface
textBlock.UserData = mode; textBlock.UserData = mode;
} }
GUITextBlock durationText = new GUITextBlock(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 30, 100, 20), GUITextBlock durationText = new GUITextBlock(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 110, 100, 20),
"Game duration: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame); "Game duration: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame);
durationText.TextGetter = DurationText; durationText.TextGetter = DurationText;
durationBar = new GUIScrollBar(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 60, 180, 20), durationBar = new GUIScrollBar(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 140, 180, 20),
GUI.style, 0.1f, infoFrame); GUI.style, 0.1f, infoFrame);
durationBar.BarSize = 0.1f; durationBar.BarSize = 0.1f;
durationBar.Enabled = (Game1.Server != null); durationBar.Enabled = (Game1.Server != null);
new GUITextBlock(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 100, 100, 20), new GUITextBlock(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 180, 100, 20),
"Level Seed: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame); "Level Seed: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame);
seedBox = new GUITextBox(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 130, 180, 20), seedBox = new GUITextBox(new Rectangle((int)(modeList.Rect.Right + 20 - 80), 210, 180, 20),
Alignment.TopLeft, GUI.style, infoFrame); Alignment.TopLeft, GUI.style, infoFrame);
seedBox.OnEnter = SelectSeed; seedBox.OnEnter = SelectSeed;
seedBox.Enabled = (Game1.Server != null); seedBox.Enabled = (Game1.Server != null);
LevelSeed = ToolBox.RandomSeed(8); LevelSeed = ToolBox.RandomSeed(8);
var serverName = new GUITextBlock(new Rectangle(0, 0, 200, 30),
"Server: ", GUI.style, Alignment.Left, Alignment.TopLeft, infoFrame);
serverName.TextGetter = GetServerName;
var serverMessage = new GUITextBox(new Rectangle(0, 30, 360, 70),null,null, Alignment.TopLeft, Alignment.TopLeft, GUI.style, infoFrame);
serverMessage.Enabled = false;
serverMessage.Wrap = true;
if (IsServer && Game1.Server != null) if (IsServer && Game1.Server != null)
{ {
GUIButton startButton = new GUIButton(new Rectangle(0, 0, 200, 30), "Start", GUI.style, infoFrame); GUIButton startButton = new GUIButton(new Rectangle(0, 0, 200, 30), "Start", Alignment.TopRight, GUI.style, infoFrame);
startButton.OnClicked = Game1.Server.StartGame; startButton.OnClicked = Game1.Server.StartGame;
serverMessage.Enabled = true;
//mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby); //mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby);
modeList.OnSelected = Game1.Server.UpdateNetLobby; modeList.OnSelected = Game1.Server.UpdateNetLobby;
durationBar.OnMoved = Game1.Server.UpdateNetLobby; durationBar.OnMoved = Game1.Server.UpdateNetLobby;
@@ -517,6 +538,8 @@ namespace Subsurface
msg.Write(selectedMap.Hash.Hash); msg.Write(selectedMap.Hash.Hash);
} }
msg.Write(ServerName);
msg.Write(modeList.SelectedIndex-1); msg.Write(modeList.SelectedIndex-1);
msg.Write(durationBar.BarScroll); msg.Write(durationBar.BarScroll);
msg.Write(LevelSeed); msg.Write(LevelSeed);
@@ -538,7 +561,9 @@ namespace Subsurface
string mapName = msg.ReadString(); string mapName = msg.ReadString();
string md5Hash = msg.ReadString(); string md5Hash = msg.ReadString();
TrySelectMap(mapName, md5Hash); TrySelectMap(mapName, md5Hash);
ServerName = msg.ReadString();
//mapList.Select(msg.ReadInt32()); //mapList.Select(msg.ReadInt32());
modeList.Select(msg.ReadInt32()); modeList.Select(msg.ReadInt32());
+38 -9
View File
@@ -256,27 +256,56 @@ namespace Subsurface
.ToArray()); .ToArray());
} }
public static string WrapText(string text, float lineWidth, SpriteFont font) public static string WrapText(string text, float lineLength, SpriteFont font)
{ {
if (GUI.Font.MeasureString(text).X < lineWidth) return text; if (font.MeasureString(text).X < lineLength) return text;
string[] words = text.Split(' ', '\n');
string[] words = text.Split(' ');
StringBuilder wrappedText = new StringBuilder(); StringBuilder wrappedText = new StringBuilder();
float linewidth = 0f; float linePos = 0f;
float spaceWidth = font.MeasureString(" ").X; float spaceWidth = font.MeasureString(" ").X;
for (int i = 0; i < words.Length; ++i) for (int i = 0; i < words.Length; ++i)
{ {
Vector2 size = font.MeasureString(words[i]); if (string.IsNullOrWhiteSpace(words[i])) continue;
if (linewidth + size.X < lineWidth)
Vector2 size;
string tempWord = words[i];
string prevWord = words[i];
while ((size = font.MeasureString(tempWord)).X > lineLength)
{ {
linewidth += size.X + spaceWidth; tempWord = tempWord.Remove(tempWord.Length - 1, 1);
}
words[i] = tempWord;
if (prevWord.Length> tempWord.Length)
{
wrappedText.Append(words[i]);
wrappedText.Append(" \n");
wrappedText.Append(prevWord.Remove(0, tempWord.Length));
linePos = lineLength*2.0f;
continue;
}
if (linePos + size.X < lineLength)
{
wrappedText.Append(words[i]);
linePos += size.X + spaceWidth;
} }
else else
{ {
//if (i>0)wrappedText.Remove(wrappedText.Length - 1, 1);
wrappedText.Append("\n"); wrappedText.Append("\n");
linewidth = size.X + spaceWidth; wrappedText.Append(words[i]);
linePos = size.X + spaceWidth;
} }
wrappedText.Append(words[i]);
if (i<words.Length-1) wrappedText.Append(" "); if (i<words.Length-1) wrappedText.Append(" ");
} }
Binary file not shown.