Content | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar content

SASS (scss dosyaları) ile !default anahtar kelimesi kullanımı

16 February 2016 Yorum yapılmamış

SASS Dokümantasyonunda Variable Defaults: !default alanında yazana göre;

You can assign to variables if they aren’t already assigned by adding the !default flag to the end of the value. This means that if the variable has already been assigned to, it won’t be re-assigned, but if it doesn’t have a value yet, it will be given one.

yani, !default anahtar kelimesi ile biten bir değişken tanımı varsa ve o ana kadar o değişken daha önce tanımlanmadıysa tanımlanır ve değer ataması yapılır, daha önce tanımlandıysa görmezden gelinir

Hemen bir örnek ile inceleyelim;

$ornek: 'ilk içerik';

$ornek: 'ikinci içerik' !default;

#main {
	content: $ornek;
}

Yukarıdaki SASS (scss dosyası) çıktısı aşağıdaki gibi olacaktır;

#main {
	content: 'ilk içerik';
}

Aynı şekilde

$renk: red;

$renk: blue !default;

#main {
	background-color: $renk;
}

SASS (scss dosyası) çıktısı aşağıdaki gibi olacaktır;

#main {
	background-color: red;
}

Windows Phone 8 – XNA Oyunu / MiniCar

22 January 2015 Yorum yapılmamış

Bu yazımı okumadan önce Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

Önce görseller ve oyunun arkaplan ses dosyası;

MiniCar : BackgroundMiniCar : MainCarMiniCar : Car1MiniCar : Car2MiniCar : Car3MiniCar : Car4MiniCar : Car5MiniCar : Car6MiniCar : Car7MiniCar : Car8

İlk olarak XNA Game Studio 4.0 grubundaki Windows Phone Game şablonundan MiniCarGame isimli projeyi oluşturalım;

Windows Phone : XNA Game Project Template

Game1.cs dosyasının ismini GameLoop.cs olarak değiştirdikten sonra, EnemyCar isminde yeni bir class ekleyelim;

public class EnemyCar
{
	public Texture2D Texture;

	public Vector2 Position;

	public float Velocity;

	public Rectangle Area;

	Random r = new Random();

	public EnemyCar(Texture2D CarTexture)
	{
		this.Texture = CarTexture;

		this.Position = new Vector2(r.Next(450, 850), 1);

		this.Velocity = (float)(r.NextDouble() * 4) + 3f;

		this.Area = new Rectangle((int)this.Position.X, (int)this.Position.Y, this.Texture.Width, this.Texture.Height);
	}
}

EnemyCar sınıfı sayesinde, ekrana getireceğimiz diğer araçların görsellerini, konumlarını, çarpışma testi yapabilmek için ekranda kapladığı alanı ve hızlarını bileceğiz.

GameLoop sınıfına geri dönelim ve sınıf seviyesindeki değişkenlere aşağıdakileri ekleyelim;

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

const int PENCERE_GENISLIK = 800;
const int PENCERE_YUKSEKLIK = 480;

Texture2D BackgroundTexture1;
Texture2D BackgroundTexture2;

Vector2 BackgroundPosition1 = new Vector2(0, -PENCERE_YUKSEKLIK);
Vector2 BackgroundPosition2 = new Vector2(0, 0);

Texture2D MainCarTexture;
Vector2 MainCarPosition = new Vector2(300, 300);

float KatedilenMesafe = 0f;

Rectangle ScreenArea = new Rectangle(0, 0, PENCERE_GENISLIK, PENCERE_YUKSEKLIK);
Rectangle MainCarArea = new Rectangle(300, 300, 67, 134);

TimeSpan TotalElapsedTime;

List<EnemyCar> CarList = new List<EnemyCar>();

Random r = new Random();

Texture2D[] CarTextures = new Texture2D[8];

Klavyedeki hangi tuşlara basıldığını kontrol edebilmek için KeyboardState değişkenlerimizi, arkaplanda sürekli tekrar eden ses çaldırmak için SoundEffectInstance değişkenimizi ve oyunun bittiğini takip edeceğimiz bool değişkeni de sınıf seviyesinde ekleyelim;

