الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Aanimation Package

بدأه علاء الصالحي في 13 مارس 2009 · 17 رد · 1,237 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اسم الحزمة:

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

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

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

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

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

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

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

v0.2

قصة الحزمة:

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

(أخيراً وجدت فائدة للأخ ربيع :) )

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

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

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

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

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

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

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

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

(فعلياً بدأت الحزمة تصلح في هذا المجال وقد صممت عليها

لعبة بسيطة لازالت لا تصلح في الألعاب التفاعلية)

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

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

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

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

على أي حاوية container

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

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

أ- حركة أفقية

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

ج- حركة قطرية

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

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

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

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

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

5- مجموعة أحداث تساعدك على جعل الحزمة أكثر مرونة وتزيد من قدرتها على احتواء الأفكار

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

1- إضافة إمكانية تكرار قائمة الحركات

2- إضافة الأحداث events للحزمة وهي على النحو التالي

أ-عند تشغيل محرك الكائنات AnimationRunnable

ب- وعند إيقافه

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

د- وعند الإنتهاء من تنفيذها

ه- عند تنفيذ كل حركة Animation

و- وعند الإنتهاء من تنفيذها

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

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

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

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

لديك عدة طرق

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

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

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

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

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

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

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

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

كائن من النوع AnimationObject

وهذا الكائن يتم إنشاؤه عن طريق صانع كائنات وحيد ومدخلاته على النحو التالي

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

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

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

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

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

3-كائن من الفئة AnimationList وهذا الكائن يحتوي على الحركات التي سيتحركها

المكون Component بالترتيب على حسب إضافتها إليه

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

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

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

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

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

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

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

4- متغير من النوع منطقي boolean يعبر عن إعادة الحركة بشكل متكرر

بعد أن أنشأنا الكائن AnimationRunnable بإحدى الطريقتين السابقتين

إلى حد الآن يمكن أن نتوقف إذا كنا لسنا بحاجة إلى إضافة مؤثرات

لإضافة المؤثرات على المكونات components المتحركة

يتم ذلك عن طريق الأحداث Events

هناك بضع خطوات يجب القيام بها

1- نقوم ببناء implement الواجهة interface المسماة AnimationListner

هذه الواجهة تحتوي على الدوال التالية

1- beforeAnimation

2- afterAnimation

3- beforeAnimationList

4- afterAnimationList

5- startAnimation

6- stopAnimation

كل دالة من هذه الدوال تنفذ عند وقت معين في تشغيل الحزمة

وقد سردتها من الأصغر إلى الأكبر

الدالتين 1,2 تنفذان بعد وقبل كل حركة

الدالتين 3,4 تنفذان بعد وقبل حصول كل الحركات مرة واحدة

الدالتين 5،6 تنفذان بعد وقبل تحريك المكون

بعد أن نقوم ببناء هاته الدوال في فئة ما ولتكن X

نقوم ببناء كائن من هذه الفئة وليكن xObject

نستخدم الدالة addAnimationListner في الكائن من الفئة AnimationRunnable

لإضافة الكائن xObject

نستطيع إضافة مجموعة من الفئة AnimationListner إلى الكائن AnimationRunnable

كما نستطيع حذفها هذه الكائنات باستخدام الدالة removeAnimationListner

يمكن مراجعة المثال test1 في الحزمة كمثال على ذلك

ملاحظة مهمة:

لكي تعمل الحزمة جيداً

يشترط أن يكون مدير المكونات Layout Manager

من النوع nullLayout

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

سأكون له شاكر

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

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

أي اقتراحات للتطوير سآخذها بعين الاعتبار بإذن الله

post-9738-1236971154_thumb.jpg

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

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

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

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

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

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

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

ممممممم :wink:

جَميل .."بفتح الجيم وليس بكسرها" :P

الصراحة شئ رائع ..اتوقع كان لك حزمة اولى كمان عاملها ...

طيب ..

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

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

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

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

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

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

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

هلا انا ما رح ساوي حالي كتير فهمان ..وانو متل ما قلت محترف من محترفين الاواجهات والتصميم ..

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

