Objective-c array length problemi

Neredeyse 1 saatimi sadece bir dizide bulunan 3 elemanın değerlerini almaya çalıştım. Dinamik yapıyı her zaman tercih ettiğim için sonradan arraye değer ekleyeceğimi düşünüerekten araştırdım. Doğru dürüst bir şey bulamadım ama bu yöntem günü kurtarır gibi. Şimdilik burada paylaşıyorum.

NSArray * myNewArray = [NSArray arrayWithObjects:@"obj1",@"obj2",@"obj3",@"obj4", nil];
NSMutableArray * array2 = [NSMutableArray arrayWithArray: myNewArray];

NSLog(@"Object 3 :: %@", [array2 objectAtIndex:3] );
        
for (int i = 0; i<[array2 count]; i++)
{
   NSLog(@"array değeri :: %@ ", [array2 objectAtIndex:i]);
}
Advertisements

as3 Moving object rotation

Gülle atışına benzer bir oyun yapmak istediğimde objenin nasıl hareket etmesi gerektiğini yani sağdan ve soldan 180 derecelik bir açıyla hareket etmesini nasıl yapacağımı düşünmüştüm. Bunu basit bir matematik yöntemiyle çözebiliyormuş Bunu yapabilmek için ilk olarak bir MOUSE_MOVE dinleyicisi oluşturup farenin her hareketinde çalışmasını sağlayıp daha sonra farenin X eksenine göre bir hesaplama işimizi hallediyormuş.

İlk plarak derece cinsinden hesaplamasını alıyoruz. Bu bize sağdan ve soldan 0-180 derecelik bir açı veriyor. Daha sonra bunu artanjant formülüyle farenin X koordinatıyla objemizin X koordinat farkını alıp daha sonra bunları açıya böldüğümüzde bize sağdan ve soldan 180 derecelik bir koordinat veriyor. Aşağıdaki if blokları ise objemizi belirli alanlarda sınırlamak için yapılan bir işlem.


import flash.events.MouseEvent;

stage.addEventListener(MouseEvent.MOUSE_MOVE,moveToRotation);

function moveToRotation(e:MouseEvent):void
{
	var degree:Number = Math.PI / 180;
	var angle:Number = Math.atan2(mouseY - gun_mc.y, mouseX - gun_mc.x) / degree;

	if (angle <= -20 &&  angle >= -160)
	{
		gun_mc.rotation = angle + 90;
	}
	if (angle < -20) 	{ 		angle = -20; 	} 	if (angle > -160)
	{
		angle = -160;
	}
}

Angles in Flash: Rotation, Degrees and Radians

Aklıma estiğinde oyun yapmaya çalışıyorum ve oyun yaparken bir çok açı hesaplama fonksiyonları kullanıyorum. Sık sık aramak yerine bunlar bir utilies sınıfında toplayacağım. Şimdilik burada kalsın 🙂

