[Swing]مشروع برمجة لعبة الكرة النارية Breakout game
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: مشاريع مفتوحة المصدر Java App
صفحة 1 من اصل 1 • شاطر
[Swing]مشروع برمجة لعبة الكرة النارية Breakout game
أهلا بكم
العبة Breakout هي لعبة قديمة تم تطويرها في الأصل بواسطة شركة Atari Inc. وقد تم إنشاء اللعبة في عام 1976...في هذه اللعبة ، يقوم اللاعب بتحريك مضرب على الشاشة ويسترجع كرة أو كرات. الهدف هو تدمير الطوب في الجزء العلوي من النافذة.
سنقوم فى هذا المقال ببرمجة هذا اللعبة وذلك من خلال سبع فئات وهم على النحو التالى :
1_كتابة محتوي الفئة Commons.java
يحتوي ملف Commons.java على بعض الثوابت الشائعة. يخزن ثوابت العرض والطول أبعاد اللوحة. عندما تمر الكرة على BOTTOM_EDGE ، تنتهي اللعبة. N_OF_BRICKS هو عدد الطوب في اللعبة. INIT_PADDLE_X و INIT_PADDLE_Y هما إحداثيات أولية للكائن المجذاف. يعد INIT_BALL_X و INIT_BALL_Y إحداثيات أولية لكائن الكرة. يعد DELAY التأخير الأولي بالمللي ثانية قبل تنفيذ المهمة و PERIOD هو الوقت بالميلي ثانية بين عمليات إعدام المهام المتعاقبة التي تشكل دورات اللعبة ....على النحو التالى :
2_كتابة محتوي الفئة Sprite
فئة Sprite هي فئة أساسية لجميع الكائنات في اللوحة. نضع هنا جميع الأساليب والمتغيرات الموجودة في كائنات Ball و Brick و Paddle ، مثل أساليب getImage () أو getX ()...على النحو التالى :
3_كتابة محتوي الفئة Brick
هذه هي فئة الطوب
4_كتابة محتوي الفئة Ball
5_كتابة محتوي الفئة Paddle
هذه هي فئة المضرب. يتم تغليف الكائن Paddle في لعبة Breakout. يتم التحكم في مجداف مع مفاتيح الأسهم اليسار واليمين. بالضغط على مفتاح السهم ، قمنا بتعيين متغير الاتجاه. بتحرير مفتاح السهم ، قمنا بتعيين متغير dx على صفر. بهذه الطريقة توقف المضرب عن الحركة.
6_كتابة محتوي الفئة Board
7_كتابة محتوي الفئة الاخير Breakout
العبة Breakout هي لعبة قديمة تم تطويرها في الأصل بواسطة شركة Atari Inc. وقد تم إنشاء اللعبة في عام 1976...في هذه اللعبة ، يقوم اللاعب بتحريك مضرب على الشاشة ويسترجع كرة أو كرات. الهدف هو تدمير الطوب في الجزء العلوي من النافذة.
سنقوم فى هذا المقال ببرمجة هذا اللعبة وذلك من خلال سبع فئات وهم على النحو التالى :
- Commons.java
- Sprite.java
- Ball.java
- Paddle.java
- Brick.java
- Board.java
- Breakout.java
1_كتابة محتوي الفئة Commons.java
يحتوي ملف Commons.java على بعض الثوابت الشائعة. يخزن ثوابت العرض والطول أبعاد اللوحة. عندما تمر الكرة على BOTTOM_EDGE ، تنتهي اللعبة. N_OF_BRICKS هو عدد الطوب في اللعبة. INIT_PADDLE_X و INIT_PADDLE_Y هما إحداثيات أولية للكائن المجذاف. يعد INIT_BALL_X و INIT_BALL_Y إحداثيات أولية لكائن الكرة. يعد DELAY التأخير الأولي بالمللي ثانية قبل تنفيذ المهمة و PERIOD هو الوقت بالميلي ثانية بين عمليات إعدام المهام المتعاقبة التي تشكل دورات اللعبة ....على النحو التالى :
- الكود:
public interface Commons {
public static final int WIDTH = 300;
public static final int HEIGTH = 400;
public static final int BOTTOM_EDGE = 390;
public static final int N_OF_BRICKS = 30;
public static final int INIT_PADDLE_X = 200;
public static final int INIT_PADDLE_Y = 360;
public static final int INIT_BALL_X = 230;
public static final int INIT_BALL_Y = 355;
public static final int DELAY = 1000;
public static final int PERIOD = 10;
}
2_كتابة محتوي الفئة Sprite
فئة Sprite هي فئة أساسية لجميع الكائنات في اللوحة. نضع هنا جميع الأساليب والمتغيرات الموجودة في كائنات Ball و Brick و Paddle ، مثل أساليب getImage () أو getX ()...على النحو التالى :
- الكود:
import java.awt.Image;
import java.awt.Rectangle;
public class Sprite {
protected int x;
protected int y;
protected int i_width;
protected int i_heigth;
protected Image image;
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
public void setY(int y) {
this.y = y;
}
public int getY() {
return y;
}
public int getWidth() {
return i_width;
}
public int getHeight() {
return i_heigth;
}
Image getImage() {
return image;
}
Rectangle getRect() {
return new Rectangle(x, y,
image.getWidth(null), image.getHeight(null));
}
}
3_كتابة محتوي الفئة Brick
هذه هي فئة الطوب
- الكود:
import javax.swing.ImageIcon;
public class Brick extends Sprite {
private boolean destroyed;
public Brick(int x, int y) {
this.x = x;
this.y = y;
ImageIcon ii = new ImageIcon("brick.png");
image = ii.getImage();
i_width = image.getWidth(null);
i_heigth = image.getHeight(null);
destroyed = false;
}
public boolean isDestroyed() {
return destroyed;
}
public void setDestroyed(boolean val) {
destroyed = val;
}
}
4_كتابة محتوي الفئة Ball
- الكود:
import javax.swing.ImageIcon;
public class Ball extends Sprite implements Commons {
private int xdir;
private int ydir;
public Ball() {
xdir = 1;
ydir = -1;
ImageIcon ii = new ImageIcon("ball.png");
image = ii.getImage();
i_width = image.getWidth(null);
i_heigth = image.getHeight(null);
resetState();
}
public void move() {
x += xdir;
y += ydir;
if (x == 0) {
setXDir(1);
}
if (x == WIDTH - i_width) {
setXDir(-1);
}
if (y == 0) {
setYDir(1);
}
}
private void resetState() {
x = INIT_BALL_X;
y = INIT_BALL_Y;
}
public void setXDir(int x) {
xdir = x;
}
public void setYDir(int y) {
ydir = y;
}
public int getYDir() {
return ydir;
}
}
// الشفرة اعلاه لانشاء الكرة.
public void move() {
x += xdir;
y += ydir;
if (x == 0) {
setXDir(1);
}
if (x == WIDTH - i_width) {
setXDir(-1);
}
if (y == 0) {
setYDir(1);
}
}
//الشفرة اعلاه طريقة لتحريك الكرة
//إذا اصطدمت الكرة بالحدود ، يتم تغيير الاتجاهات وفقًا لذلك
public void setXDir(int x) {
xdir = x;
}
public void setYDir(int y) {
ydir = y;
}
//يتم الاتصال هاتان الطريقتان عندما تضرب الكرة المضرب أو الجدار الطوبي
5_كتابة محتوي الفئة Paddle
هذه هي فئة المضرب. يتم تغليف الكائن Paddle في لعبة Breakout. يتم التحكم في مجداف مع مفاتيح الأسهم اليسار واليمين. بالضغط على مفتاح السهم ، قمنا بتعيين متغير الاتجاه. بتحرير مفتاح السهم ، قمنا بتعيين متغير dx على صفر. بهذه الطريقة توقف المضرب عن الحركة.
- الكود:
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Paddle extends Sprite implements Commons {
private int dx;
public Paddle() {
ImageIcon ii = new ImageIcon("paddle.png");
image = ii.getImage();
i_width = image.getWidth(null);
i_heigth = image.getHeight(null);
resetState();
}
public void move() {
x += dx;
if (x <= 0) {
x = 0;
}
if (x >= WIDTH - i_width) {
x = WIDTH - i_width;
}
}
//يتحرك المضرب في الاتجاه الأفقي فقط ، لذلك نقوم فقط بتحديث الإحداثي x. إذا كانت الشروط تضمن أن المضرب لا يجتاز حواف النافذة.
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = -1;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 1;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
}
private void resetState() {
x = INIT_PADDLE_X;
y = INIT_PADDLE_Y;
}
}
6_كتابة محتوي الفئة Board
- الكود:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
public class Board extends JPanel implements Commons {
private Timer timer;
private String message = "Game Over";
private Ball ball;
private Paddle paddle;
private Brick bricks[];
private boolean ingame = true;
public Board() {
initBoard();
}
private void initBoard() {
addKeyListener(new TAdapter());
setFocusable(true);
bricks = new Brick[N_OF_BRICKS];
setDoubleBuffered(true);
timer = new Timer();
timer.scheduleAtFixedRate(new ScheduleTask(), DELAY, PERIOD);
}
@Override
public void addNotify() {
super.addNotify();
gameInit();
}
private void gameInit() {
ball = new Ball();
paddle = new Paddle();
int k = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 6; j++) {
bricks[k] = new Brick(j * 40 + 30, i * 10 + 50);
k++;
}
}
}
//في طريقة gameInit () نقوم بإنشاء كرة ومضرب وثلاثين حجر.
//اعتمادًا على متغير ingame ، إما أن نرسم كل الكائنات في طريقة drawObjects () أو ننهي اللعبة باستخدام طريقة gameFinished ().
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
if (ingame) {
drawObjects(g2d);
} else {
gameFinished(g2d);
}
Toolkit.getDefaultToolkit().sync();
}
private void drawObjects(Graphics2D g2d) {
g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(),
ball.getWidth(), ball.getHeight(), this);
g2d.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
paddle.getWidth(), paddle.getHeight(), this);
for (int i = 0; i < N_OF_BRICKS; i++) {
if (!bricks[i].isDestroyed()) {
g2d.drawImage(bricks[i].getImage(), bricks[i].getX(),
bricks[i].getY(), bricks[i].getWidth(),
bricks[i].getHeight(), this);
}
}
}
private void gameFinished(Graphics2D g2d) {
Font font = new Font("Verdana", Font.BOLD, 18);
FontMetrics metr = this.getFontMetrics(font);
g2d.setColor(Color.BLACK);
g2d.setFont(font);
g2d.drawString(message,
(Commons.WIDTH - metr.stringWidth(message)) / 2,
Commons.WIDTH / 2);
}
private class TAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
paddle.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
paddle.keyPressed(e);
}
}
private class ScheduleTask extends TimerTask {
@Override
public void run() {
ball.move();
paddle.move();
checkCollision();
repaint();
}
}
private void stopGame() {
ingame = false;
timer.cancel();
}
private void checkCollision() {
if (ball.getRect().getMaxY() > Commons.BOTTOM_EDGE) {
stopGame();
}
for (int i = 0, j = 0; i < N_OF_BRICKS; i++) {
if (bricks[i].isDestroyed()) {
j++;
}
if (j == N_OF_BRICKS) {
message = "Victory";
stopGame();
}
}
if ((ball.getRect()).intersects(paddle.getRect())) {
int paddleLPos = (int) paddle.getRect().getMinX();
int ballLPos = (int) ball.getRect().getMinX();
int first = paddleLPos + 8;
int second = paddleLPos + 16;
int third = paddleLPos + 24;
int fourth = paddleLPos + 32;
if (ballLPos < first) {
ball.setXDir(-1);
ball.setYDir(-1);
}
if (ballLPos >= first && ballLPos < second) {
ball.setXDir(-1);
ball.setYDir(-1 * ball.getYDir());
}
if (ballLPos >= second && ballLPos < third) {
ball.setXDir(0);
ball.setYDir(-1);
}
if (ballLPos >= third && ballLPos < fourth) {
ball.setXDir(1);
ball.setYDir(-1 * ball.getYDir());
}
if (ballLPos > fourth) {
ball.setXDir(1);
ball.setYDir(-1);
}
}
for (int i = 0; i < N_OF_BRICKS; i++) {
if ((ball.getRect()).intersects(bricks[i].getRect())) {
int ballLeft = (int) ball.getRect().getMinX();
int ballHeight = (int) ball.getRect().getHeight();
int ballWidth = (int) ball.getRect().getWidth();
int ballTop = (int) ball.getRect().getMinY();
Point pointRight = new Point(ballLeft + ballWidth + 1, ballTop);
Point pointLeft = new Point(ballLeft - 1, ballTop);
Point pointTop = new Point(ballLeft, ballTop - 1);
Point pointBottom = new Point(ballLeft, ballTop + ballHeight + 1);
if (!bricks[i].isDestroyed()) {
if (bricks[i].getRect().contains(pointRight)) {
ball.setXDir(-1);
} else if (bricks[i].getRect().contains(pointLeft)) {
ball.setXDir(1);
}
if (bricks[i].getRect().contains(pointTop)) {
ball.setYDir(1);
} else if (bricks[i].getRect().contains(pointBottom)) {
ball.setYDir(-1);
}
bricks[i].setDestroyed(true);
}
}
}
}
}
7_كتابة محتوي الفئة الاخير Breakout
- الكود:
import java.awt.EventQueue;
import javax.swing.JFrame;
public class Breakout extends JFrame {
public Breakout() {
initUI();
}
private void initUI() {
add(new Board());
setTitle("Breakout");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(Commons.WIDTH, Commons.HEIGTH);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Breakout game = new Breakout();
game.setVisible(true);
}
});
}
}
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
NEXT- الادارة
- تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة :
الجنس :
| |
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: مشاريع مفتوحة المصدر Java App
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى
أمس في 6:56 pm من طرف moslema_r
» مظلات وسواتر
السبت مايو 04, 2024 8:58 pm من طرف moslema_r
» شركة تنظيف خزانات بالرياض
الخميس مايو 02, 2024 6:10 pm من طرف moslema_r
» افضل شركة رش مبيدات بالرياض
الإثنين أبريل 29, 2024 9:00 pm من طرف moslema_r
» ارخص شركة مكافحة الصراصير بالرياض
الخميس أبريل 25, 2024 8:56 pm من طرف moslema_r
» شركة مكافحة حشرات في راس الخيمة
الخميس أبريل 25, 2024 8:34 pm من طرف moslema_r
» تطبيقIncogniton لإدارة ملفات تعريف متعددة للمتصفح
الأربعاء أبريل 24, 2024 3:51 pm من طرف زاكااا
» افضل شركة مكافحة النمل الابيض بالرياض
الإثنين أبريل 22, 2024 9:41 pm من طرف moslema_r
» Exemplary Сasual Dating - Verified Women
الخميس أبريل 18, 2024 9:18 pm من طرف wdqwd
» رش الدفان بالرياض
الخميس أبريل 18, 2024 7:11 pm من طرف moslema_r