Brattack

screenshot_04132014_120346

Brattack is done! I want to announce all the people my new project. Brattack is available for Windows Phone, Windows 8.1, iPhone and iPad.

A game designed to improve your finger agility with touch screens and your shot precision for action games while having fun.
In a short time you will be an expert in any kind of games with amazing skills of velocity and precision.

Download now for Windows 8 in Store  http://bit.ly/S6xHRb

 

Also available for Windows Phone and IOS for free!
Windows Phone Store  http://bit.ly/1jWhEyE

Apple Store  http://bit.ly/1haFnqT

Reproducir sonido con XNA en Windows Phone

En uno de mis anteriores post hablé de reproducir sonido en Windows Store y Windows Phone usando entre otros el MediaElement.

Ya lo comenté, pero por si acaso lo vuelvo a decir, en Windows Phone 8 hay problemas para reproducir dos sonidos a la vez con el MediaElement. No sé si con 8.1 se ha solucionado

Una opción con Windows Phone para solucionar este problema es usando XNA. Os recuerdo que XNA ya no funciona con Windows Store Apps. XNA es una tecnología que no tiene continuidad con Windows 8.

XNA también nos soluciona el problema de la reproducción de sonido muy continuado. Cuando se reproduce un mismo sonido muchas veces y hay solapación, la nueva reproducción corta la anterior.

Para reproducir sonido en XNA usaremos la libreria Microsoft.Xna.Framework.Media y Microsoft.Xna.Framework.Audio


using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Audio;

Declaramos una variable que sea el Stream del sonido y otra de tipo SoundEffect que lo reproduzca:


private Stream soundStream;
soundStream = Application.GetResourceStream(new Uri("Assets/Sounds/timeIsUp.wav", UriKind.Relative)).Stream;

private SoundEffect soundEffect;
soundEffect = SoundEffect.FromStream(soundStream);

Sólo queda reproducirlo


soundEffect.Play();

Simple verdad?🙂

 

 

Calling service using SOAP message (.NET)

If you need to call a web service at low-level this is a good post for you.

For this purpose, you have to use HttpWebRequest and HttpWebResponse for treating the call. With Visual Studio’s auto-generated proxy for calling web methods of a web service hides the communication language between client and server. You do not have any control about the SOAP message generated. The only way is to call web methods using low-level protocol (HttpRequest)

Look an example below:


HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("<<Url of your web method>>");

request.Headers["SOAPAction"] = <<web method URI>>;
request.ContentType = "text/xml;charset=\"utf-8\"";
request.Accept = "text/xml";
request.Method = "POST";

As you can see I have created the request using the information related to the web service. Next step is to build the SOAP Envelope

//Global variable for helping

static string soapEnvelope = @"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Header></soap:Header><soap:Body></soap:Body></soap:Envelope>";


StringBuilder sb = new StringBuilder(soapEnvelope);
sb.Insert(sb.ToString().IndexOf("</soap:Header>"), String.Format("<AuthorizationToken xmlns=\"<<some URI>>"><Token>{0}</Token></AuthorizationToken>", authToken.Token));
sb.Insert(sb.ToString().IndexOf("</soap:Body>"), String.Format("<YOURMethod xmlns=\"<<some URI>>"><Parameter1>{0}</Parameter1><Parameter2>{1}</Parameter2></YOURMethod>", serviceName, methodName));

XDocument soapEnvelopeXml = XDocument.Parse(sb.ToString());

 

And finally, make the call


IAsyncResult result = request.BeginGetRequestStream((IAsyncResult asynchronousResult) =>
{

//inserting soap message in the request

using (Stream postStream = request.EndGetRequestStream(asynchronousResult))
{
soapEnvelope.Save(postStream);
postStream.Close();
}

request.BeginGetResponse(new AsyncCallback(asyncresult =>
{
XElement res = null;
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
XDocument res = XDocument.Parse(responseString);
XNamespace ns = "<<your namespace>>";

streamResponse.Close();
streamRead.Close();

response.Close();

XElement results = res.Descendants(ns + "<<your method name>>Response").FirstOrDefault();
if (results == null)
{
}
else
{
res =  results.Elements().FirstOrDefault();
}
}), request);
}, null);

 

MediaElement y reproducir sonido en Windows Store y Windows Phone

Como ya dice el título, MediaElement es un control que nos permite reproducir sonido tanto en aplicaciones Windows Phone (MediaElement para Windows Phone) como en aplicaciones Windows Store (MediaElement para Windows Store). Con mi experiencia quiero contar algunas cosas respecto a este control.

Primero, en Windows Phone tiene algún que otro fallo, a veces no reproduce el sonido, sobretodo si la aplicación está trabajando duro, no sé, quizá cuando está cargando el archivo de audio.

Otro problema es si tenemos más de un MediaElement que quieren reproducir sonido declarados en XAML; en cuanto activamos el segundo el primero deja de reproducir. En este escenario debemos usar XNA Framework para reproducir el sonido.

También, la reproducción continua del mismo, por ejemplo un botón que al pulsar reproduce un sonido, si lo pulsamos muchas veces y de forma continua el sonido de la nueva pulsación corta la del anterior.

A favor debo decir que es la forma más fácil que tenemos de reproducir sonido en Windows Phone, con el permiso del control de comportamiento PlaySoundAction.

Segundo, en Windows Store es más estable. No he detectado en ningún momento que deje de reproducir sonido pase lo que pase.

Además, ya no tenemos el problema de que si hay más de un control MediaElement uno deja de hacer reproducir el otro. Es decir, en Windows Store podemos reproducir varios MediaElement a la vez.

Pero, SI continua el problema del botón que se pulsa repetitivamente y con mucha velocidad. El sonido que reproduce el boton corta el sonido de la pulsación anterior. Para arreglar tenemos dos opciones:

1) Des de código creas el control MediaElement para cada pulsación del botón y lo haces reproducir


storageFile = await installedLocation.GetFileAsync("Assets\\Sounds\\hahahaaa.wav");
sound = await storageFile.OpenReadAsync();
Sound = new MediaElement();
Sound.AutoPlay = true;
Sound.SetSource(sound, storageFile.ContentType);

Pros: Fácil e intuitivo

Contras: Este control no lanzará jamás ningún evento, por tanto la única opción es reproducir con el AutoPlay=true. Eso implica que no puedes controlar cuando se reproduce el sonido porque tienes el tiempo que tarda el archivo de audio a cargarse dentro del control MediaElement. Otro problema, es que produce bajadas de rendimiento aleatorios importantes donde deja el Thread UI ocupado durante media segundo más o menos, lo que hace que en algunos casos la interacción con tu aplicación sea un desastre.

2) Usar XAudio2 de DirectX

Consulta un buen ejemplo aquí: XAudio2 audio file playback sample

Pros: máximo rendimiento y reproducción perfecta

Contras: Programar con C++ (que si somos de .Net pues es un poco diferente) y trabajar con DirectX

Nota : Si eres un maestro en C++ y sabes de DirectX ya no tienes ningún contra. Así que adelante🙂

Windows Store apps with C# and relative mouse movement

Some times we want use the mouse as a more general input device. For example, a 3-D modeler might use mouse input to orient a 3-D object by simulating a virtual trackball; or a game might use the mouse to change the direction of the viewing camera via mouse-look controls.

In WinRT  there is Pointer instead mouse because we need to think in different devices : mouse, pen/stylus and touch.

In CoreWindow there are pointer events like PointerMoved, PointerPressed, PointerReleased, etc. You can handle PointerMoved event and track de Pointer. The problem is that, in PointerEventArgs, you have the absolute position of pointer in the screen.

To accomplish our goal we need relative mouse position. MouseMoved event is good choice. MouseEventArgs has MouseDelta propertie that gets a value that indicates the change in the screen location of the mouse pointer since the last mouse event.


Windows.Devices.Input.MouseDevice.GetForCurrentView().MouseMoved += Page_MouseMoved;

So,  next step is to hide the mouse pointer to simulate a camera moving around the object.


Window.Current.CoreWindow.PointerCursor = null;

Caution, now you don’t have mouse pointer and it cannot invoke edge UI such as the charms, back stack, or app bar. Therefore, it is important to provide a mechanism to exit this particular mode, such as the commonly used Esc key.

See an example:


private void Page_Loaded(object sender, RoutedEventArgs e)

{

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;

ActivateMouseLook();

 }

private void Page_Unloaded(object sender, RoutedEventArgs e)
{

Window.Current.CoreWindow.KeyDown -= CoreWindow_KeyDown;
DeactivateMouseLook();
}

private void ActivateMouseLook()

{

Windows.Devices.Input.MouseDevice.GetForCurrentView().MouseMoved += Page_MouseMoved;

_baseCursor = Window.Current.CoreWindow.PointerCursor;

Window.Current.CoreWindow.PointerCursor = null;

}

private void DeactivateMouseLook()

{

Window.Current.CoreWindow.PointerCursor = _baseCursor;

Windows.Devices.Input.MouseDevice.GetForCurrentView().MouseMoved -= Page_MouseMoved;                                             }

}

void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
{
if (args.VirtualKey == VirtualKey.Escape)
  {
DeactivateMouseLook();
}
}

Windows Phone y enlaces bidireccionales y pérdida de foco

En Windows Phone a los enlaces bidireccionales existe solo dos formas de actualizar la fuente: Default y Explicit

Aquí tienes la información del MSDN : UpdateSourceTrigger Enumeration

En realidad no hay ningún problema ya que el perder el foco ya funciona correctamente. Lo que pasa es que en Windows Phone la application bar no genera perdida de foco y en el caso de que estuvieses escribiendo en un textbox el cambio no se propaga a la fuente.

Así, se puede dar el caso siguiente:

Tienes una página donde se pide escribir un texto y en la application bar un botón que al pulsar usa este texto para consultar. Lo que el usuario hará será pulsar en textbox, luego le aparece el teclado del Windows Phone, escribe y luego pulsa directamente en el botón de la application bar.

El comando se ejecuta pero la propiedad enlazada al textbox no se actualiza porque no ha habido perdida de foco.

Así que lo que tenemos que hacer es provocar nosotros mismos que se actualice. Esto es lo que escribiremos en el método Click del botón de la application bar.

object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && focusObj is TextBox)
{
var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
  binding.UpdateSource();
}

Más información:

TextBox Binding TwoWay Doesn’t Update Until Focus Lost WP7

Original solution : Non-string parameters between pages in Windows Phone

My last post was about an original solution using Dependency properties. This time another original solution passing non-string parameters between pages in Windows Phone.

In WPF or Windows Runtime (aka Windows Store apps) you can pass parameters between pages as objects and this means that you don’t have any problem to pass parameters. But, in Windows Phone only parameters as string is possible. For example:


NavigationService.Navigate(new Uri("yourpage.xaml?parameter1=value1&parameter2=value2,UriKind.Absolute));

As you can see, navigate in Windows Phone is like web pages. Only using Uri you can pass parameters, and this parameters need to be in string format.

Yes, this is a problem, because in some cases, we are using complex objects structures in a page and we would like to pass this same complex structure to another page.

A solution is to serialize the object with DataContract attribute. But, the problem is, no all object can be serialized and the Uri is length limited.

An original solution that I found on internet is using an extension for NavigationService and a static field to save the object to pass to another page. Look an example:


public static class NavigationExtensions {

private static object _navigationData = null;

public static void Navigate(this NavigationService service, string page, object data)

{

_navigationData = data;

service.Navigate(new Uri(page, UriKind.Relative));

}

public static object GetLastNavigationData(this NavigationService service)

{

object data = _navigationData;

_navigationData = null;

return data;

}

}

Simply clever, awesome.

Then, you can call on the source page


NavigationService.Navigate("mypage.xaml", myParameter);

And on the target page in the OnNavigatedTo


var myParameter = NavigationService.GetLastNavigationData();

Source:

How do I pass non-string parameters between pages in windows phone 8?