بالنسبة للاول عمليات التصادم او حسب ما بدك انتا انو نمنع التصادم ..يا هل ترى لو حاولت ببرمجتك للحزمة انك تعتمد على تقصيم الــ fram

لسينات وعينات اول لاكسات ووايات وتعطي مكان الرسم ابعاد width و height وتعتمد على تحريك الزر بمجال محدود مكون من

x=6 ,y=8 باعتبار نقطة الرسم او البداية x=0 ,y=0

ووضع الزر في بداية البرمجة مثلا من x=2,y=3 ونحركوا ضمن هالمجال ..بالتالي بنقدر نحط للزر التاني مجال لا يتعدى به على مجال الزر الاول

يعني الخط الاحمر والاخضر ..

لانو حسب شرحك للالية تحريك الزر اتوقع انو ما عتمدت على هالمنهج .. اذا تعرف مبدأ رسم منحينيات هلبرت وسبرنسكي ..

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

هلا اذا بدنا نحكي بالنقطة التانية ... الصراحة اجد انو لازم يكون لها حزمة جديدة وهي خاصة للــ 3D

لانو من الصعب ندمج ..ويمكن تكون كارثة انهيار عقلي للمبرمج ..

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

بس سؤال اخير

بشان التوثيق ... شو حاب تعمل يعني ..

بالتوفيق

الله معك ..

#3

السلام عليكم

بالنسبة لموضوع التصادم ليس المقصد منها منع التصادم

وإنما منبه notifier للمحرك بأنه هناك تصادم حصل بين الكائنات لكي يصدر حدث ما

المراد ليس منع التصادم وإنما أخذ ردة فعل مناسبة عند حدوث التصادم

بالنسبة لموضوع Documentation نحتاج إلى بني آدم جيد في اللغة الإنجليزية أو العربية

لكي يكتب توصيف للدوال الموجودة في الحزمة

يفترض أن يكون أنا من كتب التوثيق لكني كسول جداً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#4

السلام عليكــم ورحمـة الله وبركاتــه ،،

بصراحة عمل يستحق التقدير والتشجيع

فالتحريك موضوع صعب بالنسبة لي لا أدري بالنسبة للآخرين

لقد جربت المثالين Test1 et Test2

وودت التغيير في المثال 1 بجعل الفرايم تحوي رسم لقاعة و لكن لا أزال أحاول..

بالنسبة للفريم لم أفهم جيدا المغزى من اللايوت للفريمnull

فيمكن إضافة أشياء أخرى غير التحريك كالرسم

مثال لو أردت أن أضيف بانل عليها رسم و أضيفها للفريم هل هذا يمكن أم لا أو يجب التغيير بالحزمة؟

#5

السلام عليكم

أخت أسماء بإمكانك عمل كل شيء

كل ما هنالك أنك ستضطري لجعل Layout للسطح الذي سيسير عليه المكون component بـ null

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

ملاحظة يتم هذا من خلال

container.setLayout(null);

هل واجهتك أي مشاكل عن العمل؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

السلام عليكــم ورحمـة الله وبركاتــه ،،

بصراحة لقد واجهتني مشاكل فيما يخص ادراج رسم ولكن وددت ادراج محاولتي ها فلربماالفكرة خاطئة.

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

لقد أبقيت على مثال التاست1 كماهو وقمت باستدعاء حزمتك كباكج.وعمدت أن يكون التحريك على الفرايم المرسوم وليس الفرايم عادي كما في الكود:

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Point;

import javax.swing.JPanel.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import  version4.*;

class JInterface extends JFrame{
    JInterface(){
    JSalle js = new JSalle();
    getContentPane().add(js);
     setSize(200,200);                                           

     setVisible(true);

       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

class JSalle extends JPanel{

            public void paint(Graphics g){
        Color c=g.getColor();
        g.setColor(Color.MAGENTA);
        g.drawLine(50,50,190,50);
        g.drawLine(50,50,50,190);
        g.drawLine(190,50,190,190);
        g.drawLine(50,190,190,190);
        g.setColor(c);
        }

}
}
public class Test1  extends JInterface{
    /**
     * 
     */

