• 0
alaadiaa

حزمة المحرك Aanimation

سؤال

السلام عليكم

اسم الحزمة:

حزمة المحرك AAnimation package

نبذة عن الحزمة:

الحزمة تمكنك من تحريك المكونات component

الخاصة بحزمةswing بدون أية تعقيدات

(بصراحة لم أجربها على awt لكن يفترض أن تعمل)

نسخة الحزمة:

هذه النسخة بدائية جداً

لهذا لن أعطيها رقماً بالمرة وسأضعها فقط

قصة الحزمة:

بزغت فكرة هذه الحزمة من محاولاتي مساعدة م.ربيع أبو طير

كان يريد تحريك JButton على إطار JFrame

بالطبع هذا الكلام حصل في سنة رابعة جامعة على ما أذكر

وبقيت الفئة التي عملتها موجودة لدي حتى اليوم

وبينما أنا أراجع البرامج التي قمت بتصميمها إذ عثرت عليها بالصدفة

ومن هنا انبثقت لدي فكرة عمل حزمة لتحريك الأدوات

الفئات المستهدفة بالحزمة:

على الأغلب الحزمة ستكون مفيدة:

1- لمصممي الألعاب

2- لمصممي الواجهات الاحترافية

3- لمصممي برامج المحاكاة

مميزات الحزمة:

إلى حد الآن تعتبر بدائية جداً

ولا يمكن أن نقول بأنها مميزات لكن ما تقوم به الحزمة:

1- تحريك المكون component بشكل أفقي وشكل عمودي كل على حدة

2- التحكم في مقدار الحركة وسرعة الحركة

3- التحكم في نقطة بداية الحركة

4- التحكم في اتجاه الحركة (الأمام والخلف أو أعلى وأسفل)

كيف استخدم الحزمة؟؟

استخدام الحزمة يعتمد على إنشاء كائن من الفئة AnimationRunnable

ثم تمريره كمدخل للفئة Thread واستدعاء الدالة start

لكي تستطيع إنشاء كائن من الفئة AnimationRunnable يجب أن تمرر لصانع كائناتها

1- كائن من الفئة Container أو إحدى أبنائها

2- أن يكون مدير المكونات Layout Manager من النوع nullLayout

(نمرر للدالة setLayout مدخل null)

3- كائن من الفئة Component أو إحدى أبنائها

لا يشترط أن يكون الكائن من الفئة Component أو إحدى أبنائها

مضافاً إلى الكائن من الفئة Container أو إحدى أبنائها

هناك مدخلات اختيارية ممكن أن تمررها أو أن تتجاهلها

لرؤية مثال على هذه العملية يرجى مشاهدة الفئة Test

مشاريع التطوير على الحزمة:

1- إضافة الحركة الأفقية العمودية (القطرية)

2- إجراء حركات متتالية من أنواع مختلفة (أفقية - عمودية - القطرية)

مع ضمان عدم حدوث أي مشاكل

(الحزمة حالياً تمكنك من تحريك المكون إما حركة عمودية أو أفقية)

التوثيق الخاص بالحزمة:

أبسط من أن يكون لها توثيق

بإذن الله سيكون في المرات القادمة

التصميم للإصدارة القادمة:

post-9738-1225498525_thumb.png

هذه الصورة تمثل التصميم للإصدارة القادمة

إن أراد أي أحد أن يساعدني في تطوير الحزمة

تنزيل الحزمة:

تستطيع تنزيل الحزمة والشيفرة المصدرية الخاصة بها من الرابط التالي

http://modonat-alaa.freehostia.com/?p=195

معلومات عن المبرمج:

م.علاء محمد خليل الصالحي

خريج هندسة حاسوب

الجامعة الإسلامية بغزة

تحياتي

تم تعديل بواسطه alaadiaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

36 إجابة على هذا السؤال .

  • 0

ممتاز يا علاء هيك الشغل ولا بلاش :) ..

على العموم فكره التحريك هذه حلوه ، من فتره كنت ببحث عن طريقه أحرك في JLabel وكنسلت الموضوع ،، وهو بيدى منظر حلو في البرنامج ، مثلا شريط باللون الأسود في أسفل البرنامج فيه JLabel متحرك وفيه معلومات عن عدد العملاء الحالين الموجودين في الdatabase (طبعا بيتحدث هذا العدد فور أجراء العمليه ) .. وهكذا من معلومات مهمه ..

سأحاول أن أطبق الفكره بالحزمه ونشوف ..

بالتوفيق ،،

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جربت التعامل مع JLabel ولم أفلح :( ...

المهم قرأت الكود ، وصراحه الكلاس AnimationRunnable ما فهمت منه حاجه غير دوال البناء اللى بتستدعى داله البناء الأخيره :P ..

ما هي وظيفه الداله setBounds ؟

ولو قدرت تشرحلنا الفكره بشكل مبسط -الفكره فقط في التحريك- يكون أفضل بكثير ،،

بالتوفيق :) ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

الفكرة في التحريك هو تشغيل خيط يقوم بتغيير مكان المكون بعد مدة معينة من الزمن

