看到最近基于java的游戏文章不少,写一段关于java游戏编程的基本知识。很多内容参考自David Brackeen 个人网址,作为笔记。今日开第一题,日后慢慢更新。有不得当的地方还请多包涵,我会努力改进。
首先说说java游戏编程的基础。 这次总结是基于awt swing java2D这些知识。废话不多说,先来第一部分。
1.全屏图形。
显示的硬件分 显卡和显示器。显卡的内存将存储屏幕上的内容,并且将内存中的内容在显示器上显示。显示器的屏幕用像素表示。一般是800*600/1280*1024之类。
另外还有位深度的概念。比如8,16,24,32位。
8是2的八次方 =216中颜色,以此类推。越小越快。
将显示转换为全屏
Jframe,模拟屏幕或说画布等
DisplayMode,指定显示切换到什么样的分辨率,位深度刷新率。
GraphicsDevice,改变现实方式和检查显示属性靠它。
GraphicsEnvironment,获得GraphicsDevice。
首先来一个屏幕管理类
package com.jsheng.game.util;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Window;
import javax.swing.JFrame;
/** function:
* company: jsheng
* @author wanghn [email protected]
* describe:
*/
public class MyScreenMgr {
private GraphicsDevice device;
public MyScreenMgr() {
GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
device = environment.getDefaultScreenDevice();
}
public void setFullScreen(DisplayMode displayMode,JFrame window){
window.setUndecorated(true);
window.setResizable(false);
device.setFullScreenWindow(window);
if (displayMode != null && device.isDisplayChangeSupported())
{
try {
device.setDisplayMode(displayMode);
}
catch (IllegalArgumentException ex) {
//处理
}
}
}
public Window getFullScreenWindow() {
return device.getFullScreenWindow();
}
public void reScreen() {
Window window = device.getFullScreenWindow();
if (window != null) {
window.dispose();
}
device.setFullScreenWindow(null);
}
}
接下来是测试
package com.jsheng.game.test1;
import java.awt.*;
import javax.swing.JFrame;
import com.jsheng.game.util.MyScreenMgr;
/** function:
* company: jsheng
* @author wanghn [email protected]
*/
public class FullScreenTest extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
DisplayMode displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
FullScreenTest test = new FullScreenTest();
test.run(displayMode);
}
public void run(DisplayMode displayMode) {
setBackground(Color.black);
setForeground(Color.white);
setFont(new Font("Dialog", 0, 24));
MyScreenMgr screen = new MyScreenMgr();
try {
screen.setFullScreen(displayMode, this);
Thread.sleep(4000);
}catch (InterruptedException ex) { }
finally {
screen.reScreen();
}
}
public void paint(Graphics g) {
if(g instanceof Graphics2D){
Graphics2D g1 = (Graphics2D) g;
g1.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
g.drawString("欢迎访问J盛科技!我的qq6668220", 20, 50);
}
}
window.setUndecorated(true); 删除边框和标题栏。
g1.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
这两句抗齿边文本,是文本的边缘模糊化,没有齿边。
这样一个全屏幕的demo就出来了。
2.添加图像。
package com.jsheng.game.test1;
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import com.jsheng.game.util.MyScreenMgr;
/** function:
* company: jsheng
* @author wanghn [email protected]
*/
public class FullScreenTest2 extends JFrame {
private static final long serialVersionUID = 1L;
private Image bgImage;
private Image myImage;
private Image myImage2;
private boolean flag;
public static void main(String[] args) {
DisplayMode displayMode = new DisplayMode(800, 600, 16,
DisplayMode.REFRESH_RATE_UNKNOWN);
FullScreenTest2 test = new FullScreenTest2();
test.run(displayMode);
}
public void loadImages() {
bgImage = loadImage("images/Blue hills.jpg");
myImage = loadImage("images/a1.jpg");
myImage2 = loadImage("images/a2.jpg");
flag = true;
repaint();
}
private Image loadImage(String fileName) {
return new ImageIcon(fileName).getImage();
}
public void run(DisplayMode displayMode) {
setBackground(Color.black);
setForeground(Color.white);
setFont(new Font("Dialog", 0, 24));
MyScreenMgr screen = new MyScreenMgr();
try {
screen.setFullScreen(displayMode, this);
loadImages();
Thread.sleep(4000);
}catch (InterruptedException ex) { }
finally {
screen.reScreen();
}
}
public void paint(Graphics g) {
if(g instanceof Graphics2D){
Graphics2D g1 = (Graphics2D) g;
g1.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (flag) {
g1.drawImage(bgImage, 0, 0, null);
g1.drawImage(myImage, 100, 0, null);
g1.drawImage(myImage2, 305, 0, null);
g1.drawString("欢迎访问J盛科技!我的qq6668220", 200, 500);
}
else {
g.drawString("正在读取图片", 5, 24);
}
}
}
}