package com.michaeljameswilliams.gamedev.angles 
{
 
	/**
	 * Full details: http://gamedev.michaeljameswilliams.com/2009/04/24/angles-in-flash/
	 * Hungarian notation idea: http://www.joelonsoftware.com/articles/Wrong.html
	 * Optimisation credit: http://www.nbilyk.com/optimizing-actionscript-3
	 * 
	 * Usage:	import com.michaeljameswilliams.gamedev.angles.Angle
	 * 			var degAngle:Number = Angle.degFromRad( radAngle );
	 * 
	 * @author MichaelJWilliams
	 */
	public class Angle 
	{
		private const localPi:Number = Math.PI;
		private const localTwoPi:Number = Math.PI * 2;
		private const oneOver180:Number = 1 / 180;
		private const oneOverPi:Number = 1 / localPi;
 
		public function Angle() 
		{
			trace( "The com.michaeljameswilliams.gamedev.angles.Angle class does not need to be instantiated" );
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public static function degFromDeg( p_degInput:Number ):Number
		{
			var degOutput:Number = p_degInput;
			while ( degOutput >= 360 )
			{
				degOutput -= 360;
			}
			while ( degOutput < 0 )
			{
				degOutput += 360;
			}
			return degOutput;
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in degrees, in range -180 to + 180
		 */
		public static function rotFromRot( p_rotInput:Number ):Number
		{
			var rotOutput:Number = p_rotInput;
			while ( rotOutput > 180 )
			{
				rotOutput -= 360;
			}
			while ( rotOutput < -180 )
			{
				rotOutput += 360;
			}
			return rotOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public static function radFromRad( p_radInput:Number ):Number
		{
			var radOutput:Number = p_radInput;
			while ( radOutput >= localTwoPi )
			{
				radOutput -= localTwoPi;
			}
			while ( radOutput < -localTwoPi ) 
			{
				radOutput += localTwoPi;
			}
			return radOutput;
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in degrees, in range -180 to +180
		 */
		public static function rotFromDeg( p_degInput:Number ):Number
		{
			var rotOutput:Number = p_degInput;
			while ( rotOutput > 180 )
			{
				rotOutput -= 360;
			}
			while ( rotOutput < -180 )
			{
				rotOutput += 360;
			}
			return rotOutput;
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public static function degFromRot( p_rotInput:Number ):Number
		{
			var degOutput:Number = p_rotInput;
			while ( degOutput >= 360 )
			{
				degOutput -= 360;
			}
			while ( degOutput < 0 )
			{
				degOutput += 360;
			}
			return degOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public static function degFromRad( p_radInput:Number ):Number
		{
			var degOutput:Number = 180 * oneOverPi * radFromRad( p_radInput );
			return degOutput;
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public static function radFromDeg( p_degInput:Number ):Number
		{
			var radOutput:Number = localPi * oneOver180 * degFromDeg( p_degInput );
			return radOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in degrees, in range -180 to +180
		 */
		public static function rotFromRad( p_radInput:Number ):Number
		{
			return rotFromDeg( degFromRad( p_radInput ) );
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public static function radFromRot( p_rotInput:Number ):Number
		{
			return radFromDeg( degFromRot( p_rotInput ) );
		}
 
	}
 
}
 
 
 
 
 
 
 
package com.michaeljameswilliams.gamedev.angles 
{
 
	/**
	 * Full details: http://gamedev.michaeljameswilliams.com/2009/04/24/angles-in-flash/
	 * Hungarian notation idea: http://www.joelonsoftware.com/articles/Wrong.html
	 * Optimisation credit: http://www.nbilyk.com/optimizing-actionscript-3
	 * 
	 * Use this instead of the Angle functions when you need extra speed
	 * and are going to use the functions multiple times (e.g. over a loop)
	 * 
	 * Usage:	import com.michaeljameswilliams.gamedev.angles.Angle
	 * 			var angleUtil:AngleUtil = new AngleUtil();
	 * 			var degAngle:Number = angleUtil.degFromRad( radAngle );
	 * 
	 * @author MichaelJWilliams
	 */
	public class AngleUtil 
	{
		private const localPi:Number = Math.PI;
		private const localTwoPi:Number = Math.PI * 2;
		private const oneOver180:Number = 1 / 180;
		private const oneOverPi:Number = 1 / localPi;
 
		public function AngleUtil() 
		{
 
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public function degFromDeg( p_degInput:Number ):Number
		{
			var degOutput:Number = p_degInput;
			while ( degOutput >= 360 )
			{
				degOutput -= 360;
			}
			while ( degOutput < 0 )
			{
				degOutput += 360;
			}
			return degOutput;
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in degrees, in range -180 to + 180
		 */
		public function rotFromRot( p_rotInput:Number ):Number
		{
			var rotOutput:Number = p_rotInput;
			while ( rotOutput > 180 )
			{
				rotOutput -= 360;
			}
			while ( rotOutput < -180 )
			{
				rotOutput += 360;
			}
			return rotOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public function radFromRad( p_radInput:Number ):Number
		{
			var radOutput:Number = p_radInput;
			while ( radOutput >= localTwoPi )
			{
				radOutput -= localTwoPi;
			}
			while ( radOutput < -localTwoPi ) 
			{
				radOutput += localTwoPi;
			}
			return radOutput;
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in degrees, in range -180 to +180
		 */
		public function rotFromDeg( p_degInput:Number ):Number
		{
			var rotOutput:Number = p_degInput;
			while ( rotOutput > 180 )
			{
				rotOutput -= 360;
			}
			while ( rotOutput < -180 )
			{
				rotOutput += 360;
			}
			return rotOutput;
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public function degFromRot( p_rotInput:Number ):Number
		{
			var degOutput:Number = p_rotInput;
			while ( degOutput >= 360 )
			{
				degOutput -= 360;
			}
			while ( degOutput < 0 )
			{
				degOutput += 360;
			}
			return degOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in degrees, in range 0 to 360
		 */
		public function degFromRad( p_radInput:Number ):Number
		{
			var degOutput:Number = 180 * oneOverPi * radFromRad( p_radInput );
			return degOutput;
		}
 
		/**
		 * @param	p_degInput	Angle, in degrees
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public function radFromDeg( p_degInput:Number ):Number
		{
			var radOutput:Number = localPi * oneOver180 * degFromDeg( p_degInput );
			return radOutput;
		}
 
		/**
		 * @param	p_radInput	Angle, in radians
		 * @return	Angle, in degrees, in range -180 to +180
		 */
		public function rotFromRad( p_radInput:Number ):Number
		{
			return rotFromDeg( degFromRad( p_radInput ) );
		}
 
		/**
		 * @param	p_rotInput	Angle, in degrees
		 * @return	Angle, in radians, in range 0 to ( 2 * pi )
		 */
		public function radFromRot( p_rotInput:Number ):Number
		{
			return radFromDeg( degFromRot( p_rotInput ) );
		}
 
	}
 
}

as3 object distance

Mouse’un koordinatlarını alarak zıt yöne doğru ilerlemesini sağlayan kod. Bu mantığı enemy şeklinde yapabiliriz biz üzerine gittikçe sağa sola kaçmasını sağlayabiliriz bu kodla.

Mantık şu şekilde işliyor, sahnemizin yükseklik ve genişlik değerini alıyoruz. Daha sonra bunu movieclibimizin x koordinatı ile çıkartıp ondalıklı bir sayı ile çarpıyoruz bunu açı olarak kullanacağız. Daha sonra mouseX ve mouseY koordinatlarını kullaranak açı hesaplaması yapıyoruz. Bunu yaparken x koordinatın (yatay) pozisyonunun karesini alıyoruz. Aynı şekilde y koordinatının (dikey) koordinatını alıp onunda karesini alıyoruz. Bunların hepsini distance değişkeninde gerçekleştiriyoruz.

Daha sonra hedef movieclibimizin x,y koordinatlarını distance’a bölüyoruz bu şekilde objemiz hesapladığımız distance değerine göre objemizden kaçıyor. Bunu da enter frame handler ile yapıyoruz. Eğer performsdan yana sıkıntılı bir uygulama yapıyorsanız burada tweenlite kullanarak daha sonra işinizin bittiği yerde kill edebilirsiniz.

import flash.display.*;
import flash.events.*;

var centreX:Number = 550;   // stage width
var centreY:Number = 400;   // stage height

stage.addEventListener(Event.ENTER_FRAME, ef);

function ef(event:Event)
{
	mc.x = mc.x + (centreX- mc.x) * 0.03;
	mc.y = mc.y + (centreY- mc.y) * 0.02;
	var disX:int = mc.x - mouseX;
	var disY:int = mc.y - mouseY;
	var distance:int = disX * disX + disY * disY + 1;
	mc.x = mc.x + 700 * disX / distance;
	mc.y = mc.y + 700 * disY / distance;
	
	if(mc.hitTestPoint(hit_mc.x,hit_mc.y))
	{
		mc.scaleX = .5;
		mc.scaleY = .5;
		mc.x = hit_mc.x + 30;
		mc.y = hit_mc.y;
		disX = undefined;
		disY = undefined;
		distance = undefined;
		stage.removeEventListener(Event.ENTER_FRAME, every);
	}
}

objective-c mutable string

Objective-c de stringler ile bir çok işlem yapmamıza olanak sağlıyor. Bunlardan bir diğeri ise stringlerin arasına istediğimiz cümleleri eklemek. Örneğin;

Buradaki örnekte NSString ile verdiğimiz string değerin son karakterini bulup onun sonuna string eklemesi yapıyoruz. Aşağıdaki örnekte ‘Akıl ‘ kelimesinden sonra “akıldan üstündür.” kelimesini ekleyecektir.

         NSString * str = [NSMutableString stringWithString:@"Akıl "];
        NSLog(@"%@",str);
        
        NSMutableString * mutableStr = [NSMutableString stringWithString:str];
        
        [mutableStr insertString:@"akıldan üstündür." atIndex:5];
        NSLog(@"%@",mutableStr);

NSString – Substring and ranges

Objective-c de objelerinizin istediğiniz yerden kırpma işlemini yapabiliyorsunuz. Diğer programalama dillerinden biraz daha esnek.

   NSString * s = @"Serhat Sezer...";
        NSString * d = @"Akıl akıldan üstündür.";
        NSString * tester;
        
        // İlk 7'ye kadar olan değerleri al 7 hariç
        tester = [d substringToIndex:7];
        NSLog(@"\n\nKesinlen index değeri ::  %@", tester);
        
        // 7'den sonraki değerleri alır
        tester = [d substringFromIndex:7];
        NSLog(@"\n\nKesinlen index değeri ::  %@", tester);

Kendimde bulduğum eksiklikler

Bana kalırsa insan her zaman için kendini sorgulamalı. Bir yola başlarken ilk olarak hem kendini hem de çizdiği yolu iyi analiz edebilmeli önüne çıkacak engelleri yola devam etmeden tespit edebilmelidir. Benim aceleci kişiliğim buna pek izin vermemiş gibi görünüyor. Ama bir konuda şükürler olsun ki iyi olabilirim oda “geç olmadan farkına varabilme” yeteneği. Geçenlerde bir oyun prototipi yazmaya kalkayım dedim matematiksel bir işlemde takıldım. O kadar basit bir işlemdi ki şuanda buraya yazmaya utanıyorum. Bu ve nicesiyle daha önceden karşılaşmıştım çözüm yollarını ya tarzanca çakma yöntemler ile aştım ya da bıraktım uğraşmadım.

Bugün anladım ki bunu böyle bir döngüye sokmak yerine döngüyü kırıp, tamamen sorunun üstesinden gelmeye ve sorunu kökünden kaldırmaya yönelik bir harekette bulunmam gerekiyor. Bunun yolu da tabii ki uzun ve kasvetli bir şekilde matematiği en iyi şekilde öğrenmek. Bunun için şimdiden özel kurslara özel öğretmenleri araştırmaya başladım bile. Bazen geçmişine bakıp ne kadar boş bir hayat yaşadığını anlıyor insan. Ben de lise yıllarındaki “meslek lisesi” mağdurlarından birisi olduğum için matematiği sadece lise 1’e kadar görebildim. Bu benim için büyük bir boşluk. Hem şimdiki zaman için hemde gelecekteki hedeflerim için. Eğer oyun yapmak istiyorsan, kesinlikle matematiği öğreneceksin. Matematiği öğrendin, fiziğe gireceksin. Hayat bu kardeşim oku oku bitmeyecek.

Bunu da buraya yazıyorum eğer hala matematikle ilgili bir şey yapmadıysam bakıp utanayım diye. Ya da hatırlatması içinde olabilir. İkinci şık daha iyi sanki.

Sevgiler.

Enumerated Data Types

Bu bölümde ufak bir bilgilendirme yapmayı düşündüm. Enumereted data types konusunun türkçeleştirilmiş hali “numaralandırılmış veri tipleri” olarak çevirilebilir. Bu tipi genellikle switch-case kontrollerinde yapabilirsiniz. Günlerden örnek verecek olursak;

Örneği kullanabilmek için konsoldan bir sayı girmeniz gerekmektedir.

   
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool
    {
        enum days { pazartesi = 1, sali = 2, carsamba = 3, persembe = 4, cuma = 5 };
        enum days entry;
        
        NSLog(@"1 ile 5 arasında bir sayı girin :: ");
        scanf("%i", &entry);
        
        switch (entry)
        {
            case pazartesi:
                NSLog(@"bugün günlerden pazartesi");
                break;
                
            case sali :
                NSLog(@"bugün günlerden salı");
                break;
                
            case carsamba :
                NSLog(@"bugün günlerden çarşamba");
                break;
            
            case persembe :
                NSLog(@"bugün günlerden perşembe");
                break;
            
            case cuma :
                NSLog(@"bugün günlerden cuma");
                break;

            default:
                break;
                
        }
        
     }
    return 0;
}


Objective-c Multiple arguments #tips1

Objective-c de çoklu parametre verebilmek için iki türlü yol var birisi argüman ismi vererek oluşturmak ikinciside “:” operatörünü kullanarak vermek. Örneğin

@Interface

@interface NumberVO : NSObject 
{
    int num1,num2;
}

-(void) setNumbers : (int) a : (int) b;

@Implementation

@implementation NumberVO 
{
    int num1 = 10;
    int num2 = 20;
}

-(void) setNumbers : (int) a : (int) b 
{
    num1 = a;
    num2 = b;
}

int main(int argc, const char * argv[])
{
    @autoreleasepool {
       
        NumberVO * vo = [[NumberVo alloc] init];
        [vo setNumber : 100 : 200];
    }
    return 0;
}

Normalde ki kullanımda da @Implementation da şöyle bir şey yapmamız gerekiyor.

-(void) setMuliptleParameters : (int) sayi1 sayi2(int) s2;

gibi bir kullanım yapıyor olacaktık. Bu yöntemle işimizi kolay yoldan halletmiş olduk.

-(void) setMuliptleParameters : (int) a : (int) b;

Objective-C Inheritance

#import <Foundation/Foundation.h>

// INTERFACE 
@interface Araba : NSObject 
{
	int sayi;
}

-(void) sayiYazdir;

@end

// IMPLEMENTATION
@implementation Araba 

-(void) sayiYazdir 
{
	sayi = 10; 
}

@end

/////  ÖZEL CLASS /////

@interface Kullanici : Araba

-(void) bilgileriYazdir;

@end

@implementation Kullanici

-(void) bilgileriYazdir
{
	NSLog(@"%i ",sayi);
}

@end


//////////////////////////////// 	MAIN CONSTURCTOR /////////////////////////////////

int main(int argc, const char * argcv[]) 
{
	@autoreleasepool {
		
		Kullanici * k = [[Kullanici alloc] init];
		
		[k sayiYazdir];
		[k bilgileriYazdir];
		[k release];
	}
}