فيظهر للعين أنك تقوم بتحريكه لأن العين لا تلاحظ أنك غيرت المكان فقط

بالنسبة للدالة setBounds تستدعي الدالة setBounds الموجودة في المكون مع مراعاة تغيير المكان

مممممممممممممم يبدو أن شرحي سيء

إن فهمت شيء وجدي أخبرني

وإن لم تفهم أخبرني لأحاول أن أحسن الصياغة قليلاً

يفترض أن تعمل مع كل أبناء component

هل وضعت منظم المحتوى بـ null؟

أرني الشيفرة من فضلك

على فكرة الفئة Testالموجودة مع الحزمة قد تساعدك أكثر

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جميل :) ،أنا كنت مفكر ان الداله setBounds تستخدم لتغيير حجم الComponent فقط ، لكن يبدوا أني كنت مخطئ ، والصحيح هو أنها بتغيير في المكان والحجم أيضا -تقريبا- ،

هكذا تكون طريقه الحزمه مفهومه ان شاء الله ، وان وجدت مشاكل حتعبك شويه :P

وهذه التجربه ولم تعمل :( :

 
public class Test extends JFrame{
JLabel lbl = new JLabel("There is 5 Customer now");
public Test() {
setLayout(null);
getContentPane().add(lbl);
new Thread(new AnimationRunnable(lbl,this.getContentPane())).start();
new Thread(new AnimationRunnable(formTo.vertical,new Point(0,0),10,lbl,this.getContentPane())).start();
setSize(200,200);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Test inst = new Test();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
inst.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
});
}
}
 

شاكر لك باشمهندس ..

بالتوفيق ،

تم تعديل بواسطه Wajdy Essam
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

كيف حالك أخ وجدي؟

المشكلة تكمن في أن الأخ nullLayout يجب أن يأخذ إحداثيات لحجم المكون وإلا سيعتبره (0,0)

لهذا تحتاج إلى إضافة هذه الجملة

lbl.setBounds(0, 0, 60, 30);

على العموم قد قمت بتحديث للحزمة بحيث تصبح قادرة للتعامل مع هذه المشكلة بشكل مقبول

وهو أن تقوم بإظهار المكون بالحجم المفضل preferred size

حل سيء بصراحة

لكني أعييت أن أستطيع تحديد الحجم بما يتناسب مع محتوى المكون component

هل لديك أي فكرة عن الموضوع

ملاحظة:

حالياً الحزمة لا تدعم الحركة في أكثر من اتجاه

وستلاحظ في الشيفرتك بعض القفزات للمكون

جاري العمل على دعمها في الإصدارة القادمة

راجع صورة UML

في النهاية شكراً لك على تجريب الحزمة

على الأقل من باب التشجيع :)

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

للأسف الرابط لا يعمل و أذكر عندما احتجت أن أقرأ عن حزمة imageprocessing

كذلك لم تعمل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتذر لك عن الخطأ الحاصل

المشكلة كانت لدى شركة الاستضافة

الآن الموقع يعمل

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكووووووووووووووووووووووووووووووووووووووووور حبيبي

قسم بالله نفس الفكره اللي كانت تفحط براسي قبل ما أعرف الـNetBeans

بدأت أحاول أسوي كلاسات خاصه بي توفر علي جهد التصميم وتحريك الأدوات وبالفعل أنشأت أول كلاس سميته JFrameBuilder والحمدلله نجحت 70% تقريباً بس وقفت عند التحريك لأنها صعبه شويه وماتكفي أني أحدد إحداثية الأداة بالبكسل مثلما كنا نسوي بالـ C++ رغم أن ماكان فيها أدوات جاهزه وإنما كنا نصممها بنفسنا وأحياناً نحتاج لدوال الـAPI , بس أشوفها أسهل بالتحكم بالمواقع من الجافا لأنها ماتتحدد إحداثيتها بالبكسل والسلام :)

فعلاً أبدعت أخي ومجهود رائع

والله يوفقك ويزيدك علم إلى علمك

تم تعديل بواسطه M.Allaw
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا أدري ما دخل NetBeans في الموضوع

على فكرة أنا أتكلم عن التحريك

وليس عن التصميم

أقصد مثلاً أنا مصمم لعبة سيارات وأريد تحريك السيارة

هذا لا دخل له بالتصميم وإنما بالتحريك

ولكي تسمح لك الجافا بتغيير إحداثيات المكونات بالبكسيل

يجب أن تستخدم الجملة التالية

setLayout(null)

وليس أي شيء آخر

طيب هل اطلعت على الشيفرة

هل فهمتها بسهولة

هل واجهتك أي مشاكل في الفهم

هل هناك أجزاء لم تفهمها وتريد مني شرحها

هل لديك اقتراحات للإضافة

هل لديك تعديلات على التصميم

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

<== أتحمس زياده عن اللزوم وفهم الموضوع غلط :D

ذلحين أنا فهمت أنه تحريك الأدوات كخخخخخخخخخخخخخخخخ

بالنسبه للكود إن شاءالله أجربه وإذا في أي إستفسار على طول بسألك وأنا واثق إنك مابتقصر تحياتي :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

رحبوا معي بالنسخة الجديدة من حزمة المحرك

(ما رأيكم بتغيير الاسم حزمة حركني سيكون أجمل؟)

إصدارة الحزمة:

أستطيع أن أقول الآن

أن هذه حزمة تقدم شيء ما

لهذا ستحصل على رقم

إصدارة الحزمة v0.1

مميزات الحزمة:

1- تستطيع تحريك أي مكون component

على أي حاوية container

مع تحكم كامل بنوع الحركة أو اتجاهها أو سرعتها

2- هناك ثلاث أنواع من الحركات

أ- حركة أفقية

ب- حركة عمودية

ج- حركة قطرية

3- إمكانية التبديل بين الحركات بسهولة

4- إمكانية إجراء عدد من الحركات بشكل تتابعي

مثال حركة أفقية بمقدار 10 في 100 م.ث

ثم حركة عمودية بمقدار 50 في 200 م.ث

ثم حركة قطرية بمقدار 5 في 10 م.ث

ملاحظة:

الحركة هنا تتم بشكل آني بمعنى أنك ستنتقل تلقائياً من مكان إلى مكان

أما إذا كنت تريد حركة بمعنى حركة فهذه مسؤوليتك

كيف استخدم الحزمة؟؟

استخدام الحزمة يعتمد على إنشاء كائن من الفئة AnimationRunnable

ثم تمريره كمدخل للفئة Thread واستدعاء الدالة start

لكي تستطيع إنشاء كائن من الفئة AnimationRunnable

لديك عدة طرق

أ- أن تمرر لصانع كائناتها

1- كائن من الفئة Container أو إحدى أبنائها

2- كائن من الفئة Component أو إحدى أبنائها

لا يشترط أن يكون الكائن من الفئة Component أو إحدى أبنائها

مضافاً إلى الكائن من الفئة Container أو إحدى أبنائها

إن لم يكن مضافاً ستقوم الحزمة بإضافته بنفسها

هناك مدخلات اختيارية ممكن أن تمررها أو أن تتجاهلها

ب- أن تمرر لصانع كائنتها

1- كائن من الفئة Container أو إحدى أبنائها

2- كائن من الفئة Component أو إحدى أبنائها

لا يشترط أن يكون الكائن من الفئة Component أو إحدى أبنائها

مضافاً إلى الكائن من الفئة Container أو إحدى أبنائها

إن لم يكن مضافاً ستقوم الحزمة بإضافته بنفسها

3- كائن من النوع AnimationList

وهذا الكائن يقوم بإنشاء ليستة list

تحتوي على الحركات التي سيتحركها المكون بالترتيب

4- إضافة بعض الحركات إلى الليستة

ويتم هذا من خلال الدوال

أ- أضف حركة إلى بداية الليستة insertAnimationFirst

ب- أضف حركة إلى نهاية الليستة insertAnimationLast

يمكنك حذف بعض الحركات من خلال الدوال التالية

أ- احذف حركة من بداية الليستة deletFirstAnimation

ب- احذف حركة من نهاية الليستة deletLastAnimation

ملاحظة: يشترط أن يكون مدير المكونات Layout Manager

من النوع nullLayout

(بمعنى أن نمرر للدالة setLayout مدخل null)

لرؤية مثال على هذه العملية يرجى مشاهدة الفئات Test1,Test2

مشاريع التطوير على الحزمة:

1- إضافة أحداث للحركات

بحيث يستطيع المبرمج إجراء حدث معين بعد تنفيذ الحركة

وقبل تنفيذ الحركة التالية

2- إضافة فئة للتزامن بين الكائنات المتحركة AnimationObject

إلى حد الآن لم تختمر الفكرة في رأسي لكني أظنها مهمة بالذات للألعاب

3- إضافة فئة لعملية التصادم بين الكائنات المتحركة

التوثيق الخاص بالحزمة:

سأكتفي مؤقتاً بالشرح الموجود هنا

مع الفئتين Test1,Test2

بصراحة لا أخفيكم أني لست رائق البال

لكي أكتب التوثيق بالإنجليزية

فلو تطوع أحد الأخوة وساعدني في ذلك

(وهذا ما لن يحصل على الأغلب :) )

سأكون له شاكر

تحميل الحزمة

1- ملف jar

AAnimationV0.1.rar

2- الشيفرة المصدرية

AAnimationSourceCodev0.1.rar

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الإصدارة 0.7 من الحزمة

وهذا رابط التدوينة الخاص بالإصدارة

http://modonat-alaa.freehostia.com/2009/06...D8%B1%D8%A9-07/

أفكر جدياً في أن أطرح الحزمة باللغة الإنجليزية لأن التفاعل للناطقين بالعربية أقل من الصفر بقليل

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

رائع يا علاء .. هذا النوع من المكتبات رائع .. ممتع ..