KeyboardState ks;
KeyboardState pks;

SoundEffectInstance BackgroundLoop;

bool IsGameOver = false;

İlk yapacağımız iş GameLoop sınıfının constructor‘ında gerekli atamaları yapmak olacak;

public GameLoop()
{
	graphics = new GraphicsDeviceManager(this);
	Content.RootDirectory = "Content";

	graphics.PreferredBackBufferWidth = PENCERE_GENISLIK;
	graphics.PreferredBackBufferHeight = PENCERE_YUKSEKLIK;
	graphics.IsFullScreen = true;
}

LoadContent() methodunda değişkenlerimiz aracılığıyla ses ve resim dosyalarını hafızaya yüklüyoruz;

protected override void LoadContent()
{
	spriteBatch = new SpriteBatch(GraphicsDevice);

	BackgroundTexture1 = Content.Load<Texture2D>("BackgroundRoad");
	BackgroundTexture2 = BackgroundTexture1;
	MainCarTexture = Content.Load<Texture2D>("MainCar");

	MesafeFont = Content.Load<SpriteFont>("Verdana14");

	for (int i = 0; i < CarTextures.Length; i++)
	{
		CarTextures[i] = Content.Load<Texture2D<("Car" + (i + 2));
	}

	BackgroundLoop = Content.Load<SoundEffect>("BackgroundLoop").CreateInstance();

	GameOverFont = Content.Load<SpriteFont>("GameOverFont");

	BackgroundLoop.IsLooped = true;
	BackgroundLoop.Play();
}

Update() method'unda ilk olarak oyundan çıkma ve baştan başlama durumunu sağlayacak kodları yazıyoruz;

ks = Keyboard.GetState();

if (ks.IsKeyDown(Keys.Escape))
{
	this.Exit();
}

if (IsGameOver && ks.IsKeyDown(Keys.Enter))
{
	IsGameOver = false;
	BackgroundLoop.Play();
	KatedilenMesafe = 0f;
	MainCarPosition = new Vector2(600, 600);
	MainCarArea.X = (int)MainCarPosition.X;
	MainCarArea.Y = (int)MainCarPosition.Y;
	CarList.Clear();
}

Eğer oyun sonlanmadıysa, klavyedeki tuşların durumuna göre arabamızı hareket ettiriyoruz, en son araba eklediğimiz zamandan itibaren belli bir sürenin üzerinde geçtiyse yeni EnemyCar ekliyoruz, EnemyCar listesindeki her bir arabayı hareket ettiriyoruz, yol görselini içeren arkaplanı hareket ettiriyoruz, katedilen mesafeyi güncelleyip, bizim arabamız ile diğer arabaların çarpışma testini yapıyoruz;

if (!IsGameOver)
{
	if (ks.IsKeyDown(Keys.Left))
	{
		MainCarPosition.X -= 3;
		MainCarArea.X -= 3;
	}
	if (ks.IsKeyDown(Keys.Right))
	{
		MainCarPosition.X += 3;
		MainCarArea.X += 3;
	}
	if (ks.IsKeyDown(Keys.Up))
	{
		MainCarPosition.Y -= 3;
		MainCarArea.Y -= 3;
	}
	if (ks.IsKeyDown(Keys.Down))
	{
		MainCarPosition.Y += 3;
		MainCarArea.Y += 3;
	}

	TotalElapsedTime += gameTime.ElapsedGameTime;

	if (TotalElapsedTime > TimeSpan.FromMilliseconds(1500))
	{
		EnemyCar car = new EnemyCar(CarTextures[r.Next(0, 8)]);

		CarList.Add(car);

		TotalElapsedTime = TimeSpan.Zero;
	}

	foreach (EnemyCar car in CarList)
	{
		car.Position.Y += car.Velocity;
		car.Area.Y = (int)car.Position.Y;
	}

	BackgroundPosition1.Y += 2;
	BackgroundPosition2.Y += 2;

	if (BackgroundPosition2.Y > PENCERE_YUKSEKLIK)
	{
		BackgroundPosition1.Y = -PENCERE_YUKSEKLIK;
		BackgroundPosition2.Y = 0;
	}

	KatedilenMesafe += 0.005f;

	foreach (EnemyCar car in CarList)
	{
		if (car.Area.Intersects(MainCarArea))
		{
			IsGameOver = true;
			BackgroundLoop.Stop();
		}
	}
}

Son olarak Update() methodunun son satırında KeyboardState‘i pks değişkenine atyoruz;

pks = ks;

Draw() methodunda kendi arabamızı, diğer arabaları ve katettiğimiz mesafeyi ekrana çiziyoruz;

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(BackgroundTexture1, BackgroundPosition1, Color.White);
spriteBatch.Draw(BackgroundTexture2, BackgroundPosition2, Color.White);

spriteBatch.Draw(MainCarTexture, MainCarPosition, Color.White);

spriteBatch.DrawString(MesafeFont, "Katedilen Mesafe: " + KatedilenMesafe.ToString("N2") + " km", new Vector2(51, 51), Color.Black);
spriteBatch.DrawString(MesafeFont, "Katedilen Mesafe: " + KatedilenMesafe.ToString("N2") + " km", new Vector2(50, 50), Color.White);

foreach (EnemyCar car in CarList)
{
	spriteBatch.Draw(car.Texture, car.Position, Color.White);
}

if (IsGameOver)
{
	spriteBatch.DrawString(GameOverFont, "GAME OVER", new Vector2(433, 353), Color.Yellow);
	spriteBatch.DrawString(GameOverFont, "GAME OVER", new Vector2(430, 350), Color.Red);
}

spriteBatch.End();

Windows Phone 8 – XNA Oyunu / Savaşa Hayır

12 January 2014 1 yorum

Bu yazımı okumadan önce Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

Önce görseller;

Savaşa Hayır : BackgroundSavaşa Hayır : Drop 1 0Savaşa Hayır : Drop 1 1Savaşa Hayır : Drop 2 0Savaşa Hayır : Drop 2 1Savaşa Hayır : Plane 0Savaşa Hayır : Plane 1Savaşa Hayır : Plane 2Savaşa Hayır : Plane 3Savaşa Hayır : Plane 4Savaşa Hayır : Plane 5

İlk olarak XNA Game Studio 4.0 grubundaki Windows Phone Game şablonundan SavasaHayir isimli projeyi oluşturalım;

Windows Phone : XNA Game Project Template

Game1.cs dosyasının ismini GameLoop.cs olarak değiştirdikten sonra, Plane isminde yeni bir class ekleyelim;

public class Plane
{
	public Texture2D Texture;

	public int Location;

	public int Speed;
}

Plane sınıfı sayesinde, ekrana getireceğimiz uçakların telefon ekranındaki konumlarını, hızlarını ve görsellerini bileceğiz.

Drop isminde yeni bir class daha ekleyelim ve aşağıdaki kod parçası ile güncelleyelim;

public class Drop
{
	public bool IsBox;

	public bool IsParachute;

	public Vector2 Location;
}

GameLoop sınıfına geri dönelim ve sınıf seviyesindeki değişkenlere aşağıdakileri ekleyelim;

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

Random r = new Random();

Texture2D BackgroundTexture;

Texture2D BoxTexture;
Texture2D BoxParachuteTexture;

Texture2D HumanTexture;
Texture2D HumanParachuteTexture;

Texture2D[] PlaneTextures = new Texture2D[6];

List<Plane> PlaneList = new List<Plane>();

List<Drop> DropList = new List<Drop>();

TimeSpan LastPlaneDate = TimeSpan.Zero;

int PlaneCount;
int DropCount;
int HelpCount;

Yukarıdaki kodlar için daha önce yazmış olduğum Windows Phone ve XNA konusundaki diğer makalelerimi okumanızı öneririm.

GameLoop sınıfının constructor‘ında aşağıdaki atama işlerini yapalım;

public GameLoop()
{
	graphics = new GraphicsDeviceManager(this);
	Content.RootDirectory = "Content";

	TargetElapsedTime = TimeSpan.FromTicks(333333);

	InactiveSleepTime = TimeSpan.FromSeconds(1);

	graphics.PreferredBackBufferWidth = 480;
	graphics.PreferredBackBufferHeight = 800;

	graphics.IsFullScreen = true;
}

LoadContent method’unda Texture2D tipindeki değişkenlerimize değer atayalım;

spriteBatch = new SpriteBatch(GraphicsDevice);

BackgroundTexture = Content.Load<Texture2D>("Background");

for (int iLoop = 0; iLoop < 6; iLoop++)
{
	PlaneTextures[iLoop] = Content.Load<Texture2D>("Plane" + iLoop);
}

BoxTexture = Content.Load<Texture2D>("Drop1_0");
BoxParachuteTexture = Content.Load<Texture2D>("Drop1_1");

HumanTexture = Content.Load<Texture2D>("Drop2_0");
HumanParachuteTexture = Content.Load<Texture2D>("Drop2_1");

Update method'unda Plane ve Drop listesindeki elemanların yerlerini güncelliyoruz;

foreach (var plane in PlaneList)
{
	plane.Location += plane.Speed;
}

foreach (var drop in DropList)
{
	drop.Location.Y += 4;
}

Son uçak üretme zamanımızdan itibaren 5000ms (5sn) geçtiyse yeni uçak üretme kodunu ekliyoruz;

LastPlaneDate += gameTime.ElapsedGameTime;

if (LastPlaneDate > TimeSpan.FromMilliseconds(5000))
{
	var plane = new Plane();

	plane.Texture = PlaneTextures[r.Next(0, 6)];

	plane.Speed = r.Next(3, 8);

	PlaneList.Add(plane);

	PlaneCount++;

	LastPlaneDate = TimeSpan.Zero;
}

Windows Phone oyunlarında, oyuncunun ekrana dokunduğu noktaların listesini TouchPanel sınıfının static GetState methodundan dönen TouchCollection ile alabilmekteyiz.

TouchCollection koleksiyonunun her bir elemanı TouchLocation tipindedir, State özelliğinin TouchLocationState enum’ından Pressed değerinde olduğunu kontrol ederek, ilgili noktaya dokunulduğu durumu yakalayabiliriz.

Eğer dokunulan nokta bir Plane ile kesişiyorsa, rastgele yeni bir Drop düşürebiliriz, Drop ile kesişiyorsa paraşütünün açılmasını sağlayabiliriz;

foreach (var tl in TouchPanel.GetState())
{
	if (tl.State == TouchLocationState.Pressed)
	{
		var touchArea = new Rectangle((int)tl.Position.X, (int)tl.Position.Y, 1, 1);

		foreach (var plane in PlaneList)
		{
			var planeArea = new Rectangle(plane.Location, 20, plane.Texture.Width, plane.Texture.Height);

			if (planeArea.Intersects(touchArea))
			{
				var drop = new Drop();

				drop.Location = new Vector2(tl.Position.X, 20);

				drop.IsBox = (r.Next(0, 2) == 0);

				DropList.Add(drop);

				DropCount++;

				return;
			}
		}

		foreach (var drop in DropList)
		{
			var dropArea = new Rectangle((int)drop.Location.X, (int)drop.Location.Y, 100, 200);

			if (!drop.IsParachute && dropArea.Intersects(touchArea))
			{
				drop.IsParachute = true;

				HelpCount++;

				return;
			}
		}
	}
}

Son olarak Draw method’unda elimizdeki arkaplan görselini, ekrandaki uçakları, paraşütü açılmış ve açılmamış nesneleri ekrana çizdireceğiz;

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(BackgroundTexture, Vector2.Zero, Color.White);

foreach (var plane in PlaneList)
{
	spriteBatch.Draw(plane.Texture, new Vector2(plane.Location, 20), Color.White);
}

foreach (var drop in DropList)
{
	if (drop.IsBox && drop.IsParachute)
	{
		spriteBatch.Draw(BoxParachuteTexture, drop.Location, Color.White);
	}
	else if (drop.IsBox && !drop.IsParachute)
	{
		spriteBatch.Draw(BoxTexture, drop.Location, Color.White);
	}
	else if (!drop.IsBox && drop.IsParachute)
	{
		spriteBatch.Draw(HumanParachuteTexture, drop.Location, Color.White);
	}
	else
	{
		spriteBatch.Draw(HumanTexture, drop.Location, Color.White);
	}
}

spriteBatch.End();

Oyun’dan bir ekran görüntüsü;

Savaşa Hayır : Screenshot

Windows Phone 8 ile telefonun operatörünü bulma

27 July 2013 Yorum yapılmamış

Windows Phone 8 için geliştirdiğiniz uygulamanın çalıştığı telefonun bağlı olduğu operatör‘ü bulmak isteyebilirsiniz.

Özellikle operatör‘e özel seçenekler çıkartmak veya kısıtlamalar getirmek için bunu yapmaya ihtiyacınız olabilir.

Windows Phone 8 SDK içerisinde yer alan DeviceNetworkInformation sınıfında Mobil Operator bilgisini kolaylıkla almanızı sağlayan static tanımlı CellularMobileOperator özelliği mevcuttur.

Hemen yeni bir proje oluşturarak kullanımını inceleyelim;

MainPage.xaml dosyasını açarak sayfanın tasarımını değiştirelim. StackPanel içerisine bir Button nesnesi ekleyelim, Content özelliğine Tıkla, Background özelliğine StaticResource PhoneAccentBrush, Height özelliğine 120 değerlerini verelim;

<phone:PhoneApplicationPage
	x:Class="OperatorSample.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
	xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	FontFamily="{StaticResource PhoneFontFamilyNormal}"
	FontSize="{StaticResource PhoneFontSizeNormal}"
	Foreground="{StaticResource PhoneForegroundBrush}"
	SupportedOrientations="Portrait" Orientation="Portrait"
	shell:SystemTray.IsVisible="True">

	<StackPanel>
		<StackPanel x:Name="TitlePanel" Margin="12,17,0,28">
			<TextBlock Text="http://www.enginpolat.com" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
			<TextBlock Text="operatör" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
		</StackPanel>

		<StackPanel Margin="12,0,12,0">
			<Button Content="Tıkla" Background="{StaticResource PhoneAccentBrush}" Height="120" Click="Button_OnClick" />
		</StackPanel>
	</StackPanel>

</phone:PhoneApplicationPage>

Background özelliğine StaticResource listesinden PhoneAccentBrush değerini vererek, buton’un arkarengini kullanıcının tercih ettiği tema rengine ayarlamış olduk;

Button‘a tıklandığında Button_OnClick() method’u tetiklenecek;

private void Button_OnClick(object sender, RoutedEventArgs e)
{
	var operatorAdi = DeviceNetworkInformation.CellularMobileOperator;

	MessageBox.Show(operatorAdi);
}

Butona tıkladığımızda ekrana, uygulamanın kurulu olduğu telefonun mobil operatörü gelmeli;

Windows Phone 8 ekran çözünürlüğünü bulmak

06 June 2013 Yorum yapılmamış

Windows Phone 8, 3 farklı ekran çözünürlüğünü destekler; WVGA, WXGA, 720p


WVGA
480 x 800
15 : 9

WXGA
768 x 1280
15 : 9

720p
720 x 1280
16 : 9
Eğer programatik olarak ekran çözünürlüğünü bulmak istiyorsanız, App.Current.Host.Content altında tanımlı olan ScaleFactor özelliğini kullanmanız gerekiyor;

var cozunurluk = App.Current.Host.Content.ScaleFactor;

Yukarıdaki örnek kodda, cozunurluk değişkenine 100 (WVGA), 160 (WXGA) veya 150 (720p) değerlerinden biri atanacaktır.