تصف هذه المقالة محاكاة الحركة الكوكبية التي تنفذها برمجة Java. شاركه للرجوع إليه ، على النحو التالي:
انتهت برمجة لغة Java التي كنت أتطلع إليها لفترة طويلة أيضًا. في غضون بضعة أشهر ، أتقنت بشكل أساسي الاستخدام البسيط لـ Java ، وتعلمت المعرفة الأساسية الرئيسية لـ Java ، والتفكير الموجهة للكائنات ، والتحكم في التزامن متعدد الخيوط ، وتصميم واجهة التأرجح ، وإنتاج الرسوم المتحركة ، وما إلى ذلك. أخطط أخيرًا لإنشاء تصميم دورة يمكن أن يغطي أكبر قدر ممكن من المعرفة المستفادة وربطها في السلسلة. لذلك ، فكرت في تطبيق برنامج بسيط لمحاكاة الحركة الكوكبية. الأفكار الرئيسية هي كما يلي:
يتم استخدام الرسوم المتحركة لمحاكاة الحركة الكوكبية. يوجد كوكب مركزي في اللوحة الرئيسية ، ويتم رسم مدار بيضاوي الشكل ، ويتحرك كوكب متحرك في جميع أنحاء الكوكب المركزي. في الوقت نفسه ، هناك أربعة أزرار محددة في الزاوية اليمنى السفلى ، وهي "Start" و "Pause" و "Accelerate" و "Defilerate" التي يمكن أن تتسبب في تحريك الكواكب وتتوقف مؤقتًا وتسريع وتنهار على التوالي.
1. تصميم الفصل:
نجم يرث من jpanel. فئة النجوم هي الفئة الأساسية للكواكب ، وكل الكواكب المتحركة ورثت من فئة النجوم. ترسم طريقة السحب الداخلي () بشكل أساسي دائرة صلبة ، والغرض من ذلك هو التأكد من أن الكوكب المركزي يعرض دائمًا في كل مرة يتم رسمها. تتجاوز طريقة PaintComponent () طريقة رسم JPanel ، بهدف ضمان أن كائنات مثيل من فئة النجوم الموروثة من فئة النجوم يمكنها رسم كواكبها الخاصة. على النحو التالي:
حزمة نجم ؛ استيراد java.awt.color ؛ استيراد java.awt.graphics ؛ استيراد javax.swing.jpanel ؛ نجم الفئة العامة يمتد Jpanel { / *** فئة الكوكبية الأساسية* / private Static Final Long SerialVersionuid = 1L ؛ int x ، y ؛ عرض int ، الارتفاع ؛ Public Star () {width = 10 ؛ الارتفاع = 10 ؛ } النجم العام (int x ، int y) {this.x = x ؛ this.y = y ؛ العرض = 10 ؛ الارتفاع = 10 ؛ } public void draw (Graphics g) {g.setColor (color.blue) ؛ G.Filloval (x ، y ، العرض ، الارتفاع) ؛ } paintComponent المحمي void (Graphics g) {super.paintcomponent (g) ؛ G.Filloval (x ، y ، العرض ، الارتفاع) ؛ }}ترث فئة النجوم من فئة Star ، وهي صقل آخر لفئة النجوم ، التي تمثل الكواكب المتحركة. تمثل فئة ALFA in the Stars زاوية بداية الكوكب المتحرك ، وتمثل السرعة سرعة الحركة ، التي يمكن تعديلها. يمثل طويل وقصير المحور الرئيسي والمحور البسيط للمسار الإهليلجي على التوالي. يمثل المركز الكوكب المركزي لكائنه الذي تم إنشاءه. تتجاوز دالة PaintComponent () PaintComponent () ، داخليًا إلى دالة السحب () للفئة الأصل ، وتوجه المسار الإهليلجي وفقًا للطويلة والقصيرة والطويلة والاختصار بواسطة كائن التثبيت الذي يدعو إلى المُنشئ. تصف وظيفة MOVE () معادلة التغيير لـ X و Y ، أي التغييرات حول المدار الإهليلجي ، وتحدد أيضًا الطريقة التي يتغير بها ALFA. تشير وظيفة Start () إلى بدء مؤشر الترابط ، وتشير وظيفة الإيقاف المؤقت () إلى توقف مؤشر الترابط ، وتشير وظيفة التسارع () إلى عملية التسارع على الكوكب ، وتشير وظيفة التباطؤ () إلى العملية الموجودة على تباطؤ الكوكب.
الغرض من فئة PTHREAD هو التحكم في مؤشرات الترابط ، أي الحركة الأولية والحركة الموقوفة والتسريع وتفكك من الكوكب من خلال تثبيت فئة PTHREAD. يرث فئة PTHREAD من فئة الخيوط ويتم تضمينه في فئة البدء. لذلك ، لا يمكن تعريف فئة PTHREAD على أنها فئة مشتركة. توفر فئة PTHREAD طريقة RUN () ، وتدعو باستمرار طريقة REPAINT () لإعادة رسم الصورة. تستخدم طريقة setSusPend () تغيير المتغير المنطقي لإيقاف مؤشر الترابط (استدعاء طريقة الإخطار ()). نظرًا لأن فئة PTHREAD هي فئة داخلية من البدايات ، سيتم إنشاء كائن من فئة PTHREAD في فئة البدء وسيتم تشغيل مؤشر الترابط باستخدام هذا الكائن.
التصميم كما يلي:
حزمة نجمة ؛ استيراد java.awt.color ؛ استيراد java.awt.graphics ؛ نجوم الطبقة العامة يمتد Star { / *** Moving Planet* / Private Static Final Long SerialVersionuid = 1L ؛ مزدوج ألفا سرعة مزدوجة مركز النجوم int طويلة // Darken AXIS int Short ؛ // Short Axis Public Stars (int px ، int py ، star center) {super (px ، py) ؛ this.center = المركز ؛ long = (px - center.x)*2 ؛ قصير = (py - center.y)*2 ؛ this.setopaque (true) ؛ // move () ؛ ألفا = 0 ؛ السرعة = 0.001 ؛ } paintComponent المحمي void (Graphics g) {super.paintcomponent (g) ؛ center.draw (g) ؛ // ارسم نقطة النقطة المركزية () ؛ G.SetColor (color.green) ؛ G.Drawoval (center.x-long/2 ، center.y-short/2 ، long ، short) ؛ } public void move () {x = center.x + (int) (long/2*math.cos (alfa)) ؛ y = center.y + (int) (Short/2*Math.Sin (alfa)) ؛ // قم بتشغيل alfa على طول المسار الإهليلجي += السرعة ؛ . السلسلة الخاصة Control = "" ؛ public void run () {بينما (true) {synchronized (control) {if (append) {// move () ؛ REPAINT () ؛ }}}} setssopend public}} }} this.suspend = s ؛ }} pthread ptr = new pthread () ؛ public void start () {pt.setsuspend (true) ؛ pt.start () ؛ } public void pause () {pt.SetSusSpend (false) ؛ } public void accelerate () {// method method if (speed> 0) {// angle cerveration 0.0002 speed += 0.0002 ؛ } السرعة الأخرى = 0.001 ؛ } public void decelaterate () {// methiderate method if (speed> 0) {speed -= 0.0002 ؛ // تباطؤ في كل زاوية 0.0002} // إذا كانت السرعة مبطنة إلى 0 ، فلا يمكنك الاستمرار في التباطؤ. السرعة هي 0. إيقاف الحركة الأخرى السرعة = 0 ؛ }}فئة StarFrame هي لوحة بدء التشغيل لهذا البرنامج. من خلال إنشاء هذه الفئة ، يتم إنشاء واجهة البرنامج الرئيسية ، ويتم إضافة مكونات وأزرار والملصقات الكوكبية إلى اللوحة. تقوم طريقة getPanel () الداخلية بتعيين الأزرار وإرجاع jpanel (يضيف أربعة أزرار في JPanel). تقوم طريقة getLabel () بإرجاع JLabel مع وصف حرفي. الكائن المركزي هو مثيل لفئة النجوم ، و P1 هو مثيل لفئة النجوم ، يمثل الكوكب المركزي وكوكب المداري على التوالي. JB1 و JB2 و JB3 و JB4 هي أزرار التحكم للبدء ، والتوقف ، والتسريع والتباطؤ في الكوكب على التوالي. تمثل الصورة صورة خلفية الواجهة ، و LayeredPanel هي اللوحة الهرمية للواجهة ، مما يسهل إعداد صورة الخلفية. JP ، JL هو المكون الذي يعين صورة الخلفية. التصميم كما يلي:
حزمة نجمة ؛ استيراد java.awt.borderlayout ؛ استيراد java.awt.color ؛ استيراد java.awt.font ؛ استيراد java.awt.event.actionevent ؛ import java.awt.event.actionlistener ؛ import javax.swing.imageicon ؛ import javax.swing. javax.swing.jlabel ؛ import javax.swing.jlayeredpane ؛ import javax.swing.jpanel ؛ class public starframe يمتد Jframe { / ***لوحة بدء المحاكاة الكوكبية* / private Static Static Final Long SerialVersionuid = 1L ؛ Star Center = New Star (300،200) ؛ // حدد Center Planet Stars P1 = نجوم جديدة (300+230،200+130 ، المركز) ؛ JButton JB1 = New JButton ("start") ؛ JButton JB2 = New JButton ("توقف مؤقت") ؛ jbutton jb3 = new jbutton ("excelerate") ؛ jbutton jb4 = new jbutton ("decelatered") ؛ ImageIcon Image = new ImageIcon ("timg.jpg") ؛ // صورة الخلفية ، استخدم المسار النسبي لتحديد jlayeredpane layeredpane ؛ // تحديد لوحة هرمية لوضع صور الخلفية JPanel JP ؛ Jlabel JL ؛ Public StarFrame () {// set position for p1 ، and size p1.setBounds (40،40،600،400) ؛ // p2.setBounds (40،40،600،400) ؛ // تحديد صورة الخلفية ، ضع صورة الخلفية في Jlabel ، ضع Jlabel في JPanel layeredPane = new JLayeredPane () ؛ JP = New JPanel () ؛ jp.setBounds (0،0 ، image.geticonwidth () ، image.geticonheight ()) ؛ JL = New JLabel (Image) ؛ JP.Add (JL) ؛ // ضع JP على الطبقة السفلية. layeredpane.add (JP ، JLayeredPane.default_layer) ؛ // ضع JB إلى الطابق الأول layeredpane.add (p1 ، jLayeredPane.modal_layer) ؛ // layeredpane.add (p2 ، jlayeredpane.modal_layer) ؛ layeredpane.add (getPanel () ، jlayeredpane.modal_layer) ؛ layeredpane.add (getLabel () ، jlayeredpane.modal_layer) ؛ layeredpane.add (getLabel () ، jlayeredpane.modal_layer) ؛ // Set الإجراءات ذات الصلة لـ JB1 و JB2 و JB3 و JB4 ، على التوالي ، JB1.AdDActionListener (New ActionListener () {public void actionperformed (ActionEvent e) {// todo method method method cub.start () ؛}}) ؛ jb2.AdDactEllistener (new ActionListener () {public void actionperformed (actionevent e) {// todo method method method method p1.pause () ؛}}) ؛ jb3.addActionListener (new ActionListener () {public void actionperformed (actionevent e) {// todo method method method method p1.accelerate () ؛}}) ؛ jb4.AdActionListener (new ActionListener () {public void actionperformed (actionevent e) {// todo method method method method p1.decelerate () ؛}}) ؛ this.setLayeredPane (layeredpane) ؛ this.settitle ("Star") ؛ this.setBounds (100،100،1000،600) ؛ this.setDefaultCloseOperation (jframe.exit_on_close) ؛ this.setVisible (صحيح) ؛ } private jpanel getPanel () {// إرجاع الأزرار الأربعة المحددة JPanel JP = New JPanel () ؛ JP.Add (JB1) ؛ JP.Add (JB2) ؛ JP.Add (JB3) ؛ JP.Add (JB4) ؛ JP.SetBounds (750،450،200،70) ؛ إرجاع JP ؛ } private jpanel getLabel () {// إرجاع النص الوصف jlabel jl = new jlabel ("محاكاة الكواكب") ؛ jl.setforeground (color.red) ؛ // اضبط لون الخط JL.SetFont (خط جديد ("مربع الحوار" ، 0،20)) ؛ // اضبط الخط JPanel JP = New JPanel () ؛ JP.Add (JL ، BorderLayout.Center) ؛ JP.SetBounds (800،0،150،40) ؛ إرجاع JP ؛ } public static void main (string [] args) {suppressWarnings ("unused") starframe f = new StarFrame () ؛ }}تأثير الجري:
2. الكائن:
لأن Java هي لغة موجهة نحو الكائن ، بالطبع ، لا يمكن تنفيذها بواسطة وظائف تمامًا مثل لغة C. كيف لا يمكن أن يكون هناك أشياء في بنية الدورة؟
الأشياء الرئيسية:
مركز الكائن ، أي الكوكب المركزي
الكائن P1 ، يدور حول الكوكب
كائن PT ، أي الكائن المسؤول عن التحكم في مؤشر الترابط
الكائن F ، أي لوحة بدء تشغيل البرنامج
3. العلاقة بين الكائنات (التفاعل)
العلاقة بين P1 والمركز: فئة النجوم هي الفئة الأساسية للكوكب ، الموروثة من JPanel ، ويتم تعريف نصف القطر والإحداثيات الأساسية داخليًا. في الواقع ، فإن مركز الكائن الذي تم إنشاءه هو مركز الكوكب المتحرك. تمثل فئة النجوم الموروثة من Star كوكبًا متحركًا ، وهو صقل آخر. لذلك ، يمثل كائن مثيل P1 كوكبًا متحركًا 1 ويتحرك حول المركز. في الوقت نفسه ، يتم تمرير المركز كمعلمة إلى P1 لإكمال التفاعل بين الاثنين. هذه هي العلاقة بين الكائن P1 والمركز. بعد إنشاء إنشاء مركز للكائنات ، سيتم رسم دائرة صلبة تحت الإحداثيات المحددة ، ولن تتغير إحداثيات X و Y للكائن المركزي. على أساس رسم دائرة صلبة ، يرسم الكائن P1 المدارات الإهليلجية للمحور الرئيسي المحدد والمحور الثانوي وفقًا لإحداثيات المركز. في الوقت نفسه ، يقوم بتنفيذ فئة مؤشرات الترابط داخليًا ، والتي لا تقاطع مؤشر ترابط التنفيذ. تتيح علاقة الميراث المتبادل للمركز و P1 رسم الرسوم البيانية دون التدخل مع بعضها البعض. تجدر الإشارة إلى أنه في طريقة PaintComponent () في فئة Stras ، لا تزال طريقة Draw () للكائن المركزي بحاجة إلى استدعاء ، لأن الخيط سيتصل بالطريقة REPAINT () في البداية. إذا لم يتم تنفيذ طريقة سحب المركز () ، فلن تظهر النتيجة النهائية الكوكب المركزي.
العلاقة بين PT و P1: ترث فئة PTHREAD من فئة الخيط وتحدد طريقة Run (). عن طريق إنشاء كائن P1 ، يمكن استدعاء طريقة Start () لبدء مؤشر الترابط. تقع فئة PTHREAD داخل فئة البدء ، بحيث يمكن التحكم في الخيط من خلال الأساليب في P1 ، أي أنه يمكنه التحكم في سرعته وتسريعه وتفككه ، والتحكم في ما إذا كان يعمل أم لا.
العلاقة بين F وكل كائن: ترث StarFrame من JFrame. في الواقع ، يضيف كائن إنشاء مثيل F كل كائن إلى قماش ، ويقوم بإنشاء واجهة ، ويتحكم في حجم وموضع كل مكون ، وهو مفتاح تشغيل البرنامج.
4. الفهم الموجهة نحو الكائن:
كل شيء هو كائن. سألني بعض الطلاب ما هو الكائن. أجبت أن أولئك الذين لديهم كائنات جديدة ، والأشياء هي تثبيت الفصول. في هذا البرنامج ، يمكن إنشاء عدد لا يحصى من الكواكب عن طريق إنشاء فئة النجوم (نظريًا ، نعم). ومع ذلك ، يصعب حل بعض المشكلات في تنفيذ الوظائف الداخلية. الشيء الرئيسي هو إعادة كتابة طريقة PaintComponent (). بعد إنشاء الكائن مرة أخرى ، سيتم إعادة كتابة الطريقة مرة أخرى ، لذلك ستحدث مشكلة لا مفر منها ، وهو أيضًا أسف لا يمكن حله!
لمزيد من المحتوى المتعلق بـ Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "مقدمة والبرمجة التعليمية المتقدمة حول البرمجة الموجهة إلى Java" ، و "البرنامج التعليمي حول بنية بيانات Java" و "خوارزمية" و "ملخص مهارات تشغيل Java" ، و "ملخص مهارات تشغيل Java" و "ملخصات Java Cate".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.