لم أعلم عن مكتبتك الا قبل أيام من مدونتك , ولم أفهم حينها ماذا تفعل .. حينها خطر ببالي موضوع المشاريع الخاصة في المجتمع العربي ;) .

- عملت اختبارات صارمة لمكتبتك .. وخرجت لك بسلّة اقتراحات وملاحظات ,

- أولا تحتاج حقيقة إلى توثيق , على الأقل تشرح كل Class وما عمله .. أنا الان فهمت ثلاث كلاسات وأظن عليها مدار العمل :

- AnimationList : تضع نقاط ارشادية بسياسة ( الى اليمين خطوة بعد ثانية - الى اليمين خطوتين بعد ثانية - الى الأسفل ثلاث خطوات بعد 200 ميللي ثانية ) .. وهذا رائع ويبعد المستخدم النهائي عن تخيل الاحداثيات X و Y .

- الاخر هو AnimationObject : وهو Component العادي , سهل وواضح باستثناء دالة addAnimationListner لم أفهم هدفها , حذفتها ولم يحصل شيء .

- AnimationEngine روح المحرك ..

هناك أسئلة عديدة وملاحظات .. لا أريد رميها مرة واحدة , احدى الاسئلة تقول : هل المحرك يحرك جميع الأجسام بنفس السرعة على مختلف الأجهزة ؟ , هذه قضية أزعجتني كثيراً , وسألت الاخوة عنها في قسم برمجة الألعاب وفي موقع آخر .

هناك ملاحظة أخرى : عندما يتجاوز AnimationObject حدود النافذة الأم , فانك تعيده من الجهة المقابلة , لكن من ملاحظة لست متأكد منها , اذا تحرك الجسم الى اليسار وتعدّى حدود النافذة لايعود من جهة اليمين ( يبدو لي هذا !! ) .

بقيّة الكلاسات لم أفهمها بصراحة , لكن أظنها غير مهمّة كثيرا للمستخدم النهائي .

مارأيك بانتاج حركة دائرية :) :

قمت بتعديل أحد أمثلتك , المحرك مرن جدا , بحيث يسمح بانتاج حركة دائرية بسلاسلة :

import java.awt.Point;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import version7.*;




public class Main extends JFrame{

private static final long serialVersionUID = -4483460310530299307L;
JButton button = new JButton();
private static AnimationEngine animationEngine;
public Main() {

//this statement very important to make AAnimation package run without any problem

setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addWindowListener(new WindowListener(){
public void windowClosed(WindowEvent e) {
animationEngine.stopAnimationEngine();
}

public void windowActivated(WindowEvent e) {


}

public void windowClosing(WindowEvent e) {
animationEngine.stopAnimationEngine();
}

public void windowDeactivated(WindowEvent e) {

}

public void windowDeiconified(WindowEvent e) {

}

public void windowIconified(WindowEvent e) {


}

public void windowOpened(WindowEvent e) {


}

});
setLocationRelativeTo(null);
setSize(800,600);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

public void run() {
Main inst = new Main();

double []arrx = new double[360];
double []arry = new double[360];
for(int i=0;i<360;i++)
{
arrx[i] = Math.cos(Math.toRadians((double)i));
arry[i] = Math.sin(Math.toRadians((double)i));
System.out.println("arrx = "+ arrx[i] + " arry = " + arry[i]);

}



AnimationList animationList=new AnimationList();
for(int i=0;i<360;i++)
{
int x = (int) ((arrx[i]*10*0.5));
int y = (int) ((arry[i]*10*0.5));
animationList.insertAnimationLast(AnimationType.horzintal,(int)x,10);
animationList.insertAnimationLast(AnimationType.vertical,(int)y,10);

}


AnimationObject animationObject = new AnimationObject(new Point(250,20),inst.button,inst.getContentPane(),animationList,false);
animationObject.setRepeat(true);


animationEngine=new AnimationEngine();
animationEngine.addAnimationObject(animationObject);
animationEngine.addAnimationEngineListner(new AnimationEngineListner(){

public void startAnimation() {

}

public void stopAnimation() {

}

});
new Thread(animationEngine).start();;
}
});
}
}

هناك اقتراحات :

- حاول تضيف كلاسات ( بالاعتماد على مبدأ الوراثة و تعدد الواجهات ) , وتعدّل بعض الكلاسات الحالية , بحيث يصبح تصميم الكود أجمل :

ListAnimator ‘ : هذا الكلاس يسمح بالحركة البسيطة في اتجاهين ( أفقي ورأسي ) .. وهو مافعلته أنت .

CircularAnimator : حركة دائرة , تدور حول نقطة معينة تحددها .

StraightPathAnimator : تعطيه احداثيين X و Y لنقطة البداية و X , Y لنقطة النهاية , فيتحرك بينهما .. هذه عملتها أنت حاليا بشكل غير مباشر بتطويرك لهذا الكلاس , تختصر على المستخدم النهائي بعض الاسطر .. مثل هذا الكلاس ستحتاجه كثيرا .

CurvePathAnimator : حركة تتبع نقاط ارشادية قليلة .. ولكن بانحناءات .. لو استخدمت AnimationList وصففت 3 نقاط وحاولت تتحرك بينها , ستلاحظ وجود تكسرات حادة في الحركة .. لقلّة النقاط .. ولكن لو استخدمت بعض المعادلات والخوارزميات , تستطيع أن تتحرك بانحناء ناعم بين هذه النقاط .. لا أعرف طريقة واضحة .. ولكنها ممتعة :) .. وستغني المستخدم لمكتبتك من عناء تحديد عشرات النقاط .. كما فعلت في مثالي السابق في الأعلى .. حيث احتجت الى 360 نقطة لتمثيل الحركة الدائرية .

ScrollAnimator : ونستخدمه مثلا في GUI , حيث لو تحركت الفأرة قوق Button , ينزلج ( يتحرك ) الزر الى اليمين قليلا بسلاسة , ثم اذا ابعدت الفأرة , يعود الزر لوضعه الطبيعي .

هذه الكلاسات , ستساعد المستخدم النهائي بشكل أسرع على تطوير حركته الخاصة .. وكلها ستكون بالاعتماد على الكلاس الأب ListAnimator .

هذه اقتراحات ,,, قابلة للأخذ والرد .

سعيد جدا بمكتبتك , موفّق .

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أثلجت صدري بردك أخ الشمري

فلقد توقعت أن الحزمة لن يستخدمها أحد سواي

لأن قلة من قاموا بتجربتها ولم يقم أحد بالتعليق عليها

بالنسبة للتوثيق للحزمة:

المشكلة والحق يقال أنا أسوأ من كتب أو سيكتب توثيقاً على ظهر البسيطة

على كل أعدك أني سأكتب مختصر عن كل فئة في الإصدارة القادمة بإذن الله

فعلاً هذه الفئات هي أهم فئات في الحزمة

بالإضافة إلى الفئات الخاصة بالأحداث Actions

حيث الحزمة تدعم مجموعة أحداث على النحو التالي

1- تشغيل المحرك

2- إيقاف المحرك

وهذه الأحداث يمكن الاستفادة منها عن طريق القيام ببناء الواجهة AnimationEngineListner

وعمل كائن من الفئة الجديدة وإضافته إلى الفئة AnimationEngine عن طريق الدالة addAnimationEngineListner

3- قبل البداية في تنفيذ مجموعة الحركات لكائن متحرك

4- بعد الانتهاء من تنفيذ مجموعة الحركات لكائن متحرك

5- قبل تنفيذ الحركة

6- بعد تنفيذ الحركة

وهذه الأحداث يمكن الاستفادة منها عن طريق القيام ببناء الواجهة AnimationListner

وعمل كائن من الفئة الجديدة وإضافته إلى الفئة AnimationObject عن طريق الدالة addAnimationListner

هذه الأحداث تمكنك من عمل أي شيء في الحزمة من إضافة كائنات متحركة إلى تعديل على قائمة حركات للكائن المتحرك الحالي

وفق أي منطق تريده

بالنسبة لباقي الفئات فلها علاقة بعملية scheduling للحركة

والسبب في وجودها إضافة المرونة بقدر المستطاع على الحزمة

حيث يمكنك إضافة وحذف أي حركة من الحركات ما لم تكن الحركة دخلت طور التنفيذ

في هذه الحالة سيتم تنفيذ الحركة كما هي مع ضمان التعديل عليها بعد الإنتهاء من تنفيذها

بالنسبة لملاحظتك على موضوع نقل الكائن من اليسار إلى اليمين

فملاحظتك في محلها يبدو أن عندي مشكلة bug في هذه النقطة

نفس المشكلة في النقل من الأعلى إلى الأسفل

سأقوم بإصلاح المشكلة في الإصدارة القادمة بإذن الله

بالنسبة للحركة الدائرية التي قمت بها

أتمنى لو تشرح لي الخوارزمية بالضبط

لاحظت أنك حولت من الإحداثيات العادية إلى الإحداثيات القطبية

لكني لا أذكر أي شيء عن الموضوع

أطلت عليك في الرد فاعذرني

بالنسبة للاقتراحات فسأفرد لها رداً آخر بإذن الله

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بالنسبة للحركة الدائرية التي قمت بها

أتمنى لو تشرح لي الخوارزمية بالضبط

لاحظت أنك حولت من الإحداثيات العادية إلى الإحداثيات القطبية

لكني لا أذكر أي شيء عن الموضوع

بالفعل , نستخدم أحد أبسط معادلات الاحداثيات القطبية , المعادلة بسيطة وهي مشروحة :

http://www.arabteam2000-forum.com/index.php?showtopic=137692

طبعا يكفي موضوع الدائرة .

الفكرة انتاج 360 نقطة .. وقمت بعملية حسبية بسيطة حتى تصبح النقاط ( تتراوح من 2 الى -2 تقريبا .. ) .. حتى تتوافق مع برنامج :

arrx = 2 : الى اليمين .

arrx = -2 الى اليسار .

وهكذا مع Y .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ممتاز يا أخوان ,, فعلا الان المكتبة تحتوي تقريبا على كل انواء الحركات ,,, فعلا شيء رائع .

وان شاء الله بنعمل على تطويرها و تحديثها.

بــــــــــــــارك الله فيكما أخي علاء ,, واخي الشمري.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً أخ شمري على الموضوع الأكثر من رائع

قرأت الجزء المتعلق بالدائرة والشرح سهل جداً

لكني أظن أن هناك مشكلة في الحركة

وذلك بسبب أنه يفترض أن ينتج لدينا نقطة

بينما في الحزمة الخاصة بي نتعامل مع الحركة المجردة

اكتشفت المشكلة لأني لاحظت أن نصف القطر الخاص بالدائرة التي وضعتها يساوي 2.5 بيكسل

مع هذا فإن الدائرة الناتجة قطرها كبير جدا

حاولت أن أجد فكرة ما لحل الإشكال لكني لم أجد

فهل لديك أخي أية أفكار

أخ MKSoft هل لديك أية ملاحظات أو اقتراحات على الحزمة

تحياتي

تم تعديل بواسطه علاء الصالحي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أرى الأمر منطقي :

arrx= 1

كأقصى قيمة ممكنة ناتجة من دالة جيب التمام .

أضربها في 10 = 10

اضربخا في 0.5 = 5

بعد 10 مللي ثانية ستتحرك 5 الى اليمين .

ثم نعيد الكرة مرة أخرى ولكن مع عدد أصغر ( مثلا 0.9 )

0.9 * 10 * 0.5 = 4.8 .. ويساوي 5 بعد التقريب .

ثم بعد 10 مللي ثانية تتحرك الى اليمين بمقدار 5 بكسل .

فالمحصلة النهائية .. بعد ثانية تكون قد قطعت أكثر من 100 بكسل ..

لست متأكد من الحسابات .. ولكن هذا ما أتوقعه .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الموضوع أن وحدة التحريك في الحزمة عندي هي النقطة

لكن ولاحظ معي الحركة نفسها

يهيألي أن الحركة تعدت الخمسمئة بيكسيل

بالنسبة للاقتراحات التي ذكرتها أخي

1- CircularAnimator سأستخدم الخاصة بك بإذن الله

2- StraightPathAnimator ماذا تقترح فيها أخي هل أتحرك أفقياً ثم عمودياً أم العكس أم أتحرك أفقياً وعمودياً في نفس الوقت(خط مستقيم)

3- CurvePathAnimator هذه لا أعرف خوارزمية لعملها يهيألي أنها أصعب واحدة فيهم

4- ScrollAnimator هذه لم أفهمها بالمرة هل يمكنك أن تعطيني مثالاُ عليها

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ماهي الاخبار :-) ,

كلما أردت اضافة رد , أشعر أنه لايوجد لدي ما أضيفه .. أو أشعر أني سأدخلك بدوّامة أخرى .. لأني أفكر من منطلق حب لبرمجة الالعاب , ولا أعرف بالظبط ماهو الهدف الذي تسعى أنت اليه .

انسى ماقلته لك من اقتراحات وحاول تقوم بالشيء الذي خططت له .

أعدت النظر في الحزمة التي طورتها .. وجدت أنك تعتمد حاليا على نوع من التحريك يعتمد على أوامر : تحرك لليمين - تحرك لليسار .. الخ .

هذه بدورها تقوم بتغليف الاحداثيات x و y , وتقوم بتغيير قيمها .

لذلك لايصلح هذا الكلاس( AnimationList ) كأب مثلاً للكلاس CircularAnimator .

لان كلاس مثل CircularAnimator سيحتاج لمعرفة x,y للشكل , بينما الكلاس AnimationList يقوم بتغليف x,y ويقوم بالتحريك بطريقة مختلفة .. لذلك يمكن اعادة تصميم الحزمة كالتالي :

FreeAnimator : أب لكلاسات التحريك , مجرد تغليف للاحداثيات السينية والصادية .. تستطيع مباشرة أن تتحكم بالاحداثيات .. لعمل أي حركة غير مدعومة من المحرك .. تعطي المستخدم الفرصة ليبني حركته التي يريد .

AnimationList : ابن للـ FreeAnimator , ويقوم بما يقوم به الان .

CircularAnimator : ابن للـ FreeAnimator ويقوم بوراثة وتعديل قيم X,Y مباشرة لانشاء حركة دائرية متقنة (أسرع ) .

ماأريد أن أصل اليه هو أنك بنيت كلاس AnimationList الذي هو حالة خاصة من أنواع التحريك , لذلك من الصعب أن تبني عليه بقية الحركات التي هي أعم منه , فكرة AnimationList مبتكرة , ولكن كما قلت حالة خاصة من انواع الحركة .

لذلك لا أستطيع أن أقترح عليك شيء , لاني لا أعرف كيف تريد أن يظهر شكل المحرك , المحرك بشكله الحالي نستفيد منه في عمل تأثيرات في GUI , في برمجة الالعاب يمكن الاستفادة من محركك في الحركات المستقيمة .. ويؤدي ذلك بشكل ممتاز , لكن بقية الانواع من الحركة ستدخلك بدوامة خوارزميات ..

لذلك طور الحزمة كما تحب أن تراها .. أنت أدرى بالطريقة المناسبة :-) ,اذا لم يكن هدفك الرئيس هو تطوير الالعاب .

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فعلياً بإمكاني أن أضيف هذه الحركة كنوع من الأنواع الحركة بسهولة

فهلا أوضحت لي ما الفكرة بالضبط

بل تستطيع القول أني قد أضفتها

حيث أني أضفت حركة جديدة أفقية وعمودية في نفس الوقت

لكن مقدار المسافة الأفقية != مقدار المسافة العمودية

وهذا مثال على هذه الحركة

animationList.insertAnimationLast(10, 30, 1000);

حيث 10 هي مقدار الزيادة الأفقية و 30 هي مقدار الزيادة العمودية

فهل هذه الحركة تغطي ما تريد أخي الشمري؟؟

أخي الشمري لا مشاكل معي في أي ملاحظات لك على الحزمة

حتى لو كان انتقاد

ففي النهاية الحزمة تتطور مع كل ملاحظة من ملاحظتك

ملاحظة:

لازلت أجري على الحزمة تعديلات لذا لم أضع نسخة من التعديل لكن لو أحببت فأخبرني وسأضع لك نسخة

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اسم الحزمة:

حزمة المحرك AAnimation package

(بضم الميم وكسر الراء ربما يوجد من لم يعرف قراءتها)

نبذة عن الحزمة:

الحزمة تمكنك من تحريك المكونات component

الخاصة بحزمةswing بدون أية تعقيدات

(بصراحة لم أجربها على awt لكن يفترض أن تعمل)

إصدارة الحزمة:

v0.8

هذه الإصدارة تضمنت بعض التعديلات التي تسهل البرمجة على الحزمة

وتعمدت هنا أن أبرهن على أن الحزمة قابلة للتشغيل

لذا تجدون مرفق مع الحزمة عارض صور بسيط

(بإذن الله سأقوم بتطويره وأضعه في حزمة أدواتي)

الإضافات على الحزمة

1- إضافة الحركة القطرية بأطوال غير ثابتة

2- فصل الفئة AnimationList عن الفئة AnimatonObject

بحيث يمكننا إضافة نفس مجموعة الحركات AnimationList إلى أكثر من كائن متحرك AnimatonObject

3- إضافة الحزمة Animation.Script والتي تعتبر حزمة مساعدة (حالياً لا تحوي الكثير لكني أنوي إضافة الكثير عليها في المستقبل بإذن الله)

4-عند وصول الكائن المتحرك إلى آخر الحاوية الخاصة بالمحرك

في الماضي كان الكائن يلف إلى الناحية الأخرى من الحاوية

الآن توجد ثلاثة خيارات

أ-أن يلف إلى الناحية الأخرى من الحاوية

ب-أن يتجاهل الحركات التي تخرجه عن إطار الحاوية

ج-أن يتم إيقاف حركة الكائن حتي يتغير موقعه على الحاوية

5-إضافة مجموعة من الدوال المساعدة التي تمكنك من تحديد إذا كان الكائن المتحرك وصل إلى حدود الحاوية

ألا وهي

isAnimationObjectReachBoundsOfAnimationEngineContatiner

isAnimationObjectReachBoundsOfAnimationEngineContatinerFromRight

isAnimationObjectReachBoundsOfAnimationEngineContatinerFromLeft

isAnimationObjectReachBoundsOfAnimationEngineContatinerFromDown

isAnimationObjectReachBoundsOfAnimationEngineContatinerFromUp

6-إضافة مجموعة من الدوال المساعدة التي تمكنك من تحديد إذا كان الكائن المتحرك يندفع إلى خارج الحاوية

ألا وهي

isAnimationObjectWakeOutOfAnimationEngineContatiner

isAnimationObjectWakeOutOfAnimationEngineContatinerFromDown

isAnimationObjectWakeOutOfAnimationEngineContatinerFromUp

isAnimationObjectWakeOutOfAnimationEngineContatinerFromLeft

isAnimationObjectWakeOutOfAnimationEngineContatinerFromRight

تعديلات على الحزمة

1- نقل الحاوية من الفئة كائن_متحرك AnimatonObject إلى الفئة محرك

2-إصلاح المشكلة المنطقية الموجودة في الدالة deletLastAnimation

3-إصلاح المشكلة المنطقية الموجودة في الدالة clearIndex

4-إصلاح المشكلة المنطقية الموجودة في الدوال newYLocation و newXLocation والتي أشار إليها الأخ الشمري في الفريق العربي للبرمجة

اقتراحات للتطوير

1- موضوع AnimationGroup وهي عبارة عن فئة تقوم بالربط بين الكائنات المتحركة

بحيث تولد أحداث عند التصادم بين الكائنات AnimationObject المنضمة للمجموعة

