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

كيفية تغير مكان لون من مكانه الأصلى إلى مكان آخر

بدأه mr.beshoy في 13 أبريل 2010 · 6 رد · 588 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كنا فى الأمس القريب جداً نحاول و مازلنا نحاول عمل لعبة tetris .

كنت استعمل صور اللعبة و أجرى عليها عمليات معينة لتحريكها رأسياً . و لكن هناك رأى تم توجيهه لنا بإن لا نستعمل الصور و لكن نصمم الأشكال بنفسنا و ذلك عن طريق تلوين جزء من ال panel بما يتفق و هيئة الشكل المراد .

ال code سيوضح ما أقول .

و لكن المشكلة التى واجهتنى و هى :

كالعادة الشكل - الذى على هيئة لون - يظهر فى بداية ال panel و يتحرك لإسقل ، المشكلة كانت فى كيفية نقله راسياً لإسفل بسرعة معينة . "احترت فى كيفية عملها "

و أضع لكم آخر شئ توصلت له ، لكن الذى يخرج إن اللون يكون ممتدا راسيا .

انطروا و ستفهمونى .

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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

enum Action {

    START, HELP, EXIT;
}

class MainGame extends JFrame {

    private JPanel mainPanel, buttonsPanel;
    private Box mainButtonsBox;
    private JButton[] buttons;
    private Action[] buttonsNames;
    private Action action;
    private MainFrameTetries mainFrameTetries;

    public MainGame() {
        createContainer();
        buttonsNames = Action.values();
        for (int i = 0; i < buttonsNames.length; ++i) {
            action = buttonsNames;
            createButtons(action);
        }
        getContentPane().add(mainPanel);
        //////////////////////////////////////////////////
    }

    public static void main(String[] args) {
        MainGame mainGame = new MainGame();
        mainGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainGame.setSize(new Dimension(600, 300));
        mainGame.setLocationRelativeTo(null);
        mainGame.setExtendedState(MAXIMIZED_BOTH);
        mainGame.setVisible(true);
    }

    private void createContainer() {   // for createing container
        /////////////////////MainPanel/////////////////////////////
        mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(30, 30, 30, 30);
        //////////////////////Box&Panel fro buttons/////////////////////////////////////
        mainButtonsBox = Box.createHorizontalBox();
        buttonsPanel = new JPanel(new GridLayout(3, 1));
        mainButtonsBox.setBorder(BorderFactory.createLineBorder(Color.BLUE, 5));
        mainButtonsBox.setPreferredSize(new Dimension(400, 200));
        mainButtonsBox.add(buttonsPanel);
        ///////////////////////////////////////////////////////////////////////////////
        mainPanel.add(mainButtonsBox, c);
        //////////////////////////////////////////////////
        mainFrameTetries = new MainFrameTetries(this);
        mainFrameTetries.setVisible(false);
        mainPanel.add(mainFrameTetries);
    }

    private void createButtons(Action action) {
        buttons = new JButton[buttonsNames.length];
        for (int i = 0; i < 1; ++i) {
            buttons = new JButton(action.name());
            buttons.addActionListener(listenerFor(action));
            buttonsPanel.add(buttons);
        }
    }

    private ActionListener listenerFor(Action action) {
        switch (action) {
            case START:    // START BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        mainFrameTetries.setVisible(true);
                        mainButtonsBox.setVisible(false);
                    }
                };
            case HELP:   // HELP BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "HELP");
                    }
                };
            case EXIT:  // EXIT BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "EXIT");
                    }
                };
        }
        return null;
    }
}

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

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

class MainFrameTetries extends JPanel implements ActionListener {

    private int x, y;
    private Timer timer;
    private int rows = 20, columns = 8;
    private JPanel[][] panel;
    private Random random;
    private Color rcolor;

    public MainFrameTetries(MainGame mainGame) {
        random = new Random();
        createMainPanel(mainGame);
        creatwTetrisPanel();
        rcolor = randomColor();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        moveSquareVertical();
    }

    private void createMainPanel(MainGame mainGame) {
        setPreferredSize(new Dimension(200, 400));
        setSize(getPreferredSize());
        setLayout(new GridLayout(rows, columns));
        System.out.println(getPreferredSize().height);
        x = mainGame.getWidth() / 2 - getWidth() / 2;
        y = mainGame.getHeight() / 2 - getHeight() / 2;
        setLocation(x, y);

    }

    private void creatwTetrisPanel() {
        panel = new JPanel[rows][columns];
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                panel[j] = new JPanel();
                panel[j].setBackground(Color.WHITE);
                panel[j].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
                add(panel[j]);
            }
        }
    }

    private void createSquare(Color rcolor, int i) {
        panel[3].setBackground(rcolor);
        panel[4].setBackground(rcolor);
        panel[3].setBackground(rcolor);
        panel[1][4].setBackground(rcolor);
        timer = new Timer(400, this); //execute the actionPerformed method each 400 ms
        timer.start();

    }

    public void actionPerformed(ActionEvent e) {
    }

    private Color randomColor() {
        return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
    }

    private void moveSquareVertical() { // for  move it vertically
        for (int i = 0; i < rows; ++i) {
            createSquare(rcolor, i);    // for create square 
            repaint();
        }
    }
}

ال code مرفق

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

شكراً

TestrissGame.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 13 أبريل 2010 في 03:46

#2

الفكرة بسيطة جدا : للتحريك للأسفل على سبيل المثال، نعيد النقطة panels[j] إلى لونها الأصلي. ثم نقوم بتلوين النقطة panels[i+1[j] بلون الشكل الذي نريد رسمه. بالتالي تظهر النقطة وكأنها تحركت للأسفل

تم تعديل هذه المشاركة بواسطة * ياسر * في 13 أبريل 2010 في 11:55

#3

لقد فعلت هذا التغير كما قولت

    private void createSquare(Color rcolor, int i) {
        panel[3].setBackground(rcolor);
        panel[4].setBackground(rcolor);
        panel[i+1][3].setBackground(rcolor);
        panel[1+1][4].setBackground(rcolor);
        timer = new Timer(400, this); //execute the actionPerformed method each 400 ms
        timer.start();

    }

و لكن يعطينى ArrayIndexOfBoundException

بصراحة مش عارف كيف أطبقها بالظبط

شكراً

تم تعديل هذه المشاركة بواسطة mr.beshoy في 13 أبريل 2010 في 16:06

#4
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

class MainFrameTetries extends JPanel implements ActionListener {

	private int x, y;
	private Timer timer;
	private int rows = 20, columns = 8;
	private JPanel[][] panel;
	private Random random;
	private Color rcolor;
	private int currentRow = 0;	//current vertical position
	private int currentColumn = 3;	//current horizontal position

	public MainFrameTetries(MainGame mainGame) {
		random = new Random();
		createMainPanel(mainGame);
		createTetrisPanel();
		rcolor = randomColor();
		timer = new Timer(400, this);
		timer.start();
	}

	private void createMainPanel(MainGame mainGame) {
		setPreferredSize(new Dimension(200, 400));
		setSize(getPreferredSize());
		setLayout(new GridLayout(rows, columns));
		System.out.println(getPreferredSize().height);
		x = mainGame.getWidth() / 2 - getWidth() / 2;
		y = mainGame.getHeight() / 2 - getHeight() / 2;
		setLocation(x, y);
	}

	private void createTetrisPanel() {
		panel = new JPanel[rows][columns];	
		for (int i = 0; i < rows; ++i) {
			for (int j = 0; j < columns; ++j) {
				panel[j] = new JPanel();
				panel[j].setBackground(Color.WHITE);
				panel[j].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
				add(panel[j]);
			}
		}
	}

	private void clearPanel() {
		for (int i = 0; i < rows; ++i) {
			for (int j = 0; j < columns; ++j) {
				panel[j].setBackground(Color.WHITE);
			}
		}
	}

	private void moveSquaresDown() { 
		if (currentRow < rows-1) {
			clearPanel();
			panel[currentRow][currentColumn].setBackground(rcolor);
			panel[currentRow][currentColumn+1].setBackground(rcolor);
			panel[currentRow+1][currentColumn].setBackground(rcolor);
			panel[currentRow+1][currentColumn + 1].setBackground(rcolor);
		} else {
			timer.stop();
		} 	
		currentRow++;
	}

	public void actionPerformed(ActionEvent e) {
		moveSquaresDown();
		repaint();
	}

	private Color randomColor() {
		return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
	}
}

تم تعديل هذه المشاركة بواسطة JustPassing في 13 أبريل 2010 في 17:11

#5

فهمت الطريقة . لكن كيف يمكننى التحكم فى سرعة حركة الشكل ؟؟

فكرت أن أضيف فى الدالة ClearPanel السطر speed+=5

علماً بأن ال speed =0 كقيمة مبدأية

    public void clearPanel() {
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < columns; ++j) {
                panel[j].setBackground(Color.WHITE);
            }
            speed += 5;
        }
    }

لكن كيف أجعل السرعة هذه تؤثر على الحركة ؟

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

شكراً جزيلاً

#6

إجعل ال delay الخاص بال Timer أصغر (timer.setDelay)، وبالتالي ستكون الحركة أسرع

#7

فعلا ، بدل من

timer=new Timer(100, this);)

جعلتها

timer=new Timer(300,this)

و بدأت تتحرك ببطئ

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

شكراً لك على تعبك معنا .

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…