UI/GameMenu/Canvas/GameCanvas.razor.cs
using Sandbox.UI;
namespace GuessIt;
public partial class GameCanvas
{
// Drawing Variables
bool IsDrawing = false;
List<Vector2> DrawingPoints = new List<Vector2>();
// UI Variables
Image Canvas { get; set; }
public void SetTexture( Texture texture )
{
Canvas.Texture = texture;
}
public void MarkDirty()
{
Canvas?.MarkRenderDirty();
}
protected override void OnAfterTreeRender( bool firstRender )
{
base.OnAfterTreeRender( firstRender );
if ( Canvas is not null && GameMenu.Instance?.Canvas is not null )
{
Canvas.Texture = GameMenu.Instance.Canvas;
}
}
protected override void OnMouseDown( MousePanelEvent e )
{
base.OnMouseDown( e );
Log.Info( $"[GameCanvas] OnMouseDown LocalPos={e.LocalPosition} CanvasSize={Canvas?.Box?.Rect.Size} PlayerIsDrawing={Player.Local?.IsDrawing}" );
DrawingPoints.Clear();
IsDrawing = true;
AddPoint( e.LocalPosition );
}
protected override void OnMouseMove( MousePanelEvent e )
{
base.OnMouseMove( e );
if ( IsDrawing )
{
bool returnVal = AddPoint( e.LocalPosition );
if ( returnVal == false )
{
Log.Info( $"[GameCanvas] AddPoint failed during move, stopping draw" );
StopDrawing();
}
}
}
protected override void OnMouseUp( MousePanelEvent e )
{
base.OnMouseUp( e );
StopDrawing();
}
void StopDrawing()
{
if ( !IsDrawing ) return;
IsDrawing = false;
if ( DrawingPoints.Count > 0 )
{
GameMenu.Instance.BroadcastDraw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
}
else
{
var canvasSize = Canvas?.Box?.Rect.Size ?? Vector2.One;
var pos = MousePosition / canvasSize * new Vector2( 320, 240 );
GameMenu.Instance.BroadcastDraw( pos, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
}
DrawingPoints.Clear();
}
bool AddPoint( Vector2 vec2 )
{
if ( !(Player.Local?.IsDrawing ?? false) ) return false;
if ( !IsDrawing ) return false;
var canvasSize = Canvas?.Box?.Rect.Size ?? Vector2.Zero;
if ( canvasSize.x <= 0 || canvasSize.y <= 0 )
{
Log.Warning( $"[GameCanvas] Canvas size is zero or invalid: {canvasSize}" );
return false;
}
Vector2 pos = (vec2 / canvasSize) * new Vector2( 320, 240 );
if ( pos.x < 0 || pos.x > 320 || pos.y < 0 || pos.y > 240 ) return false;
DrawingPoints.Add( pos );
if ( DrawingPoints.Count > 1 )
{
GameMenu.Instance.Draw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
}
else
{
GameMenu.Instance.Draw( DrawingPoints[0], GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
}
if ( DrawingPoints.Count >= 5 )
{
var last = DrawingPoints.LastOrDefault();
GameMenu.Instance.BroadcastDraw( DrawingPoints, GameMenu.Instance.BrushColor, GameMenu.Instance.BrushSize );
DrawingPoints.Clear();
DrawingPoints.Add( last );
}
return true;
}
}