PDA

View Full Version : سوال و کمک در مورد انیمیشن



kiarashk
جمعه 12 شهریور 1389, 15:58 عصر
سلام به تموم بروبچه های با حال برنامه نویس
من ۲ تا picturebox حاوی عکس توی وی بی روی هم قرار می دم و بعد با یک timer و با اضافه کردن هر با ۱ پیکسل سعی می کنم اون ها رو روی هم حرکت بدم ،برنامه اجرا می شه ولی ۲ تا مشکل خیلی بزرگ دارم اونم اینکه یکی اینکه سرعت اجرا پایین و همیشه انیمیشن گیر داره و برنامه رده رده اجرا می شه دوم این که cpu رو خیلی اذیت می کنه و برنامه سنگین اجرا می شه حالا از اساتید برنامه نویس خواهش میکنم به من بگن چه جوری باید این برنامه رو بدون مشکل درست کنم؟
ممنون

Saman_12
جمعه 12 شهریور 1389, 16:10 عصر
شما جای تایمر از BackGroundworker استفاده کنید.
و جای اینتروال و عمل تکرار هم از حلقه.
ساده بود نه؟

mahdi1373
جمعه 12 شهریور 1389, 16:23 عصر
به نظر من از bitblt استفاده کن. جزء توابع api است. نمی دونم معادلش تو .net چیه، ولی بهترین گزینه برای اینکاره.من هم یه همچین کاری می خواستم بکنم، ولی هر کاری می کردم با این روش روان اجرا نمی شد. تا این که رفتم سراغ bitblt...

kiarashk
جمعه 12 شهریور 1389, 16:50 عصر
شما جای تایمر از BackGroundworker استفاده کنید.
و جای اینتروال و عمل تکرار هم از حلقه.
ساده بود نه؟
ممنون از راهنماییتون ولی من یکم اصولی وی بی رو یاد نگرفتم ابنه که بعضی چیزا رو نخوندم که یکیشم همینه می شه طرز استفادش هم توضیح بدید؟

Saman_12
جمعه 12 شهریور 1389, 17:08 عصر
BackGroundworker یکی از ابزار های >net هستش که شما در رویداد DoWork اون هرچی دوست داشتی می نویسی(مثلا شما یک حلقه طولانی دارید که با عث هنگ برنامه میشه می تونید اون حلقه رو توی بک بنویسید اون وقت برنامه شم به حالت خواب نمیره.البته این فقط یک مثال بود)بعدهم توی هر رویداد دیگه ای که دوست داشتی اونو صدا می زنی.
حلقه هم که تکلیفش روشنه شما از هر حلقه ای که دوست داشتی استفاده کن مثلا یک حلقه بدون انتها بنویس که تصاویر رو نشون بده بعد هم با System.Threading اونو کنترل کن مثلا به مدت 1 میلی ثانیه به Sleep بره.(تصاویر رو هم توی یک پوشه کنار برنامه بزار که راحت بتونی لودشون کنی.با یک حلقه و استفاده از کلاس FileIo اینم کار راحتی هست.من خودم برای یکی از پروژه هام نیاز به نشون دادن سرچ روی سیستم داشتم هفت تصویر ساختم و هر کدوم رو با این روش نشون دادم.البته با سرعت نسبتا بالا بدون کاهش زیاد منابع سیستم.)برای صدا زدن بک باید از این کد استفاده کرد :

BackgroundWorker1.RunWorkerAsync()
اینجا BackgroundWorker1 اسم بکت هست.
حلقه رو هر جور دوست داشتی میتونی بنویسی.

modirmasool
جمعه 12 شهریور 1389, 17:58 عصر
سلام به تموم بروبچه های با حال برنامه نویس
من ۲ تا picturebox حاوی عکس توی وی بی روی هم قرار می دم و بعد با یک timer و با اضافه کردن هر با ۱ پیکسل سعی می کنم اون ها رو روی هم حرکت بدم ،برنامه اجرا می شه ولی ۲ تا مشکل خیلی بزرگ دارم اونم اینکه یکی اینکه سرعت اجرا پایین و همیشه انیمیشن گیر داره و برنامه رده رده اجرا می شه دوم این که cpu رو خیلی اذیت می کنه و برنامه سنگین اجرا می شه حالا از اساتید برنامه نویس خواهش میکنم به من بگن چه جوری باید این برنامه رو بدون مشکل درست کنم؟
ممنون

پس چرا برای من مشکلی پیش نمیاد؟:متفکر:

kiarashk
جمعه 12 شهریور 1389, 19:52 عصر
BackGroundworker یکی از ابزار های >net هستش که شما در رویداد DoWork اون هرچی دوست داشتی می نویسی(مثلا شما یک حلقه طولانی دارید که با عث هنگ برنامه میشه می تونید اون حلقه رو توی بک بنویسید اون وقت برنامه شم به حالت خواب نمیره.البته این فقط یک مثال بود)بعدهم توی هر رویداد دیگه ای که دوست داشتی اونو صدا می زنی.
حلقه هم که تکلیفش روشنه شما از هر حلقه ای که دوست داشتی استفاده کن مثلا یک حلقه بدون انتها بنویس که تصاویر رو نشون بده بعد هم با System.Threading اونو کنترل کن مثلا به مدت 1 میلی ثانیه به Sleep بره.(تصاویر رو هم توی یک پوشه کنار برنامه بزار که راحت بتونی لودشون کنی.با یک حلقه و استفاده از کلاس FileIo اینم کار راحتی هست.من خودم برای یکی از پروژه هام نیاز به نشون دادن سرچ روی سیستم داشتم هفت تصویر ساختم و هر کدوم رو با این روش نشون دادم.البته با سرعت نسبتا بالا بدون کاهش زیاد منابع سیستم.)برای صدا زدن بک باید از این کد استفاده کرد :

BackgroundWorker1.RunWorkerAsync()اینجا BackgroundWorker1 اسم بکت هست.
حلقه رو هر جور دوست داشتی میتونی بنویسی.
باز هم ممنون و خیلی ممنون ولی می شه مثال کامل تر بزنید من این کار رو کردم نشد


Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Do
PictureBox1.Location = New Point(PictureBox1.Location.X + 1, PictureBox1.Location.Y + 1)
Loop
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync()

End Sub
End Class

Saman_12
جمعه 12 شهریور 1389, 21:19 عصر
من تا حالا برای اظافه کردن یک مقدار از این روش استفاده نکردم فکر هم نمی کردم که به خطا بر به خورد کنه.(حالا بی خیال چیزیه که پیش اومده.)
شما کلا اونو فراموش کن این Sub رو برای این کار نوشتم :


Private Sub Add(ByVal Picture1 As PictureBox, Optional ByVal Number As Double = 1, Optional ByVal Time As Integer = 1)
Do While Picture1.Left < Me.Width Or Picture1.Top < Me.Height
Application.DoEvents()
Picture1.Top += Number
Picture1.Left += Number
System.Threading.Thread.Sleep(Time)
Loop
End Sub

Shahram_Shobeiri
شنبه 13 شهریور 1389, 11:41 صبح
یه راه دیگه هم (برای جلوگیری از رده رده شدن) اینه که با استفاده از توابع گرافیکی دو تا بیت مپ رو در یک بیت مپ سومی رسم کنی و هر بار موقعیت عکس دوم رو نسبت به حالت قبل کمی تغییر بدی و دوباره رسم کنی. برای کاهش بار cpu هم شاید از threading استفاده کنی وضعیت بهتر بشه.
من خیلی وقت پیش یه شبه گیم(!!!) نوشته بودم که توش از این روش استفاده کردم. یه نگاه بهش بندازی بد نیست.