كنا فى الأمس القريب جداً نحاول و مازلنا نحاول عمل لعبة 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 مرفق
--------------------------
شكراً