      //  Graphics g;
    private static final long serialVersionUID = -4483460310530299307L;
               JPanel pnl = new JPanel();
                 //  JSalle js;
    public Test1() {

        //this statement very important to make AAnimation package run without any problem
                setLayout(null);
        pnl.setBackground(Color.BLACK);                       

    }           

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                          Test1 inst = new Test1();

                //inst.setLocationRelativeTo(null);


                                inst.setVisible(true);
                //inst.setDefaultCloseOperation(EXIT_ON_CLOSE);
                AnimationList animationList=new AnimationList();
                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.horzintal,10,100);
                }
                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.vertical,10,100);
                }
                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.horzintal,-10,100);
                }
                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.vertical,-10,100);
                }
                AnimationObject animationObject = new AnimationObject(new Point(10,10),inst.pnl,inst.getContentPane(),animationList,false);
                animationObject.setBounds(40, 0, 10, 10);
                //animationObject.setRepeat(false);


                AnimationRunnable animationRunable=new AnimationRunnable(animationObject);
                animationRunable.addAnimationListner(new AnimationListner(){

                    public void afterAnimation(AnimationObject animationObject) {
                        System.out.println("afterAnimation");
                    }

                    public void afterAnimationList(AnimationObject animationObject) {
                        System.out.println("afterAnimationList");
                        animationObject.setRepeat(true);

                    }

                    public void beforeAnimation(AnimationObject animationObject) {

                        System.out.println("beforeAnimation");

                    }

                    public void beforeAnimationList(AnimationObject animationObject) {
                        System.out.println("beforeAnimationList");

                    }

                    public void startAnimation(AnimationObject animationObject) {
                        System.out.println("startAnimation");

                    }

                    public void stopAnimation(AnimationObject animationObject) {
                        System.out.println("stopAnimation");

                    }

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

    }
}

حصلت على نتيجة غير متوقعة وليس ما أرغب به... -_-

أضع الكود بين أيديكم للمناقشة

#7

السلام عليكم

بعد المداولات والمحاولات

يمكنك أن تحركي أي مكون container على أي حاوية component

خذي الأمر ببساطة

لا تنسي أن تستدعي الدالة

super.paint(g);

عدلت الشيفرة وهي تعمل الآن

package version4;

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Point;

import javax.swing.JPanel.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import version4.*;


class JSalle extends JPanel{

public void paint(Graphics g){
	super.paint(g);
Color c=g.getColor();
g.setColor(Color.MAGENTA);
g.drawLine(50,50,190,50);
g.drawLine(50,50,50,190);
g.drawLine(190,50,190,190);
g.drawLine(50,190,190,190);
g.setColor(c);
}

}

public class Test3 extends JFrame{
/**
*
*/

// Graphics g;
private static final long serialVersionUID = -4483460310530299307L;
JPanel pnl = new JPanel();
private JSalle js;
// JSalle js;
public Test3() {

//this statement very important to make AAnimation package run without any problem
setLayout(null);
pnl.setBackground(Color.BLACK);
js = new JSalle();
js.setBounds(0,0,200,200);
getContentPane().add(js);
setSize(200,200);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Test3 inst = new Test3();

//inst.setLocationRelativeTo(null);


inst.setVisible(true);
//inst.setDefaultCloseOperation(EXIT_ON_CLOSE);
AnimationList animationList=new AnimationList();
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.horzintal,10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.vertical,10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.horzintal,-10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.vertical,-10,100);
}
AnimationObject animationObject = new AnimationObject(new Point(10,10),inst.pnl,inst.js,animationList,false);
animationObject.setBounds(40, 0, 10, 10);
//animationObject.setRepeat(false);


AnimationRunnable animationRunable=new AnimationRunnable(animationObject);
animationRunable.addAnimationListner(new AnimationListner(){

public void afterAnimation(AnimationObject animationObject) {
System.out.println("afterAnimation");
}

public void afterAnimationList(AnimationObject animationObject) {
System.out.println("afterAnimationList");
animationObject.setRepeat(true);

}

public void beforeAnimation(AnimationObject animationObject) {

System.out.println("beforeAnimation");

}

public void beforeAnimationList(AnimationObject animationObject) {
System.out.println("beforeAnimationList");

}

public void startAnimation(AnimationObject animationObject) {
System.out.println("startAnimation");

}

public void stopAnimation(AnimationObject animationObject) {
System.out.println("stopAnimation");

}

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

}
}

