`
沙舟狼客
  • 浏览: 160437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jogl入门之简单的贪吃蛇

阅读更多

1、代码:

 

package org.ligson.jogl.test;

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.swing.JFrame;

import org.ligson.jogl.test.SnakeDemo.Dir;
/*
 * 事物只有一个
 */
public class SnakeDemo extends JFrame implements GLEventListener, Runnable,
		KeyListener {

	//产生食物随机坐标
	Random random = new Random();

	//枚举方向
	enum Dir {
		UP(1), DOWN(2), LEFT(3), RIGHT(4);
		final int d;

		private Dir(int d) {
			this.d = d;
		}

		public int getDir() {
			return this.d;
		}
	}

	//速度
	float speed = 10.0f;
	//长度
	int len = 5;

	// gl库的handler,相当于画笔
	GL gl;
	// 画布
	GLCanvas canvas;
	// 指定了一套OpenGL的功能:渲染内容必须支持,如色彩深度,以及立体是否已启用。
	GLCapabilities capabilities;

	Thread thread = new Thread(this);

	
	//蛇集合
	List<Snake> snakes = new ArrayList<Snake>();
	//食物集合
	List<Food> foods = new ArrayList<Food>();

	public SnakeDemo() {
		super("Demo4");
		this.setSize(500, 500);
		//屏幕中心
		this.setLocationRelativeTo(null);
		this.setResizable(false);

		capabilities = new GLCapabilities();
		canvas = new GLCanvas(capabilities);

		canvas.addGLEventListener(this);

		this.addKeyListener(this);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		this.add(canvas, BorderLayout.CENTER);

		thread.start();
	}

	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			canvas.display();
			//检查撞击
			checkHit();
		}
	}

	@Override
	public void display(GLAutoDrawable drawable) {
		gl.glClear(GL.GL_COLOR_BUFFER_BIT);
		gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
		gl.glEnable(GL.GL_DEPTH_TEST);
		gl.glColor3f(1.0f, 0.0f, 0.0f);

		painSnakes();
		painFoods();

		gl.glFlush();
	}

	@Override
	public void displayChanged(GLAutoDrawable drawable, boolean arg1,
			boolean arg2) {

	}

	@Override
	public void init(GLAutoDrawable drawable) {
		gl = drawable.getGL();
		gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);

		gl.glShadeModel(GL.GL_FLAT);
		gl.glFrontFace(GL.GL_CW);

		//初始化蛇
		for (int i = 0; i < len; i++) {
			Snake snake = new Snake(10.0f, 10.0f, 0.0f, i * 10.0f, Dir.UP);
			snakes.add(snake);
		}
		//初始化食物
		Food food = new Food(10.0f, 10.0f, random.nextInt(250),
				random.nextInt(250));
		foods.add(food);
	}

	@Override
	public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
		if (h == 0) {
			h = 1;
		}

		int windowWidth;
		int windowHeight;

		gl.glViewport(0, 0, w, h);
		gl.glMatrixMode(GL.GL_PROJECTION);
		gl.glLoadIdentity();

		if (w <= h) {
			windowWidth = 250;
			windowHeight = 250 * h / w;
		} else {
			windowWidth = 250 * w / h;
			windowHeight = 250;
		}
		//重新定义世界坐标系,以窗口中心为(0,0,0)
		gl.glOrtho(0 - windowWidth, windowWidth, 0 - windowHeight,
				windowHeight, 250.0f, -250.0f);
		gl.glMatrixMode(GL.GL_MODELVIEW);
		gl.glLoadIdentity();

	}

	public static void main(String[] args) {
		SnakeDemo demo = new SnakeDemo();
		demo.setVisible(true);
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}

	@Override
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		switch (key) {
		case KeyEvent.VK_UP:
			//防止向相反方向走
			if (snakes.get(0).getDir() != Dir.DOWN) {
				snakes.get(0).setDir(Dir.UP);
			}
			break;
		case KeyEvent.VK_DOWN:
			if (snakes.get(0).getDir() != Dir.UP) {
				snakes.get(0).setDir(Dir.DOWN);
			}
			break;
		case KeyEvent.VK_LEFT:
			if (snakes.get(0).getDir() != Dir.RIGHT) {
				snakes.get(0).setDir(Dir.LEFT);
			}
			break;

		case KeyEvent.VK_RIGHT:
			if (snakes.get(0).getDir() != Dir.LEFT) {
				snakes.get(0).setDir(Dir.RIGHT);
			}
			break;
		case KeyEvent.VK_EQUALS:
			len++;
			break;
		case KeyEvent.VK_MINUS:
			len--;
			if (len < 1) {
				len = 1;
			}
			break;
		default:
			break;
		}

	}

	@Override
	public void keyReleased(KeyEvent e) {

	}

	private void painSnakes() {
		int abs = len - snakes.size();
		if (abs > 0) {
			for (int i = 0; i < abs; i++) {
				Snake lastSnake = snakes.get(snakes.size() - 1);
				Snake newSnake = new Snake(10.0f, 10.0f, lastSnake.getX() + 10,
						lastSnake.getY() + 10, lastSnake.getDir());
				snakes.add(newSnake);
			}
		} else if (abs < 0) {
			for (int i = 0; i < -abs; i++) {
				snakes.remove(snakes.size() - 1);
			}
		}

		for (int i = snakes.size() - 1; i >= 1; i--) {

			Snake tmpSnake = snakes.get(i);
			Snake prevSnake = snakes.get(i - 1);
			tmpSnake.setX(prevSnake.getX());
			tmpSnake.setY(prevSnake.getY());
			tmpSnake.setDir(prevSnake.getDir());

		}

		Snake snake = snakes.get(0);
		int h = getContentPane().getHeight();
		int w = getContentPane().getWidth();

		switch (snake.getDir().getDir()) {
		case 1:
			if ((snake.getY() + speed - 10.0f) > (h / 2.0)) {
				snake.setY(-250.0f);
			} else {
				snake.setY(snake.getY() + speed);
			}

			break;
		case 2:
			if ((snake.getY() + speed + snake.getHeight()) < -(h / 2.0)) {
				snake.setY(250.0f);
			} else {
				snake.setY(snake.getY() - speed);
			}

			break;
		case 3:
			if ((snake.getX() + speed + snake.getWidth()) < -(w / 2.0)) {
				snake.setX(250.0f);
			} else {
				snake.setX(snake.getX() - speed);
			}
			break;
		case 4:
			if ((snake.getX() + speed - 10.0f) > (w / 2.0)) {
				snake.setX(-250.0f);
			} else {
				snake.setX(snake.getX() + speed);
			}
			break;
		}
		snakes.set(0, snake);

		for (Snake snake2 : snakes) {
			snake2.pain(gl);
		}
	}

	private void painFoods() {
		if (foods.size() == 0) {
			Food food = new Food(10.0f, 10.0f, random.nextInt(250),
					random.nextInt(250));
			foods.add(food);
		}

		for (Food food : foods) {
			food.pain(gl);
		}
	}

	private void checkHit() {
		for (Snake snake : snakes) {
			for (Food food : foods) {
				if (Math.abs(snake.getX() - food.getX()) < 10.0f
						&& Math.abs(snake.getY() - food.getY()) < 10.0f) {
					len++;
					foods.remove(food);
					break;
				}
			}
		}
	}
}

class Food {
	private float width = 10.0f;
	private float height = 10.0f;
	private float x = 0.0f;
	private float y = 0.0f;

	public Food(float width, float height, float x, float y) {
		super();
		this.width = width;
		this.height = height;
		this.x = x;
		this.y = y;
	}

	public float getWidth() {
		return width;
	}

	public void setWidth(float width) {
		this.width = width;
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public float getX() {
		return x;
	}

	public void setX(float x) {
		this.x = x;
	}

	public float getY() {
		return y;
	}

	public void setY(float y) {
		this.y = y;
	}

	public void pain(GL gl) {
		gl.glBegin(GL.GL_QUADS);
		gl.glVertex3f(this.x, this.y, 0.0f);
		gl.glVertex3f(this.x, this.y + height, 0.0f);
		gl.glVertex3f(this.x + width, this.y + height, 0.0f);
		gl.glVertex3f(this.x + width, this.y, 0.0f);
		gl.glEnd();
	}

}

class Snake {
	private float width = 10.0f;
	private float height = 10.0f;
	private float x = 0.0f;
	private float y = 0.0f;
	private Dir dir = Dir.UP;

	private Random random = new Random();

	public Snake(float width, float height, float x, float y, Dir dir) {
		super();
		this.width = width;
		this.height = height;
		this.x = x;
		this.y = y;
		this.dir = dir;
	}

	public float getWidth() {
		return width;
	}

	public void setWidth(float width) {
		this.width = width;
	}

	public float getHeight() {
		return height;
	}

	public void setHeight(float height) {
		this.height = height;
	}

	public float getX() {
		return x;
	}

	public void setX(float x) {
		this.x = x;
	}

	public float getY() {
		return y;
	}

	public void setY(float y) {
		this.y = y;
	}

	public Dir getDir() {
		return dir;
	}

	public void setDir(Dir dir) {
		this.dir = dir;
	}

	public float[] getPoints() {
		return null;
	}

	public void pain(GL gl) {
		gl.glColor3f(random.nextFloat(), random.nextFloat(), random.nextFloat());
		gl.glBegin(GL.GL_QUADS);
		gl.glVertex3f(this.x, this.y, 0.0f);
		gl.glVertex3f(this.x, this.y + height, 0.0f);
		gl.glVertex3f(this.x + width, this.y + height, 0.0f);
		gl.glVertex3f(this.x + width, this.y, 0.0f);
		gl.glEnd();
	}

	public String toString() {
		return "X:" + this.x + ";Y:" + this.y;

	}
}
 

2、jogl需要的库

http://ligson.iteye.com/blog/1331528

0
0
分享到:
评论

相关推荐

    jogl简介,jogl入门例子

    以下是一个简单的Jogl入门例子,展示如何创建一个基本的OpenGL窗口并绘制一个红色的立方体: 1. 首先,导入必要的Jogl库: ```java import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLAutoDrawable; ...

    JOGL入门教程,入门代码例子

    这个是我刚刚学JOGL的时候找到的一份资料,很适合JOGL的初学者,内容是E文的,但都是通俗易懂的,只要一点点英语基础就可以理解,现在JOGL的资料很少,希望对想学而又找不到资料的朋友有点帮助

    jogl简单入门例子,15个例子,JOGL1.0,2.0的jar包

    标题提到的"jogl简单入门例子"是针对初学者的一系列教程或示例代码,帮助快速理解和上手JOGL。这些例子可能涵盖了JOGL的基本概念、对象创建、渲染流程、纹理映射、变换操作、光照处理等方面,通过实践来巩固理论知识...

    JOGL入门例子(八)---画机器人:活用长方体

    总之,这个JOGL入门例子展示了如何使用Java和OpenGL结合来创建一个简单的3D机器人模型。通过学习这个例子,你将掌握JOGL的基础知识,包括坐标系统、几何形状的绘制、变换操作以及深度测试,这些都是进行3D图形编程的...

    jogl入门

    在入门JOGL时,首先需要了解的关键知识点包括: 1. **环境配置**:使用JOGL需要安装特定的JAR包和DLL库。这些库包含了与操作系统交互的本地代码,确保OpenGL调用能正确地被底层图形硬件处理。在描述中提到的博文中...

    JAVA的OPENGL,JOGL入门例子(五)----充满能量的立体三维螺旋体

    在本篇博客“JAVA的OPENGL,JOGL入门例子(五)----充满能量的立体三维螺旋体”中,我们将探讨如何使用Java与OpenGL图形库JOGL(Java Bindings for OpenGL)来创建动态的3D图形。OpenGL是一个强大的跨平台图形库,而...

    JAVA的OPENGL,JOGL入门例子(四)----富视觉的螺旋体

    在本篇关于JAVA的OpenGL(JOGL)入门教程的第四部分中,我们将探索如何创建一个具有丰富视觉效果的螺旋体。OpenGL是一个强大的图形库,它允许程序员直接与GPU交互,生成高质量的2D和3D图形。JOGL是Java语言对OpenGL...

    nehe的jogl与其他jogl教程20121102

    【标题】"nehe的jogl与其他jogl教程20121102" 提供了一套关于Java实现OpenGL图形编程的资源,主要聚焦在JOGL(Java Bindings for OpenGL)框架上。JOGL是Java平台上的一个开源库,它允许开发者使用Java语言直接访问...

    jogl 2.3.2 linux amd64

    标题“jogl 2.3.2 linux amd64”涉及的是Java OpenGL(JOGL)的一个特定版本,针对Linux操作系统且适用于AMD64(也称为x86_64)架构。JOGL是一个Java绑定库,它允许Java程序员直接使用OpenGL图形库进行高性能的3D...

    jogl-2.1开发相关文件

    《Jogl-2.1开发相关文件详解》 在计算机图形学领域,OpenGL是一个广泛使用的图形库,用于渲染2D和3D图像。...记得根据你的系统配置选择正确的库文件,结合源码和文档,你就能开始你的Jogl图形编程之旅了。

    64位jogl包

    标题 "64位jogl包" 提供的信息表明,这是一个专为64位操作系统设计的Java OpenGL绑定库。JOGL,全称为Java Bindings for OpenGL,是Java平台上的一个开源项目,它允许Java开发者直接使用OpenGL标准来创建高性能的...

    jogl 教程4合1 Java

    这四个PDF文件——jogl2.pdf、jogl3.pdf、jogl1v4.pdf、jogl4.pdf,可能分别对应JOGL的不同版本或不同主题的学习资源,帮助学习者全面了解JOGL的不同方面。 描述中的“英文版的jogl 4合1教程”意味着这些教程是用...

    JOGL2.0之MYeclipse配置.doc

    ### JOGL 2.0 在 MyEclipse 中的配置指南 #### 一、前言 JOGL(Java Binding for OpenGL)是一种允许Java程序通过OpenGL API...通过以上步骤,您可以成功地在MyEclipse中配置好JOGL 2.0,并开始您的OpenGL编程之旅。

    JOGL显示列表例子

    在JOGL入门例子(十四)中,我们可能会学习如何创建、使用和管理显示列表。这通常包括以下步骤: 1. **创建显示列表**:使用`glNewList()`函数指定列表的标识符,并设定开始定义列表的标志。 2. **定义列表**:在这...

    JOGL学习PDF2

    ### JOGL2:《Touring the World》游戏开发与技术解析 #### 一、概述 在探讨《JOGL学习PDF2》中所提及的“JOGL2:Touring the World”这一主题时,我们深入剖析了Java编程环境下的OpenGL(JOGL)应用,通过构建一...

    jogl api,来自官方详细资料

    **Jogl API 深入解析** Jogl (Java OpenGL) 是一个用于Java平台的OpenGL绑定库,它允许Java开发者利用OpenGL的强大功能进行图形处理和3D渲染。OpenGL是一种跨语言、跨平台的编程接口,主要用于渲染2D、3D矢量图形。...

    Java程序中的OpenGL(JOGL学习教程)

    我们将使用 JOGL 创建一个简单的矩形绘制程序。 ```java package fuhao; import javax.swing.JFrame; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLAutoDrawable; import ...

Global site tag (gtag.js) - Google Analytics