أولاً هكذا خطأ
يجب أن يكون لديك مصفوفة تحتوي على هل الخانة ممتلئة أو فاضية
ثانياً يجب عليك أن ترسم لكل خانة إن كانت ممتلئة كرة
قم بعمل هذا وسنرى ما المشكلة بعد ذلك
تحياتي
أولاً هكذا خطأ
يجب أن يكون لديك مصفوفة تحتوي على هل الخانة ممتلئة أو فاضية
ثانياً يجب عليك أن ترسم لكل خانة إن كانت ممتلئة كرة
قم بعمل هذا وسنرى ما المشكلة بعد ذلك
تحياتي
ايوة بس انا المفروض فى الاول اوضح حدود نزول الكرة هيكون لغاية فين
زى ما عملنا فى الmousemoved() حددنا حدود المسار الى هتتحرك فيه الكرة على محور x
و ايضا لازم نحدد حدود المسار الى هتقف عنده الكرة على محور y
السلام عليكم
انا مستغربة كيف حضرتك كاتب هنا
oval_y = e.getY();
و بعدين كاتب
اقتباسe.getY() < line_y+(oval_y * 5)
هاي الجمله معناها
هل e.getY()< (e.getY()*5)+120
من الطبيعي انه المعادلة في كل الأوقات متحققة
يعني حتظلها دائما تحقق جواب الشرط تبع هاي المعادلة
واضح قصدي؟؟
لو حضرتك ركزت في الأكواد اللي قدمتها قبل ما افهم اللعبة
كان حليت مشكلة تحديد حدود الكرة في الميثود
mouseClicked
بكل سهولة
فعلى شان تحدد حدود الكرة اليك الكود التالي
public void mouseClicked(MouseEvent e) {
if (ball1||ball2) {
if (e.getY() > line_y + (6 * squaresize)) {
oval1_y = line_y + (6 * squaresize);
}
else if (e.getY() >= line_y + (5 * squaresize)) {
oval1_y = line_y + (6 * squaresize);
}
else if (e.getY() >= line_y + (4 * squaresize)) {
oval1_y = line_y + (5 * squaresize);
}
else if (e.getY() >= line_y + (3 * squaresize)) {
oval1_y = line_y + (4 * squaresize);
}
else if (e.getY() >= line_y + (2 * squaresize)) {
oval1_y = line_y + (3 * squaresize);
}
else if (e.getY() >= line_y + (1 * squaresize)) {
oval1_y = line_y + (2 * squaresize);
}
else if (e.getY() >= line_y + (0 * squaresize)) {
oval1_y = line_y + (1 * squaresize);
}
else if (e.getY() < line_y ) {
oval1_y = line_y + (1 * squaresize);
}
}
repaint();
}هنا في هذا الكود فقط حددنا المكان النهائي الذي
ستستقر فيه الكرة
طبعا قبل هيك احنا محتاجين نرسم الكرة و هي تسقط حتى تستقر
تمام هيك؟؟
السلام عليكم
لا أدري إذ كان أحدكم قد بدأ بعمل الanimation
لحركة سقوط الكرة بالنسبالي انا بدأت فيها و لكن واجهت مشكلة
انه عند استدعاء الrepaint()
أكثر من مرة في لوب حيث اضع تايمر بعد استدعاء اعادة الرسم
الذي يحدث انه بعد ان يمضي مجموع التايمر في كل اللفات فانه
في النهاية يستدعي الrepaint()
اتمنى أن أسمع رأي الاخوة ممن لديهم خبرة في المالتيميديا
انا سوف احاول حلها و ان شاء الله لو توصلت الى حل ساضعه
حياكم الله
اقتباسهاي الجمله معناهاهل e.getY()< (e.getY()*5)+120
من الطبيعي انه المعادلة في كل الأوقات متحققة
يعني حتظلها دائما تحقق جواب الشرط تبع هاي المعادلة
واضح قصدي؟؟
مش فاهمك كويس فى الجزئية دى
السوال التانى : ليه لما بيكون
if (e.getY() > line_y + (6 * squaresize))
بتجعلى ال
oval1_y = line_y + (6 * squaresize);
ولما بيكون 5 تجعليها 6
و لما بيكون 4 تجعليها 5
و هكذا
ياريت التوضيح لانى مش فاهمها بجد
السلام عليكم
ركز كويس في المعادلة
e.getY()< (e.getY()*5)+120
يعني e.getY() دائما سوف تكون اصغر من خمس أضعافها مضافا لها الرقم 120
فبالتالي سوف يكون هذا الشرط متحقق دائما و باقي الشروط غير متحققه
السوال التانى : ليه لما بيكون
if (e.getY() > line_y + (6 * squaresize))
بتجعلى ال
oval1_y = line_y + (6 * squaresize);
أوكي,
else if (e.getY() >= line_y + (4 * squaresize)) {
oval1_y = line_y + (5 * squaresize);
}الآن ما معنى
e.getY() >= line_y + (4 * squaresize)
يعني ان المؤشر في المربع الخامس
و ذلك لاننا قلنا هل هي أكبر من من أربع أضعاف طول ضلع المربع بعني في المربع الخامس واضح؟؟
فبالتالي سوف يتم رسم الكرة في المربع الخامس و بما انك في دالة الrepaint()
كنت ترسم الدائرة من
oval1_y - squaresize
فبتالي لكي ترسم المربع من الزاوية اليسرى العلوية للمربع
نقوم بجعل قيمة oval1_y بحيث تقع على الزاوية السفلية للمربع
فعند الرسم يتم طرح طول المربع من oval1_y
فتكون نقطة البداية لرسم الكرة هي اعلى المربع
واضح؟؟؟؟؟ :blink: :huh:
أشك :(
jfriend اعرضي الكود الخاص بالدالة ككل
حتى أرى أين المشكلة
هل هناك مشاكل بالنسبة لك أخ mr.beshoy
تحياتي
السلام عليكم
اقتباسjfriend اعرضي الكود الخاص بالدالة ككلحتى أرى أين المشكلة
شكرأ أخ علاء الحمد لله المشكلة انحلت.
المشكلة كانت عندما أردت تحريك الكرة الى المربع الذي يوجد به المؤشر لتمر بكل المربعات السابقة له
قمت برسم الكرة مرة باللون الأسود ثم مرة باالون الأبيض بحيث تتغير احداثيات
الكرة وفق عداد معين و طبعا بين كل رسمة للكرة هناك delay
حتى تبدو و كأنها تتحرك
كما هو واضح فأنا في حاجة الى استدعاء الميثود repaint()
بشكل مستمر بناءا على التغيير في احداثيات الكرة
فالمشكلة ظهرت ان الrepaint لا تنفذ في كل مرة التي يستمر استدعاءها
في اللوب فقط يتم استدعاء أخر وحدة في اللوب فلا تظهر الحركة
و لكن عندما بحثت في الانترنت وجدت ان هذه المشكلة ظهرت لدى كثير من المبرمجين
و قد ذكر ان الاستدعاء المستمر للrepaint
يندمج مع بعضه فلا تنفذ الا أخر واحدة لذا ذكرو لكي يتم حل هذه المشكلة
لابد من عمل Thread
لا أقصد Thread.sleep();
-حتى هذه الميثود لم تجدي-
بل تقوم بعمل Thread
تقوم باستدعاء الrepaint في جملة الرن التابعة له
فعلا زبطت هذه الطريقة
و هذا الكود بعد التعديل
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.*;
public class CreateImage extends JPanel {
private BufferedImage image;
private Graphics g;
private ImageIcon icon;
private JLabel image_label;
public static int squaresize = 80, line_x = 40, line_y = 120;
public static int oval1_x = line_x + (3 * squaresize), oval1_y = 120;
public static int oval2_x = line_x + (3 * squaresize), oval2_y = 120;
public static boolean ball1, ball2;
int flag=0;
int ov=0;
public CreateImage() {
image = new BufferedImage(700, 1000, BufferedImage.TYPE_INT_RGB);
g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, image.getWidth(), image.getHeight());
MymouseAdabter mouse = new MymouseAdabter();
addMouseListener(mouse);
addMouseMotionListener(mouse);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g.drawImage(image, 0, 0, null);
line_x = 40;
line_y = 120;
for (int row = 1; row <= 7; ++row) {
BasicStroke line = new BasicStroke(5);
g2.setStroke(line);
g2.setColor(Color.BLUE);
g2.draw(new Line2D.Double(line_x, line_y, line_x + (7 * squaresize), line_y));
line_y += squaresize;
}
line_x = 40;
line_y = 120;
for (int col = 0; col <= 7; col++) {
BasicStroke line = new BasicStroke(5);
g2.setStroke(line);
g2.setColor(Color.BLUE);
g2.draw(new Line2D.Double(line_x, line_y, line_x, line_y + (6 * squaresize)));
line_x += squaresize;
}
line_x=40;
line_y=120;
if (ball1) {
g.setColor(Color.BLACK);
g.fillOval(oval1_x, oval1_y - squaresize, squaresize, squaresize);
}
if (ball2) {
g.setColor(Color.BLUE);
g.fillOval(oval1_x, oval1_y - squaresize, squaresize, squaresize);
}
}
public static void play_oneActionListener() {
ball1 = true;
ball2 = false;
}
public static void play_twoActionListener() {
ball2 = true;
ball1 = false;
}
public void paint2(){
repaint();
}
private class MymouseAdabter extends MouseAdapter implements Runnable{
Thread circleThread = null;
@Override
public void mouseMoved(MouseEvent e) {
if (ball1||ball2) {
oval1_x = e.getX();
int uu=line_x + (7 * squaresize);
oval1_x = e.getX();
// JOptionPane.showMessageDialog(null,"e.getX()= "+e.getX()+"\n"+"uu= "+uu+"\n"+"line_x= "+line_x);
if (e.getX() > line_x + (7 * squaresize)) {
oval1_x = line_x + (6 * squaresize);
}
else if (e.getX() >= line_x + (6 * squaresize)) {
oval1_x = line_x + (6 * squaresize);
}
else if (e.getX() >= line_x + (5 * squaresize)) {
oval1_x = line_x + (5 * squaresize);
}
else if (e.getX() >= line_x + (4 * squaresize)) {
oval1_x = line_x + (4 * squaresize);
}
else if (e.getX() >=line_x + (3 * squaresize)) {
oval1_x = line_x + (3 * squaresize);
}
else if (e.getX() >= line_x + (2 * squaresize)) {
oval1_x = line_x + (2 * squaresize);
}
else if (e.getX() >= line_x + (1 * squaresize)) {
oval1_x = line_x + (1 * squaresize);
}
else if (e.getX() >= line_x + (0 * squaresize)) {
oval1_x = line_x + (0 * squaresize);
}
else if (e.getX() < line_x ) {
oval1_x = line_x + (0 * squaresize);
}
repaint();
}
//repaint();
}
public void mouseClicked(MouseEvent e) {
if (ball1||ball2) {
if (e.getY() > line_y + (6 * squaresize)) {
oval1_y = line_y + (6 * squaresize);
}
else if (e.getY() >= line_y + (5 * squaresize)) {
oval1_y = line_y + (6 * squaresize);
}
else if (e.getY() >= line_y + (4 * squaresize)) {
oval1_y = line_y + (5 * squaresize);
}
else if (e.getY() >= line_y + (3 * squaresize)) {
oval1_y = line_y + (4 * squaresize);
}
else if (e.getY() >= line_y + (2 * squaresize)) {
oval1_y = line_y + (3 * squaresize);
}
else if (e.getY() >= line_y + (1 * squaresize)) {
oval1_y = line_y + (2 * squaresize);
}
else if (e.getY() >= line_y + (0 * squaresize)) {
oval1_y = line_y + (1 * squaresize);
}
else if (e.getY() < line_y ) {
oval1_y = line_y + (1 * squaresize);
}
ov=oval1_y;
circleThread = new Thread(this);
circleThread.start();
}
}
public void run() {
// JOptionPane.showMessageDialog(null,"ov= "+ov);
for(int y=120;y<=ov;y+=30){
oval1_y=y;
repaint();
try {
Thread.sleep(100);
}
catch (InterruptedException evt) {}
if(y+30>ov){
oval1_y=ov;
repaint();
}
}
/* for(int y=line_y + (1 * squaresize);y<=ov;y+=squaresize){
oval1_y=y;
repaint();
try {
Thread.sleep(100);
}
catch (InterruptedException evt) {}
} */
}
}
}فعلاً هناك مشكلة في عملية الرسم المتعدد
لأن الخيط الرئيسي راح يتعطل ويتبهدل
أصلاً استخدام sleep في الخيط الرئيسي مشكلة
تحياتي
سلام للجميع
شكرا مستر علاء
و اخت jfriend
لمعاونتكم لى و أقدر تعبكم جدا جدا .
اود ان اعرض راى اخر
بدل ما كنا كل مرة نقول
if(e.gety()>120+(3*squersize)
so
ovaly=120+(4*squaresize)
وهكذا إلى ان ننهى الشبكة
سواء فى الmousemoved pr mouseclicked
عرفت طريقة اخرى دلنى عليها احد الزملاء
و هى
private class MymouseAdabter extends MouseAdapter {
private int[] square_num = new int[6];
@Override
public void mouseMoved(MouseEvent e) {
if (ball1 || ball2) {
for (int n = 0; n < square_num.length; ++n) {
square_num[n] = 120 + 6 * squaresize;
}
oval_x = e.getX();
if (e.getX() > line_x + (7 * squaresize)) {
oval_x = line_x + (6 * squaresize);
}
}
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
if (ball1 || ball2) {
for (int n = 0; n < square_num.length; ++n) {
square_num[n] = 120 + 7 * squaresize;
// square_num[n] -= 6 * squaresize - squaresize;
}
oval_y = e.getY();
if (e.getY() > line_y + (6 * squaresize)) {
oval_y = line_y + (6 * squaresize);
}
repaint();
}
}
}و الان هنتقل لمرحلة ان احاول ملئ الصف و العمود بالدوائر
و إذ واجهت مشكلة ساستعين بكم
و شكرا
أخ mr.beshoy
بالتأكيد هذه الشيفرة فيها شيء خطأ
لأنها منافية لأبسط قواعد المنطق
لماذا لم تظهر مشكلة لديك
لأن السطر التالي يعمل بشكل جيد
oval_x = e.getX();
لهذا تلاحظ أن البيضاوي يمشي مع حركة الفأرة تماماً
مع أنه مفروض لا يتحرك إلى إذا دخلنا مربع جديد
سأقوم بتصليح الشيفرة ووضعها
تحياتي
هى مش تمام للدرجة يعنى
بس انا هدفى نبسط الكود الكبير لجزئية أقل
و منتظر ردك
شكرا
أخ mr.beshoy
:mad: سؤال ما فائدة هدا الكود
for (int n = 0; n < square_num.length; ++n) {
square_num[n] = 120 + 7 * squaresize;
}و اذا كان غرضك من هذا هو تحديد المربع الذي ضغط عليه المؤشر كيف سيتم
تحديد المربع و كل القيم في المعادلة
square_num[n] = 120 + 6 * squaresize;
هي ثوابث يعني سوف تكون قيمة
square_num[n]
في كل لفة من لفات اللوب تساوي
120+(6*80)
يعني قيمة square_num[n] ثابتة دائما
أصلا ما فائدة square_num[n]
طالما انك لم تستعمله
oval_x = e.getX();
استعمالك اهذه الجملة يعني اينما تحرك المؤشر ارسم كرة و هل هذا هو المطلوب؟؟؟؟!!!
رجعتنا لنقطة البداية :S
نحن مهمتنا ان نحدد المربع الذي ضغط عليه المستخدم و نرسم بداخله كرة
تم تعديل هذه المشاركة بواسطة jfriend في 26 سبتمبر 2008 في 17:48
هذا ما أتكلم عنه jfriend
واضح أن المنطق هنا معدوم تماماً
التبسيط أخي ما كنت كتبه أول مرة
لكن الاحترافية في ما تريد أن تقوم به
بمعنى لو أردت زيادة حجم الرقعة فلن تحتاج إلى تغيير الكثير
تحياتي
سلام يا شباب
أخت jfriend
اقتباسو اذا كان غرضك من هذا هو تحديد المربع الذي ضغط عليه المؤشر كيف سيتمتحديد المربع و كل القيم في المعادلة
square_num[n] = 120 + 6 * squaresize;
هي ثوابث يعني سوف تكون قيمة
square_num[n]
في كل لفة من لفات اللوب تساوي
120+(6*80)
يعني قيمة square_num[n] ثابتة دائما
أصلا ما فائدة square_num[n]
طالما انك لم تستعمله
ثوابت ازاى ما الn كل مرة بتقل
و بعدين احنا ممكن نكتب السطر ده
square_num[n] - = squaresize;
فبالتالى هتقل قيمة square_num[n]
بالنسبة لاخ علاء
اعتقد ان هناك طريقة اخرى لتبسيط الكود
و لكن مش مشكلة هنكمل و ادينا بنكتشف
أخ mr.bashory
جرب تشيل الجملة هذه من الشيفرة
oval_x = e.getX();
لاحظ أنه مفروض البيضاوي ما يمشيش مع الفارة
وإنما ينط نط
أقصد أنه عندما تتجاوز منطقة إلى منطقة بالفأرة سينتقل معك
لكن تلاحظ أن البيضاوي يتبع الفأرة في حركتها بالملي
تحياتي
تم تعديل هذه المشاركة بواسطة alaadiaa في 27 سبتمبر 2008 في 00:27
اقتباساعتقد ان هناك طريقة اخرى لتبسيط الكودو لكن مش مشكلة هنكمل و ادينا بنكتشف
أوكي أخي لو كنت ترغب بعمل الميثودات
mouseMoved, mouseClicked
بطريقة أبسط اليك الطريقة التالية:
تم تعديل هذه المشاركة بواسطة jfriend في 28 سبتمبر 2008 في 17:25
السلام عليكم
لقد عرفت المشكلة في الكود خاصتك أخي
يجب أن تجعل قيمة line_x , line_y إلى قيمتها الأصلية بعد رسم الشبكة
لا تنسى أن تحذف الجملة التي أشرت لها مسبقاً
عموماً أنا أنهيت موضوع الرسم تماماً
لكني لم أحب أن أطرحه لكم لأترك لكم فرصة التفكير
تحياتي
السلام عليكم
اقتباسلقد عرفت المشكلة في الكود خاصتك أخييجب أن تجعل قيمة line_x , line_y إلى قيمتها الأصلية بعد رسم الشبكة
أخ علاء عن أي مشكلة تتحدث؟ هل عن المشكلة الأولى و هي
خروج الكرة عن حدود الشبكة في الأعلى عندما يتم اختيار الاعب؟؟
أقصد لا بد أنك لاحظتي
أن الكرة تلحق الفارة مباشرة
يفترض أن تمشي الكرة مربعاً مربعاً وليس تبعاً للفارة مباشرة
تحياتي
سلام
صدقنى انا دلوقتى مشغول شوية فى طلبات الكلية
فى لعبة ناويين نعملها مع بعض لمادة السوفتوير little bompers or snake game))
و مشروع ادارة مكتبة لمادة ال system analysis
و تقريبا مشروع c#
صغير كده
فموقف دى شوية و بجد مضايق جدا جدا لان نفسى اكملها ياريت تنصحنى اعمل ايه لو عندك حل
و أنا نفسى الموضوع ده يتثبت عشان كلنا نتاقش فيها اللعبة دى
وشكرا لاهتمامك اخ علاء
حضرتك شايف اهتمم بال projects بتاعة الكلية دلوقتى و اركن اللعبة لحد م يخلص الترم افضل ؟؟؟؟؟
بس اعتقد انا مش خسسران حاجة لان فى كلتا الحالتين هنشتغل برمجة و لا رايك ايه ؟
بالضبط
وبعدين ممكن بعد ما تخلص شغل الكلية تشتغل فيهم
ممكن كمان في الصيفي تشتغل فيهم وكده يعني
أهم حاجة تهتم بدرساتك دلوقت
تحياتي