لكني لاحظت أن لدي مشكلة في الحزمة نفسها

ولما تتبعت الموضوع وجدت أن الحزمة تعمل جيداً لكن المشكلة في swing نفسها

حيث أني وسبحان الله أجد أن المكون قفز من المكان الذي حددته له إلى مكان آخر

بصراحة لم أعرف السبب وحاولت مراراً وتكراراً أن أجد حلاً لهذه المشكلة

لكن محاولاتي باءت بالفشل

في النهاية وجدت أن أفضل شيء أقوم به أن أضع الأمر على عاتقي وأن أقوم بنفسي بضبط الأمر

أنا أعمل حالياً على الموضوع

لو كان لدى أي أحد طريقة لحل المشكلة فليخبرني

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

السلام عليكم

الحمد لله حلت المشكلة

والمشكلة تكمن في أني لم أضع المنظم الخاص بـ js من النوع null

ولحل المشكلة نضيف الجملة التالية

js.setLayout(null);

وهاهو البرنامج كاملاً

package version5;

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Point;

import javax.swing.JPanel.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import version4.*;


class JSalle extends JPanel{

public void paint(Graphics g){
	super.paint(g);
Color c=g.getColor();
g.setColor(Color.MAGENTA);
g.drawLine(50,50,190,50);
g.drawLine(50,50,50,190);
g.drawLine(190,50,190,190);
g.drawLine(50,190,190,190);
g.setColor(c);
}

}

public class Test3 extends JFrame{
/**
*
*/

// Graphics g;
private static final long serialVersionUID = -4483460310530299307L;
JPanel pnl = new JPanel();
private JSalle js;
// JSalle js;
public Test3() {

//this statement very important to make AAnimation package run without any problem
setLayout(null);
pnl.setBackground(Color.BLACK);
js = new JSalle();
js.setBounds(0,0,200,200);
js.setLayout(null);
getContentPane().add(js);
setSize(200,200);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Test3 inst = new Test3();

//inst.setLocationRelativeTo(null);


inst.setVisible(true);
//inst.setDefaultCloseOperation(EXIT_ON_CLOSE);
AnimationList animationList=new AnimationList();
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.horzintal,10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.vertical,10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.horzintal,-10,100);
}
for (int i = 0; i < 12; i++) {
animationList.insertAnimationLast(formTo.vertical,-10,100);
}
AnimationObject animationObject = new AnimationObject(new Point(10,10),inst.pnl,inst.js,animationList,false);
animationObject.setBounds(40, 0, 10, 10);
//animationObject.setRepeat(false);
animationObject.addAnimationListner(new AnimationListner(){
	public void afterAnimation(AnimationObject animationObject) {
		System.out.println("afterAnimation");
		}

		public void afterAnimationList(AnimationObject animationObject) {
		System.out.println("afterAnimationList");
		//animationObject.setRepeat(true);

		}

		public void beforeAnimation(AnimationObject animationObject) {

		System.out.println("beforeAnimation");

		}

		public void beforeAnimationList(AnimationObject animationObject) {
		System.out.println("beforeAnimationList");

		}
});

AnimationRunnable animationRunable=new AnimationRunnable(animationObject);
animationRunable.addAnimationEngineListner(new AnimationEngineListner(){

public void startAnimation(AnimationObject animationObject) {
System.out.println("startAnimation");

}

public void stopAnimation(AnimationObject animationObject) {
System.out.println("stopAnimation");

}

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

}
}

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

السلام عليكم.

شكرا جزيلا أخ علاء .لقد استفدت كثيرا من حلك.

الآن سأحاول رسم القاعة بأبوابها ، وموازاتها مع تحرك الاوبجكت أو سأغير بمسار حركة هذا الأخير.

المحاولات لم تنته بعد....

#10

وأنا بانتظار محاولاتك بفارغ الصبر

وسأحاول تطويع الحزمة لكي تتناسب مع استخدامك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

السلام عليكــم ورحمـة الله وبركاتــه ،،

