Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


fredag den 22. juni 2007

OneOnOne -- Reager på tastetryk

skrevet af Niels Brinch

Dette indlæg er del af OneOnOne - Et simpelt multiplayer-spil i Silverlight.

Jeg fik flyttet en spiller, men det var ved hjælp af en hardkodet linje kode. Det skulle gerne være spilleren selv der bestemmer hvor vedkommende skal flyttes hen. Jeg vil lade piletasterne styre spillerens retning. Tilstået, ikke nogen særligt original idé, men det føles bare rigtigt at gøre det sådan.

Jeg ved ikke hvordan, men jeg går ud fra jeg skal sætte en "KeyDown"-event på mit ParentCanvas.

public void Page_Loaded(object o, EventArgs e)
{
parentCanvas.KeyDown += new KeyboardEventHandler(parentCanvas_KeyDown);
}

void parentCanvas_KeyDown(object sender, KeyboardEventArgs e)
{
double y = (double)player1.GetValue(Canvas.TopProperty);
player1.SetValue(Canvas.TopProperty, y-10);
}

imageOvenstående burde få spilleren til at løbe lidt op (y-10) uanset hvilken tast der trykkes på. Halløjsa ... det virker! Efter 20 tryk på en tast, er min spiller nået helt op til bolden. Fremragende. Spillet begynder at tage form. Det var næsten sjovt!


Hvis du ser nærmere på billedet kan du se der er et lille 2-tal på skærmen. Det er en lille TextBlock jeg har sat ind på skærmen, til at vise forskellige systemoplysninger til debugging. Man får tilsyneladende ikke noget at vide om, hvis der sker en Exception, heller ikke selvom man kører i Debug-tilstand (F5).


Piletasterne
Silverlight fanger tilsyneladende ikke piletasterne ved KeyDown. Microsoft har tidligere afvist problemet, men jeg har beskrevet til dem hvordan fejlen kan genskabes. Anyway - jeg anvender UHJK i stedet for piletasterne, for KeyDown er bedst synes jeg.


Her er et eksempel som viser at Silverlight IKKE understøtter en fuld udgave af .NET. Der er nemlig en enum som man kan bruge til let at identificere hver tast i frameworket, men den ligger i et namespace man ikke har adgang til gennem Silverlight. I stedet er jeg nødt til at lave min egen lille enum med de taster jeg har brug for:


private enum Keys
{
u = 50,
j = 39,
h = 37,
k = 40
}

Så skal der kodes lidt:


void parentCanvas_KeyDown(object sender, KeyboardEventArgs e)
{
try
{
double y = (double)player1.GetValue(Canvas.TopProperty);
double x = (double)player1.GetValue(Canvas.LeftProperty);

switch (e.Key)
{
case (int)Keys.u:
y -= 10;
break;
case (int)Keys.j:
y += 10;
break;
case (int)Keys.h:
x -= 10;
break;
case (int)Keys.k:
x += 10;
break;
}

player1.SetValue(Canvas.TopProperty, y);
player1.SetValue(Canvas.LeftProperty, x);
}
catch (Exception exc)
{
debug.Text = exc.Message;
}
}

Nøj det var nemt.


Og det virker endda. Prøv selv her!

0 kommentarer

0 Kommentarer:

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch