所以,我们需要把游戏部件初始化的部分隔离出来,好让这项工作能够进行。请修改 initGL 方法,并添加一个 initPieces 方法,如清单 21 所示。
清单 21. 初始化游戏部件
...
GLU.gluQuadricNormals(Bug.QUADRIC, GLU.GLU_SMOOTH);
GL.glEnable(GL.GL_TEXTURE_2D);
initPieces();
}
public void initPieces(){
this.gun = new Gun(0, 0, 12);
bugCount = \
ShootoutView.viewer.getTable().getItemCount();
this.bugs = new Bug[bugCount];
float tx = -Bug.RADIUS*bugCount;
for (int i = 0; i < this.bugs.length; i++){
this.bugs[i] = new Bug(COLOR[i % \
COLOR.length], tx, 0, -8);
tx += 2*Bug.RADIUS;
}
pow = new Pow();
bullets = new Bullet[25];
for(int i = 0; i < bullets.length; i++)
bullets[i] = new Bullet(this, .2f, -.2f, 9.5f);
}
我们采用了来自 initGL 方法的原始代码,创建了一个新方法 initPieces,然后把代码放在这个方法内。现在可以重新初始化游戏设置,供玩游戏使用。
创建Eclipse游戏插件,第3部分: 启动游戏(10)
时间:2011-02-10 IBM Tyler Anderson
释放部件
就像对部件初始化所做的那样,对释放部件也要做同样的事。请修改 dispose 方法,添加一个 disposePieces 方法,如清单 22 所示。
清单 22. 释放部件
public void disposePieces() {
this.gun.dispose();
for(int i = 0; i < bugs.length; i++)
bugs[i].dispose();
for(int i = 0; i < bullets.length; i++)
bullets[i].dispose();
pow.dispose();
}
public void dispose() {
GLU.gluDeleteQuadric(Gun.QUADRIC);
GLU.gluDeleteQuadric(Bullet.QUADRIC);
GLU.gluDeleteQuadric(Bug.QUADRIC);
disposePieces();
super.dispose();
}
我们只是删除了现有的释放代码,并把它们移动到 disposePieces 方法中。
重新开始游戏
现在添加了处理旧部件和初始化新部件的功能,可以在 ShootoutView 类中添加合适的功能了。请修改 ShootoutView 类中的以下代码段,如清单 23 所示。
清单 23. 重新开始游戏
...
startGameButton.setText("(Re)start Game");
startGameButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
...
if(!ShootoutView.this.sceneRunning){
...
ShootoutView.this.sceneRunning = true;
}
else{
ShootoutView.this.scene.disposePieces();
ShootoutView.this.scene.initPieces();
}
}
...
如果布景已经启动运行,就需要重新初始化它,如 else 语句中的代码所示。这就行了!现在,只要杀死了所有虫子,就可以点击 “(Re)start Game” 按钮让它们全复活。下面简要总结一下如何才能让这个游戏与众不同。
要考虑的事情
OpenGL 是个强大的图形编程 API,在编程时还有多个选项可用。例如,可以利用它的 2 维特性,创建平面 2 维游戏,就像老式的 Atari 游戏做的那样。
正如 |