الفكرة تكمن في استخدام نمط المراقب observer بمعنى أن الكائن المتحرك سيعطي إشارة لمجموعة الكائنات المتحركة

بتغير مكانها وهذا يمكن المجموعة من التأكد من حال الكائن و هل اصطدم بكائن آخر

هذه هي الفكرة الرئيسية

2- حركات جديدة كدوران المكون حول نفسه أو دورانه حول نقطة ما

3- إضافة دالة لتحرير المصادر freeResources الخاصة بالحزمة

4-إضافة أحداث عند وصول المحرك إلى حافة الحاوية

لن أطيل عليكم وأتمنى لو تتحفوني باقتراحاتكم

شكر خاص للأخ الشمري على دعمه للحزمة

واقترحاته البناءة التي ساهمت في التطور الحاصل في الحزمة

الشكر موصول لأخي ضياء الصالحي الذي ساعدني في اختيار الصور للعرض وبعض الفنيات :)

تحميل الحزمة:

http://modonat-alaa.freehostia.com/2009/08...D8%B1%D8%A9-08/

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سؤال سريع، مع أني لم أقرأ الكود بعد، لكني فهمت أنك ترسم Component، لماذا لم تستعمل الفئة Shape؟؟أظن أنها توفر إمكانيات أكثر

------------------------------------------------

يا علاء الكود طويل عريض وفي الحقيقة لم أفهم ثلاثة أرباعه :wacko:

في الجزء الذي فهمته عندي بعض الملاحظات:

بالنسبة للAnimationType فأنت تكتفي بhorizontal و vertical، ولكن أحيانا نحتاج أيضا إلى الإتجاه، هل للأعلى أم للأسفل، وهل لليمين أم اليسار.

فمثلا عندما تريد التحرك لليمين فإنك تمرر incrementStep موجب وعند التحرك لليسار تعطي incrementStep سالب، والAnimationType يكون طبعا horizontal. أظن أنه من الأفضل لو تكون AnimationType على هذا الشكل



public enum AnimationType {
UP, DOWN, LEFT, RIGHT
}
   package version8;

وبالتالي في الconstructor الخاص بالفئة Animation يكون incrementStep دائما موجب، وأيضا نستطيع أن نعرف إتجاة الحركة الحالية

لماذا نحتاج معرفة الحركة الحالية؟؟ هذا يجرني للملاحظة الثانية

هذه الحزمة موجهة أساسا للألعاب، فلنفترض أني أحرك سيارة، وهذه السيارة يمكن أن تمشي في الإتجاهات الأربع، وكل اتجاه عنده صورة مستقلة. فمثلا عندما تتجه للأعلى يجب أن نظهر صورة السيارة للأعلى، وعندما تتجه للأسفل يجب أن نظهر صورة أخرى تمثل السيارة متجهة للأسفل وهكذا... كما في الصورة

post-181903-1253399606_thumb.jpeg

أين يمكن إضافة هذه الخاصية؟؟

تم تعديل بواسطه herch
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أنا لا أرسم يا عصام أنا أحرك ما هو مرسوم

أما لماذا لا أستخدم Shape لأني لست متأكداً أن الجميع يستخدم Shape بما فيهم الصور

ثم لأني لو قررت أن أستخدم Shape فلست واثقاً من أني قادر على تحريك مجموعة أشكال مع بعضها البعض

أقصد أنه لو أردت تحريك مجموعة من الأشكال مرسومة على JPanel على JFrame فقد أعاني بشدة

ملاحظة: معروف أن عملية الرسم لا تتم على JFrame مباشرة وإنما على JPanel

نقطة أخيرة باستخدامي هذه الطريقة فأنا أضمن أني لن أواجه أي مشاكل

لو قررت الرسم باستخدام حزمة منل openGL

بالنسبة للنقاط التي جاءت بعد ذلك

النقطة الأولى

هذه النقطة جيدة بالنسبة لسهولة التعامل مع الحزمة

سأعيد دراسة الموضوع مرة أخرى

بالنسبة للنقطة الثانية

يمكنك تحريك السيارة بالطريقة التي تشاء

يمكنك التحريك عن طريق الحركة الأفقية العمودية

وفي الإصدارة الأخيرة من الحزمة يمكنك التحريك بأطوال مختلفة

مثال

حرك السيارة 50 شمالاً و40 شرقاً في آن واحد

كما أنك تستطيع باستخدام الأحداث الموجودة في الحزمة أن تقوم بإجراء أي عملية على الكائن المتحرك

مثلاً تبديل صورة بدل صورة أخرى

أي عملية على الكائن المتحرك

أعطني صورة السيارة السابقة وسأريك بمثال كيف تتم العملية

تحياتي

تم تعديل بواسطه علاء الصالحي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أكثر ما دوخني في الكود هو مسألة الEvents، خصوصا طريقة النداء على الدوال الخاصة بها. فمثلا داخل الدالة doEvent تستعمل Method.invoke؟؟ :wacko: والله دخت.

ما أصعب قراءة وفهم كود كتبه شخص آخر :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .