Added Xuzzle sample
This commit is contained in:
parent
dcec2428d5
commit
750adae87c
78
Ooui.sln
78
Ooui.sln
|
@ -1,21 +1,20 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26124.0
|
||||
VisualStudioVersion = 15.0.27130.2003
|
||||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ooui", "Ooui\Ooui.csproj", "{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ooui", "Ooui\Ooui.csproj", "{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples.csproj", "{CDF8BB01-40BB-402F-8446-47AA6F1628F3}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples", "Samples\Samples.csproj", "{CDF8BB01-40BB-402F-8446-47AA6F1628F3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Tests\Tests.csproj", "{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ooui.Forms", "Ooui.Forms\Ooui.Forms.csproj", "{DB819A2F-91E1-40FB-8D48-6544169966B8}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ooui.Forms", "Ooui.Forms\Ooui.Forms.csproj", "{DB819A2F-91E1-40FB-8D48-6544169966B8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ooui.AspNetCore", "Ooui.AspNetCore\Ooui.AspNetCore.csproj", "{2EDF0328-698B-458A-B10C-AB1B4786A6CA}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ooui.AspNetCore", "Ooui.AspNetCore\Ooui.AspNetCore.csproj", "{2EDF0328-698B-458A-B10C-AB1B4786A6CA}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PlatformSamples", "PlatformSamples", "{12ADF328-BBA8-48FC-9AF1-F11B7921D9EA}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCoreMvc", "PlatformSamples\AspNetCoreMvc\AspNetCoreMvc.csproj", "{7C6D477C-3378-4A86-9C31-AAD51204120B}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspNetCoreMvc", "PlatformSamples\AspNetCoreMvc\AspNetCoreMvc.csproj", "{7C6D477C-3378-4A86-9C31-AAD51204120B}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
@ -26,46 +25,43 @@ Global
|
|||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x64.Build.0 = Debug|x64
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x86.Build.0 = Debug|x86
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x64.ActiveCfg = Release|x64
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x64.Build.0 = Release|x64
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x86.ActiveCfg = Release|x86
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x86.Build.0 = Release|x86
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x64.Build.0 = Release|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DFDFD036-BF48-4D3A-BF99-88CA1EA8E4B9}.Release|x86.Build.0 = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x64.Build.0 = Debug|x64
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x86.Build.0 = Debug|x86
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x64.ActiveCfg = Release|x64
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x64.Build.0 = Release|x64
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x86.ActiveCfg = Release|x86
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x86.Build.0 = Release|x86
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x64.Build.0 = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{CDF8BB01-40BB-402F-8446-47AA6F1628F3}.Release|x86.Build.0 = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x64.Build.0 = Debug|x64
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x86.Build.0 = Debug|x86
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x64.ActiveCfg = Release|x64
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x64.Build.0 = Release|x64
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x86.ActiveCfg = Release|x86
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x86.Build.0 = Release|x86
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x64.Build.0 = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{78F6E9E7-4322-4F87-8CE9-1EEF1B16D268}.Release|x86.Build.0 = Release|Any CPU
|
||||
{DB819A2F-91E1-40FB-8D48-6544169966B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DB819A2F-91E1-40FB-8D48-6544169966B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DB819A2F-91E1-40FB-8D48-6544169966B8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
|
@ -103,6 +99,15 @@ Global
|
|||
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7C6D477C-3378-4A86-9C31-AAD51204120B}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{7C6D477C-3378-4A86-9C31-AAD51204120B} = {12ADF328-BBA8-48FC-9AF1-F11B7921D9EA}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {9370DD6D-816D-4E0F-8356-835F65DCF3AA}
|
||||
EndGlobalSection
|
||||
GlobalSection(MonoDevelopProperties) = preSolution
|
||||
Policies = $0
|
||||
$0.TextStylePolicy = $1
|
||||
|
@ -122,7 +127,4 @@ Global
|
|||
$2.SpacingAfterMethodDeclarationName = True
|
||||
$2.SpaceAfterMethodCallName = True
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{7C6D477C-3378-4A86-9C31-AAD51204120B} = {12ADF328-BBA8-48FC-9AF1-F11B7921D9EA}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:58785/",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"AspNetCoreMvc": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:58786/"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@ namespace Samples
|
|||
new FilesSample ().Publish ();
|
||||
new DisplayAlertSample ().Publish ();
|
||||
new EditorSample().Publish();
|
||||
new XuzzleSample().Publish();
|
||||
|
||||
UI.Present ("/display-alert");
|
||||
|
||||
|
|
|
@ -47,6 +47,10 @@
|
|||
<None Remove="BugSweeper\Images\RedBug.png" />
|
||||
<None Remove="BugSweeper\Images\Xamarin120.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="TipCalc\" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
|
|
|
@ -0,0 +1,280 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Xuzzle
|
||||
{
|
||||
public class XuzzlePage : ContentPage
|
||||
{
|
||||
// Number of squares horizontally and vertically,
|
||||
// but if you change it, some code will break.
|
||||
static readonly int NUM = 4;
|
||||
|
||||
// Array of XuzzleSquare views, and empty row & column.
|
||||
XuzzleSquare[,] squares = new XuzzleSquare[NUM, NUM];
|
||||
int emptyRow = NUM - 1;
|
||||
int emptyCol = NUM - 1;
|
||||
|
||||
StackLayout stackLayout;
|
||||
AbsoluteLayout absoluteLayout;
|
||||
Button randomizeButton;
|
||||
Label timeLabel;
|
||||
double squareSize;
|
||||
bool isBusy;
|
||||
bool isPlaying;
|
||||
|
||||
public XuzzlePage()
|
||||
{
|
||||
// AbsoluteLayout to host the squares.
|
||||
absoluteLayout = new AbsoluteLayout()
|
||||
{
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
VerticalOptions = LayoutOptions.Center
|
||||
};
|
||||
|
||||
// Create XuzzleSquare's for all the rows and columns.
|
||||
string text = "{XAMARIN.FORMS}";
|
||||
string winText = "CONGRATULATIONS";
|
||||
int index = 0;
|
||||
|
||||
for (int row = 0; row < NUM; row++)
|
||||
{
|
||||
for (int col = 0; col < NUM; col++)
|
||||
{
|
||||
// But skip the last one!
|
||||
if (row == NUM - 1 && col == NUM - 1)
|
||||
break;
|
||||
|
||||
// Instantiate XuzzleSquare.
|
||||
XuzzleSquare square = new XuzzleSquare(text[index], winText[index], index)
|
||||
{
|
||||
Row = row,
|
||||
Col = col
|
||||
};
|
||||
|
||||
// Add tap recognition
|
||||
TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer
|
||||
{
|
||||
Command = new Command(OnSquareTapped),
|
||||
CommandParameter = square
|
||||
};
|
||||
square.GestureRecognizers.Add(tapGestureRecognizer);
|
||||
|
||||
// Add it to the array and the AbsoluteLayout.
|
||||
squares[row, col] = square;
|
||||
absoluteLayout.Children.Add(square);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
// This is the "Randomize" button.
|
||||
randomizeButton = new Button
|
||||
{
|
||||
Text = "Randomize",
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
VerticalOptions = LayoutOptions.CenterAndExpand
|
||||
};
|
||||
randomizeButton.Clicked += OnRandomizeButtonClicked;
|
||||
|
||||
// Label to display elapsed time.
|
||||
timeLabel = new Label
|
||||
{
|
||||
FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
|
||||
FontAttributes = FontAttributes.Bold,
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
VerticalOptions = LayoutOptions.CenterAndExpand
|
||||
};
|
||||
|
||||
// Put everything in a StackLayout.
|
||||
stackLayout = new StackLayout
|
||||
{
|
||||
Children = {
|
||||
new StackLayout {
|
||||
VerticalOptions = LayoutOptions.FillAndExpand,
|
||||
HorizontalOptions = LayoutOptions.FillAndExpand,
|
||||
Children = {
|
||||
randomizeButton,
|
||||
timeLabel
|
||||
}
|
||||
},
|
||||
absoluteLayout
|
||||
}
|
||||
};
|
||||
stackLayout.SizeChanged += OnStackSizeChanged;
|
||||
|
||||
// And set that to the content of the page.
|
||||
this.Padding = new Thickness(0, Device.RuntimePlatform == Device.iOS ? 20 : 0, 0, 0);
|
||||
this.Content = stackLayout;
|
||||
}
|
||||
|
||||
void OnStackSizeChanged(object sender, EventArgs args)
|
||||
{
|
||||
double width = stackLayout.Width;
|
||||
double height = stackLayout.Height;
|
||||
|
||||
if (width <= 0 || height <= 0)
|
||||
return;
|
||||
|
||||
// Orient StackLayout based on portrait/landscape mode.
|
||||
stackLayout.Orientation = (width < height) ? StackOrientation.Vertical :
|
||||
StackOrientation.Horizontal;
|
||||
|
||||
// Calculate square size and position based on stack size.
|
||||
squareSize = Math.Min(width, height) / NUM;
|
||||
absoluteLayout.WidthRequest = NUM * squareSize;
|
||||
absoluteLayout.HeightRequest = NUM * squareSize;
|
||||
|
||||
foreach (View view in absoluteLayout.Children)
|
||||
{
|
||||
XuzzleSquare square = (XuzzleSquare)view;
|
||||
square.SetLabelFont(0.4 * squareSize, FontAttributes.Bold);
|
||||
|
||||
AbsoluteLayout.SetLayoutBounds(square,
|
||||
new Rectangle(square.Col * squareSize,
|
||||
square.Row * squareSize,
|
||||
squareSize,
|
||||
squareSize));
|
||||
}
|
||||
}
|
||||
|
||||
async void OnSquareTapped(object parameter)
|
||||
{
|
||||
if (isBusy)
|
||||
return;
|
||||
|
||||
isBusy = true;
|
||||
XuzzleSquare tappedSquare = (XuzzleSquare)parameter;
|
||||
await ShiftIntoEmpty(tappedSquare.Row, tappedSquare.Col);
|
||||
isBusy = false;
|
||||
|
||||
// Check for a "win".
|
||||
if (isPlaying)
|
||||
{
|
||||
int index;
|
||||
|
||||
for (index = 0; index < NUM * NUM - 1; index++)
|
||||
{
|
||||
int row = index / NUM;
|
||||
int col = index % NUM;
|
||||
XuzzleSquare square = squares[row, col];
|
||||
if (square == null || square.Index != index)
|
||||
break;
|
||||
}
|
||||
|
||||
// We have a winner!
|
||||
if (index == NUM * NUM - 1)
|
||||
{
|
||||
isPlaying = false;
|
||||
await DoWinAnimation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async Task ShiftIntoEmpty(int tappedRow, int tappedCol, uint length = 100)
|
||||
{
|
||||
// Shift columns.
|
||||
if (tappedRow == emptyRow && tappedCol != emptyCol)
|
||||
{
|
||||
int inc = Math.Sign(tappedCol - emptyCol);
|
||||
int begCol = emptyCol + inc;
|
||||
int endCol = tappedCol + inc;
|
||||
|
||||
for (int col = begCol; col != endCol; col += inc)
|
||||
{
|
||||
await AnimateSquare(emptyRow, col, emptyRow, emptyCol, length);
|
||||
}
|
||||
}
|
||||
// Shift rows.
|
||||
else if (tappedCol == emptyCol && tappedRow != emptyRow)
|
||||
{
|
||||
int inc = Math.Sign(tappedRow - emptyRow);
|
||||
int begRow = emptyRow + inc;
|
||||
int endRow = tappedRow + inc;
|
||||
|
||||
for (int row = begRow; row != endRow; row += inc)
|
||||
{
|
||||
await AnimateSquare(row, emptyCol, emptyRow, emptyCol, length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async Task AnimateSquare(int row, int col, int newRow, int newCol, uint length)
|
||||
{
|
||||
// The Square to be animated.
|
||||
XuzzleSquare animaSquare = squares[row, col];
|
||||
|
||||
// The destination rectangle.
|
||||
Rectangle rect = new Rectangle(squareSize * emptyCol,
|
||||
squareSize * emptyRow,
|
||||
squareSize,
|
||||
squareSize);
|
||||
|
||||
// This is the actual animation call.
|
||||
await animaSquare.LayoutTo(rect, length);
|
||||
|
||||
// Set several variables and properties for new layout.
|
||||
squares[newRow, newCol] = animaSquare;
|
||||
animaSquare.Row = newRow;
|
||||
animaSquare.Col = newCol;
|
||||
squares[row, col] = null;
|
||||
emptyRow = row;
|
||||
emptyCol = col;
|
||||
}
|
||||
|
||||
async void OnRandomizeButtonClicked(object sender, EventArgs args)
|
||||
{
|
||||
Button button = (Button)sender;
|
||||
button.IsEnabled = false;
|
||||
Random rand = new Random();
|
||||
|
||||
isBusy = true;
|
||||
|
||||
// Simulate some fast crazy taps.
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
await ShiftIntoEmpty(rand.Next(NUM), emptyCol, 25);
|
||||
await ShiftIntoEmpty(emptyRow, rand.Next(NUM), 25);
|
||||
}
|
||||
button.IsEnabled = true;
|
||||
|
||||
isBusy = false;
|
||||
|
||||
// Prepare for playing.
|
||||
DateTime startTime = DateTime.Now;
|
||||
|
||||
Device.StartTimer(TimeSpan.FromSeconds(1), () => {
|
||||
// Round duration and get rid of milliseconds.
|
||||
TimeSpan timeSpan = (DateTime.Now - startTime) +
|
||||
TimeSpan.FromSeconds(0.5);
|
||||
timeSpan = new TimeSpan(timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
|
||||
|
||||
// Display the duration.
|
||||
if (isPlaying)
|
||||
timeLabel.Text = timeSpan.ToString("t");
|
||||
return isPlaying;
|
||||
});
|
||||
this.isPlaying = true;
|
||||
}
|
||||
|
||||
async Task DoWinAnimation()
|
||||
{
|
||||
// Inhibit all input.
|
||||
randomizeButton.IsEnabled = false;
|
||||
isBusy = true;
|
||||
|
||||
for (int cycle = 0; cycle < 2; cycle++)
|
||||
{
|
||||
foreach (XuzzleSquare square in squares)
|
||||
if (square != null)
|
||||
await square.AnimateWinAsync(cycle == 1);
|
||||
|
||||
if (cycle == 0)
|
||||
await Task.Delay(1500);
|
||||
}
|
||||
|
||||
// All input.
|
||||
randomizeButton.IsEnabled = true;
|
||||
isBusy = false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
using System.Threading.Tasks;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Xuzzle
|
||||
{
|
||||
public class XuzzleSquare : ContentView
|
||||
{
|
||||
Label label;
|
||||
string normText, winText;
|
||||
|
||||
public XuzzleSquare(char normChar, char winChar, int index)
|
||||
{
|
||||
this.Index = index;
|
||||
this.normText = normChar.ToString();
|
||||
this.winText = winChar.ToString();
|
||||
|
||||
// A Frame surrounding two Labels.
|
||||
label = new Label
|
||||
{
|
||||
Text = this.normText,
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
VerticalOptions = LayoutOptions.CenterAndExpand
|
||||
};
|
||||
|
||||
Label tinyLabel = new Label
|
||||
{
|
||||
Text = (index + 1).ToString(),
|
||||
FontSize = Device.GetNamedSize(NamedSize.Micro, typeof(Label)),
|
||||
HorizontalOptions = LayoutOptions.End
|
||||
};
|
||||
|
||||
this.Padding = new Thickness(3);
|
||||
this.Content = new Frame
|
||||
{
|
||||
OutlineColor = Color.Accent,
|
||||
Padding = new Thickness(5, 10, 5, 0),
|
||||
Content = new StackLayout
|
||||
{
|
||||
Spacing = 0,
|
||||
Children = {
|
||||
label,
|
||||
tinyLabel,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Don't let touch pass us by.
|
||||
this.BackgroundColor = Color.Transparent;
|
||||
}
|
||||
|
||||
// Retain current Row and Col position.
|
||||
public int Index { private set; get; }
|
||||
|
||||
public int Row { set; get; }
|
||||
|
||||
public int Col { set; get; }
|
||||
|
||||
public async Task AnimateWinAsync(bool isReverse)
|
||||
{
|
||||
uint length = 150;
|
||||
await Task.WhenAll(this.ScaleTo(3, length), this.RotateTo(180, length));
|
||||
label.Text = isReverse ? normText : winText;
|
||||
await Task.WhenAll(this.ScaleTo(1, length), this.RotateTo(360, length));
|
||||
this.Rotation = 0;
|
||||
}
|
||||
|
||||
public void SetLabelFont(double fontSize, FontAttributes attributes)
|
||||
{
|
||||
label.FontSize = fontSize;
|
||||
label.FontAttributes = attributes;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
using Ooui;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Samples
|
||||
{
|
||||
public class XuzzleSample : ISample
|
||||
{
|
||||
public string Title => "Xamarin.Forms Xuzzle";
|
||||
|
||||
public Ooui.Element CreateElement()
|
||||
{
|
||||
var page = new Xuzzle.XuzzlePage();
|
||||
return page.GetOouiElement();
|
||||
}
|
||||
|
||||
public void Publish()
|
||||
{
|
||||
UI.Publish("/xuzzle", CreateElement);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue