رفتن به مطلب

سورس کد پیانو نسبتا بدرد بخور!


مجید آرتا

ارسال‌های توصیه شده

سلام

امیدوارم حالتون خوب و خوش باشه

این سورس رو قرار بود به عنوان عیدی بهتون تقدیم کنم که فرصت نشد و امروز رخصتی پیدا کردم و گفتم این سورس رو واستون به اشتراک بزارم

خب این سورس با 2 حالت :

  • حرکت دادن انگشتان بر روی دکمه ها
  • کلیک روی دکمه

کار می کنه.

خب یک سورس کد به اسم ساز قانون بود ( اگه اشتباه نکنم ) که با مدیا پلیر اینکار رو انجام میداد و فوق العاده سنگین و دیر عمل می کرد

ولی خب سورسی رو که بنده نوشتم هم زیاد تعریفی نیست و کاملا به صورت پویا نوشته شده ( یعنی طبق دکمه ها و ساز هایی که موجود هستش این کار انجام میشه )

طبق عادت همیشگی یک توضیح کوچیک در مورد کد ها میدم، و طبق عادت همیشگی این کد یک نقص کوچولو داره که با اگر تستش کنید متوجهش میشید و انتظار دارم دیگه دست به کد بشید و خودتون درستش کنید

 

توضیحات در ورای کدها »

خب ما اینجا از کلاس SoundPool که مربوط به کتابخانه Audio هستش استفاده می کنیم.

Sound Pool زمانی که بخواییم ازش یک نمونه بسازیم ( نمونه ساختن با تعریف کردن متفاوته ) باید تعداد سازها یا اهنگ ها رو بهش بدیم ( مثلا 5 تا ساز داریم و ورودی تابع اینیشالیز رو میدیم 5)

و در مرحله بعدی ما باید سازهامون رو Load یا بارگزاری کنیم که این تابع Load برای بارگزاری هر ساز یک مقدار عددی بر میگردونه، پس این تابع از نوع بازگشتی هستش و باید به نسبت نوع مقدار بازگشتی همون نوع متغییر رو تعریف کنیم ( یعنی یک متغیر int ).

خب ما این مقدار عددی رو کجا لازم داریم ؟ اصلا دلیل بازگشت این مقدار چیه ؟ از این مقدار ما برای Play  کردن همون ساز استفاده می کنیم.یعنی تابع Play  ورودی از نوع عددی به اسم LoadID میخواد.

 

خب تا اینجا توضیحات مربوط به کلاس SoundPool  بود.

 

توابع استفاده شده »

Sub LoadIDS
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then
				v.Tag = sound.Load(File.DirAssets,Starter.oggFiles.Get(index))
				If index < Starter.oggFiles.Size - 1 Then index = index + 1
		End If
	Next
End Sub

این تابع به صورت پویا میاد تمامی فایل های موجود در پوشه Files رو که فرمت ogg  دارن رو اسمشون رو توی یک لیستی میریزه و بعد ما اسامی این سازها رو به تگ دکمه ها اختصاص میدیم.

یک نکته ای هم که باید بدونید ( شایدم بدونید ) سرویس starter  قبل از اکتویتی که به عنوان لانچر تعریف شده اجرا میشه.خب من قبل از اینکه اکتیویتیم اجرا بشه اسامی فایل هارو به وسیله این سرویس دریافت می کنم.خیلی خوبه که طرز استفاده این سرویس رو بدونید و کاربردی هستش.

 

تابع بعدی » 

Sub getCount As Int
	Private count As Int = 0
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then count = count + 1
	Next
	Return count
End Sub

این تابع رو برا یانکه بدونیم چنتا دکمه برای ساز ها داریم ( یعنی همون گرفتن تعداد اهنگ ها برای تابع اینیشالیز مربوط به SoundPool )

 

 

تابع اخر »

Sub MultiTouch(x As Int)
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then
			 If x > v.Left And x < (v.Left + v.Width)  Then  
				sound.Play(v.Tag,1,1,0,-1,1)
			 End If
		End If
	Next
End Sub

اگه توجه کنید کد ها شبیه به هم هستن و فقط شرطهاشون و متفاوته.این تابع هم برای حالتی که شما روی صفحه دستتون رو بکشید و تاچ کنید.( حالت مانند سورس ساز قانون)

ورودیشم مربوط میشه موقعیت مکانی که تاچ میشه ( در راستای افقی یا همون x ها)

کتابخونه Gesture  هم داخل این سورس استفاده شده و یه حس عجیب بهم میگه که با رویداد Touch خود اکتیویتی هم میشد انجام داد ولی خب من حواسم نبود از این کتابخونه استفاده کردم  :DD:  تست کنید ببنید اگه با خود رویداد تاچ میشه که کتابخونه gesture  نیازی نیست استفاده کنید.  :DD: 

خب کل کد همینه کار زیاد سختی هم صورت گرفته نشده، شایدم خودتون سورس کد بهتری بتونین بنویسین.

و بازم میگم یک مشکل کوچولو داره که یادمه یکی دو سال پیش یکی از دوستان در این باره هم بهم گفته بود مشکلش رو حل کردم ولی به روشی فوق العاده عجیب و غریب و یادمم نمیاد :دی  :DD: 

گذاشتم به عهده خودتون کمی به مغزتون فشار بیارید یه وقت آکبند نمونه واس آیندگان :دی  :DD: 

سورس کد از انجمن انسر سنتر./

رمز فایل : answercenter.ir

 

 

Piano(Optimize).rar

 

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

من یک بررسی کردم و برام خیلی جالب بود و نکات خیلی قشنگی از این کد یاد گرفتم. متشکرم

 

فقط فکر می کنم ایرادی که مطرح کرده بودید مربوط به مشکل قطع صدا هنگام نواختن صدای دکمه بعدی بود که من حلش کردم.

#Region  Project Attributes 
	#ApplicationLabel: Piano Optimized!
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: unspecified
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: True
#End Region

Sub Process_Globals
	Public sound As SoundPool
End Sub

Sub Globals
	Private index As Int = 0
	Dim plus, playid As Int
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("activity_main")
	sound.Initialize(getCount)
	LoadIDS
End Sub

Sub Activity_Resume
	
End Sub

Sub Activity_Pause (UserClosed As Boolean)
	sound.Release
End Sub

Sub Button_Click
	Private btn As Button
	btn = Sender
	sound.Stop(playid)
	plus = plus + 1
	If IsNumber(btn.Tag) Then
		 playid = sound.Play(btn.Tag,1,1,plus,0,1)
	End If
	
End Sub
Sub LoadIDS
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then
			v.Tag = sound.Load(File.DirAssets,Starter.oggFiles.Get(index))
			If index < Starter.oggFiles.Size - 1 Then 
				index = index + 1
			End If
		End If
	Next
End Sub

Sub getCount As Int
	Private count As Int = 0
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then
			count = count + 1
		End If
	Next
	Return count
End Sub

Sub MultiTouch(x As Int)
	For Each v As View In Activity.GetAllViewsRecursive
		If v Is Button Then
			 If x > v.Left And x < (v.Left + v.Width)  Then 
				sound.Stop(playid)
				plus = plus + 1
				If IsNumber(v.Tag) Then
					 playid = sound.Play(v.Tag,1,1,plus,0,1)
				End If
			 End If
		End If
	Next
End Sub

'www.AnswerCenter.IR
'[email protected] / [email protected]
'Iranian B4A Programmer

در ضمن به اضافه کردن یک قابلیت جالب دیگه فکر می کردم که بر اساس تعداد فایل هایی که داخل پوشه مورد نظر (مثلا Dir assets) وجود داره، خودش به طور اتوماتیک تعدادی دکمه داخل صفحه درست بکنه.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

 

من یک بررسی کردم و برام خیلی جالب بود و نکات خیلی قشنگی از این کد یاد گرفتم. متشکرم

 

تشکر.

 

فقط فکر می کنم ایرادی که مطرح کرده بودید مربوط به مشکل قطع صدا هنگام نواختن صدای دکمه بعدی بود که من حلش کردم.

 

متاسفانه مشکلی که بنده دارم همیشه به دنبال راه های سخت تر هستم تا اسونتر و اینجوری میشه که گاهی با ردی مخ مواجه میشم  :DD: 

 

تشکر از شما بابت توجه و رفع این اشکال.

میتونید با تغییرات سلیقه ای یک پیانو تر تمیز و خوب بسازید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 4 هفته بعد...

دوستان سلام من یه سورس حرفه ای تری دارم بدردتون میخوره 100 درصد piano example 2.zip

لینک ارسال
به اشتراک گذاری در سایت های دیگر

  • 1 ماه بعد...
در در 1395/05/18, 12:36:28، mohammade79 گفته است :

دوستان سلام من یه سورس حرفه ای تری دارم بدردتون میخوره 100 درصد piano example 2.zip

سلام دوستان من میخوام با این سورس پیانویی که گذاشتم چند تا دکمه دیگه اضافه کنم، ه کاری میکنم نمیشه میشه یکی این کارو بکنه که با بیسیک هم بشه پیانو ساخت 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...