そこで、Silverlight で垂直スクロール ゲームを作成するための新しいアルゴリズムをいくつかテストしてきました。私は非常に簡単な解決策を思いつきました。ただし、電話で実行すると、フレームレートに多くの矛盾があります. これが貧弱なアルゴリズムによるものなのか、一度に多くのものを描画するのか (現時点では png 背景とストック プレーヤー画像のみ) が原因なのかはわかりません。
基本的に私が欲しいのは、すべての更新メソッドを実行できるメソッドを実行し、ゲームのどの部分にいても一貫したルック アンド フィールを持つゲーム ループ タイマーです。これがバックエンドのコードです。
public partial class MainPage : PhoneApplicationPage
{
// Constructor
int counter = 0;
DispatcherTimer playerTimer;
string _START = "START";
string _FALLING = "FALLING";
string _LEFT = "LEFT";
string _RIGHT = "RIGHT";
string _CENTER = "CENTER";
string playerState = "";
int playerMoveTimeout = 20;
public MainPage()
{
InitializeComponent();
playerState = _START;
playerTimer = new DispatcherTimer();
playerTimer.Interval = TimeSpan.FromSeconds(.00999);
playerTimer.Tick += playerTimer_Tick;
playerTimer.Start();
}
void playerTimer_Tick(object sender, EventArgs e)
{
updatePlayer();
if (counter > 0)
{
counter = updateBG(counter);
}
}
public void updatePlayer()
{
if (Canvas.GetLeft(Player) + Player.Width >= 480)
{
playerState = _LEFT;
}
else if (Canvas.GetLeft(Player) <= 0)
{
playerState = _RIGHT;
}
if(playerMoveTimeout <= 0)
{
playerState = _FALLING;
}
if (playerState.Equals(_START))
{ }
else if (playerState.Equals(_FALLING))
{
Canvas.SetTop(Player, Canvas.GetTop(Player) + 30);
}
else if (playerState.Equals(_LEFT))
{
Canvas.SetTop(Player, Canvas.GetTop(Player) - 60);
Canvas.SetLeft(Player, Canvas.GetLeft(Player) - 20);
playerMoveTimeout--;
}
else if (playerState.Equals(_RIGHT))
{
Canvas.SetTop(Player, Canvas.GetTop(Player) - 60);
Canvas.SetLeft(Player, Canvas.GetLeft(Player) + 20);
playerMoveTimeout--;
}
else //CENTER
{
Canvas.SetTop(Player, Canvas.GetTop(Player) - 60);
playerMoveTimeout--;
}
}
public int updateBG(int time)
{
if (Canvas.GetTop(background) > 800)
Canvas.SetTop(background, -2400);
int x = time;
Canvas.SetTop(background, Canvas.GetTop(background) + 60);
x -= 40;
return x;
}
private void Player_Tap(object sender, GestureEventArgs e)
{
Point point = e.GetPosition(Player);
double Y = point.Y;
double X = point.X;
if (X < 80)
{
counter = 400;
playerMoveTimeout = 20;
playerState = _RIGHT;
}
else if (X > 120)
{
counter = 400;
playerMoveTimeout = 20;
playerState = _LEFT;
}
else
{
counter = 400;
playerMoveTimeout = 20;
playerState = _CENTER;
}
}
}