赞
踩
接下来简单说一下我编游戏的基本步骤吧,希望对大家有帮助,我编写的基本都是贴图游戏,所谓贴图游戏也就是把图片一张一张画到窗体中(包括背景、敌人、障碍物),我在绘制的时候要用到双缓冲技术,简单说一下我对双缓冲的理解,我是按照视频上学来的方法,首先创建一张缓冲图片,然后将游戏所需要绘制的图片全部画到缓冲图片中,最后将缓冲图片画到窗体,这样做的目的是为了避免图片闪烁,因为这样每次都是将一张完整的图片绘制到窗体,如果不用这张缓冲图片,也就是将背景、敌人、障碍物等元素逐一绘制到窗体的话,由于不同元素绘制不是同时的(有先后顺序),所以会产生图片闪烁的现象,上一段代码:
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import javax.swing.JFrame;
-
- public class BaseFrame extends JFrame {
-
- /**
- * 构造函数
- */
- public BaseFrame() {
- this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
- this.setVisible(true); // 设置窗体可见
- }
-
- /**
- * 绘制方法
- */
- public void paint(Graphics gr) {
- BufferedImage image = new BufferedImage(500, 500,
- BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
- Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
-
- /*
- *
- * 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
- * g2.drawRect(50, 50, 100, 100);
- */
-
- g2.setColor(Color.WHITE); // 设置画笔颜色
- g2.drawRect(50, 50, 100, 100);
- g2.fillRect(200, 200, 100, 100);
-
- gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
- }
-
- public static void main(String[] args) {
- new BaseFrame();
- }
-
- }
这个差不多算是我编写游戏的基本架构,创建一个窗体,绘制一张缓冲图片到窗体,而且获取到了缓冲图片的画笔,这样你就可以用画笔画你需要的形状或是图片了。如果想让绘制的东西动起来,可以通过加入线程来实现,改变绘制物体的坐标,最重要一点不要忘记repaint;
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
-
- import javax.swing.JFrame;
-
- public class BaseFrame extends JFrame implements Runnable {
-
- /**
- * 绘制方块x坐标
- */
- private int x = 30;
-
- /**
- * 绘制方块y坐标
- */
- private int y = 30;
-
- /**
- * 构造函数
- */
- public BaseFrame() {
- this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
- this.setVisible(true); // 设置窗体可见
-
- Thread thread = new Thread(this); //创建线程
- thread.start(); //启动线程
- }
-
- /**
- * 绘制方法
- */
- public void paint(Graphics gr) {
- BufferedImage image = new BufferedImage(500, 500,
- BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
- Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
-
- /*
- *
- * 这里面就可以画东西了,而且时候到image缓冲图片上,想画什么查阅java API里的Graphics 例如
- * g2.drawRect(50, 50, 100, 100);
- */
-
- g2.setColor(Color.WHITE); // 设置画笔颜色
- g2.fillRect(x, y, 100, 100);
-
- gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
- }
-
- /**
- * 线程执行方法
- */
- public void run() {
- try {
- while (true) {
- x++;
- y++;
- if (x > 400 || y > 400) {
- x = 0;
- y = 0;
- }
- this.repaint();
- Thread.sleep(50); //while(true)的循环里一点要记得sleep一会,要不然太可怕了。。。
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- public static void main(String[] args) {
- new BaseFrame();
- }
-
- }
接下来,就是见证奇迹的时刻
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.event.KeyEvent;
- import java.awt.event.KeyListener;
- import java.awt.image.BufferedImage;
-
- import javax.swing.JFrame;
-
- public class BaseFrame extends JFrame implements Runnable, KeyListener {
-
- /**
- * 绘制方块x坐标
- */
- private int x = 200;
-
- /**
- * 绘制方块y坐标
- */
- private int y = 200;
-
- /**
- * 构造函数
- */
- public BaseFrame() {
- this.setBounds(100, 100, 500, 500); // 设置窗体的位置、大小
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体右上角那个叉关闭程序
- this.setVisible(true); // 设置窗体可见
-
- this.addKeyListener(this); // 添加键盘监听器
-
- Thread thread = new Thread(this); // 创建线程
- thread.start(); // 启动线程
- }
-
- /**
- * 绘制方法
- */
- public void paint(Graphics gr) {
- BufferedImage image = new BufferedImage(500, 500,
- BufferedImage.TYPE_3BYTE_BGR); // 创建一张500*500的缓冲图片
- Graphics g2 = image.getGraphics(); // 获取缓冲图片的画笔
-
- g2.setColor(Color.WHITE); // 设置画笔颜色
- g2.fillRect(x, y, 100, 100);
-
- gr.drawImage(image, 0, 0, this); // 将缓冲图片画到窗体上
- }
-
- /**
- * 线程执行方法
- */
- public void run() {
- try {
- while (true) {
- this.repaint();
- Thread.sleep(50);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 按下时调用
- */
- public void keyPressed(KeyEvent e) {
- int keyCode = e.getKeyCode();
- // System.out.println(keyCode); // 打印按键的keyCode
- if (keyCode == 38) { // 上按键
- y--;
- }
- if (keyCode == 40) { // 下按键
- y++;
- }
- if (keyCode == 37) { // 左按键
- x--;
- }
- if (keyCode == 39) { // 右按键
- x++;
- }
- }
-
- /**
- * 释放按键时调用
- */
- public void keyReleased(KeyEvent e) {
-
- }
-
- /**
- * 不解释
- */
- public void keyTyped(KeyEvent e) {
-
- }
-
- public static void main(String[] args) {
- new BaseFrame();
- }
-
- }
这个程序可以用上下左右按键控制方块移动了,运用这些知识基本可以搞定贪吃蛇、俄罗斯方块了,想再来复杂的可以学习一下鼠标监听器,祝你成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。