ربما أطلت عليك كثيرا أخ علاء بالجديد لأني بصراحة أجرب ولا أزال أجرب... :wacko:

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

وذلك بوضعي لإحداثيات ثابتة للأسف كبداية للقاعة كما يلي

g.drawLine(50,50,200,50);
        g.drawLine(200,50,200,300);
        g.drawLine(50,300,200,300);
        g.drawLine(50,50,50,200/4+40);
        g.drawLine(50,200/4+60,50,200/4+160);
        g.drawLine(50,200/4+180,50,300);
        g.drawLine(2*200/3,50,2*200/3,200/4+40);
        g.drawLine(2*200/3,200/4+60,2*200/3,200/4+160);
        g.drawLine(2*200/3,200/4+180,2*200/3,300);

فبدأت الرسم ابتداءا من النقطة 50،50

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

animationObject.setBounds(40,200/4+50 , 10, 10);

فمثلا لو أردت أن أوقف الاوبجكت المتحرك عند مكان تواجده بال A وذلك أعتقد بالمتود Thread.sleep(...) ولكن أين سيتم ايقاف تحركه على حساب مكان تواجده؟

وماهي وظيفة المتودس :

public void afterAnimation(AnimationObject animationObject) {
           }

     public void afterAnimationList(AnimationObject animationObject) {


     }

     public void beforeAnimation(AnimationObject animationObject) {

          }

     public void beforeAnimationList(AnimationObject animationObject) {
          }

     public void startAnimation(AnimationObject animationObject) {

     }

     public void stopAnimation(AnimationObject animationObject) {

     }

هذا من جهة ومن جهة أخرى،

غيرت طريقة تفكيري بالإتجاه المعاكس وأحاول الآن التغيير في كود مثال القاعتين الذي وضعته في موضوع الكونكرنسي مذ مدة، ومحاولتي استخدام حزمتك داخله

ولكن بصراحة أجد صعوبات لأنها دخلت multithreading ، وبهذا سأعرض مسوداتي لاحقا إذا تقدمت نوعا ما

#12

بصراحة لم أفهم المقصود بالضبط أخت أسماء

في هذه الجملة

فمثلا لو أردت أن أوقف الاوبجكت المتحرك عند مكان تواجده بال A وذلك أعتقد بالمتود Thread.sleep(...) ولكن أين سيتم ايقاف تحركه على حساب مكان تواجده؟

الحزمة ستأخذ منك حركات معينة وستتحرك على أساسها مثلاً لو كنا عند النقطة (x,y) ونريد الحركة إلى (x+50,y) سنقوم بوضع 5 حركات أفقية يكون مقدارها 10

بالنسبة للدوال المذكورة هذه الدوال للأحداث

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

ستضعيها في هذه الدوال

خذي عندك المثال التالي نريد بعد أن يتحرك المكون أن نصدر صوت معين سنقوم بوضع الصوت في هذه الدوال

في انتظار تجاربك ومحاولاتك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13

حسن ، المقصود بالجملة باننا نتعامل مع اثريد واحد في حالة تنفيذ و بالضبط في حالة حركة ، ونعلم بأنه نستطيع وضع الثريد في حالة توقف مؤقت عن احركة الاعتيادية ب المتود Thread.sleep(1000)مثلا، ففي المثال أود أن أسأل عن كيفية ايقاف حركة الاوبجكت في نقطة ما من الرسم .

بالنسبة لدوال الأحداث هل نستطيع وضع دالة ما تستطيع إيقاف حركة الثريد من نقطة ما معطاة

أي بأنه إذا بلغ المتحرك هذه النقطة سوف يتم التوقف ب sleep method

ان شاء الله اتضحت الفكرة

#14

هذه الإمكانية غير موجودة بالطريقة التي تتحدثين عنها

لكنها موجودة بالنسبة لك بطريقة حساب

بمعنى أنه لو كان الكائن في مكان (x,y) وتريدي نقله إلى مكان (x,y+50)

ستضيفي الحركة إلى عند خمسة حركات لكي تنقلك إلى المكان الآخر

لو كان هناك أكثر من حركة ولكنك تريدي التوقف عند حركة معينة يمكنك العد على هذا الأساس

عن طريق الأحداث المختلفة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#15

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

كيف استطيع ان ادمج هذه المكتبة في برنامجي؟ السؤال عام وليس خاص بهذه المكتبة ، هل هناك خطوات معينة؟

#16

هل تستخدم IDE معين لتطوير البرمجيات؟ماهو؟

لو لم تكن تستخدم IDE فكل ما عليك هو وضع المكتبة المراد استخدامها في المسار jre_install\lib\ext

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#17

السلام عليكــم ورحمـة الله وبركاتــه ،،

عودة إلى Teste1 example

حاولت أن أضيف 2بانل آخرين ليصبحوا ثلاثة، وهو ما يوافق 3animationobject و 3animationRunable و بالتالي

3 running threads.

ولكن ضمان التزامن والتعاون فيما بينهم لم يتم بعد لأجل حل مشكل القاعتين الذي أود حله. للأسف...

التغيير في كود التاست 1 طفيف كما يلي:

//مكان التصريح بالمتغيرات 
 JPanel []pnl = new JPanel[3]
..
..
public Test1() {
..
..
        // :الكود المعوض مكان 
//pnl= new JPanel()
for(int i=0;i<3;i++) {
pnl=new JPanel();
pnl.setBackground(Color.BLACK);
..
..

public static void main(String[] args) {
..
..
//الكود مكان انشاء annimationObject و بدء تنفيذ الثريد الموافق له 
// هنا صار 3 ثريد


                     for(int i=0;i<3;i++){

      animationObject = new AnimationObject(new Point(10,10),inst.pnl,inst.js,animationList,false);
      animationObject.setBounds(40,200/4+10*i , 10, 10);
         //animationObject.setRepeat(false);

          animationRunable=new AnimationRunnable(animationObject);

          th= new Thread(animationRunable);

          th.start();}

}

مع الأخذ بعين الإعتبار للقاعة المرسومة آخرا بالطبع

بالتنفيذ للكود سنحصل على تنفيذ مطابق لمثال الأوبجكت المتحرك الواحد ، فقط يصير عندنا 3 اوبجكتس متحركة في نفس الوقت وبدون علاقة فيما بينهم

أعتقد أن بداية إدخال synchronization تكمن في تعريف أربع متود سانكرونيزد تضمن دخول الأوبجكت عبر الأبواب الأربعة للقاعة بدون تصادم.

وذلك كالآتي:

public synchronized void TEVA(int id) {
       .....wait()

       for (int i = 0; i < 12; i++) {
    animationList.insertAnimationLast(formTo.horzintal,10,100);
                }
notifyAll();
       }

       public synchronized void tAVB(int id) {
           .....wait()

               // animationList=new AnimationList();
                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.vertical,10,100);
                }

        notifyAll();

    }


    public synchronized void tBVA(int id) {
        .....wait()

                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.horzintal,-10,100);
                }
        notifyAll();

    }


    public synchronized void tAVE(int id){
         .....wait()

                for (int i = 0; i < 12; i++) {
                    animationList.insertAnimationLast(formTo.vertical,-10,100);
                }
        notifyAll();

    }

هذه فكرة محتاجة للمناقشة والتجربة معا..

animationList تتغير على حسب تغير animationObject، وبهذا يجب أن يكون لكل animationList animationObject موافقة لحركته..

في انتظار آرائكم..

#18

أنا أعمل حالياً على تطوير الحزمة بشكل أكبر

الآن الحزمة تستطيع تحريك أكثر من component مع بعضها البعض

هل هذا يساعدك في عملك أخت أسماء؟

حتى الآن لم أنتهي كلية من التعديلات عليها

بإمكاني إرسالها لك مبدأياً لتجري تجاربك عليها

بالمناسبة هل موضوع القاعات هو نفسه الموجود في موضوع Concurrency In Java

يهيألي أن الدالة

animationList.insertAnimationLast(formTo.vertical,-10,100);

لا تعمل بشكل صحيح بعد إضافة animationList إلى animationObject

سأعمل على التأكد من أن وجود هذا في الحزمة الجديدة

أتمنى لك التوفيق

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة