本節書摘來異步社群《java 2d遊戲程式設計入門》一書中的第8章,第8.4節,作者:【美】timothy wright(萊特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
位于javagames.prototype包中的prototypeasteroidfactory,包含了3個大的、3個中型的和3個小的小行星,它們都是使用編輯器并粘貼到代碼中設計的。給定一個位置,這3個方法生成一個随機數來選擇所傳回的小行星:
// prototypeasteroidfactory.java
private vector2f[] mirror( vector2f[] polygon ) {
vector2f[] mirror = new vector2f[ polygon.length ];
float x = rand.nextboolean() ? 1.0f : -1.0f;
float y = rand.nextboolean() ? 1.0f : -1.0f;
matrix3x3f mat = matrix3x3f.scale( x, y );
for( int i = 0; i < polygon.length; ++i ) {
mirror[i] = mat.mul( polygon[i] );
}
return mirror;
}<code>`</code>
就像在執行視口矩陣乘法的時候使用矩陣來翻轉y軸一樣,通過乘以-1來翻轉x或y軸的值,以縮放模型。
// randomasteroidexample.java
protected void render( graphics g ) {
super.render( g );
g.drawstring( "press esc to respawn", 20, 35 );
matrix3x3f view = getviewporttransform();
for( prototypeasteroid asteroid : asteroids ) {
asteroid.draw( (graphics2d)g, view );
}
randomasteroidexample代碼如下所示:
package javagames.prototype;
import java.awt.*;
import java.awt.event.keyevent;
import java.util.*;
import javagames.prototype.prototypeasteroid.size;
import javagames.util.*;
public class randomasteroidexample extends simpleframework {
private prototypeasteroidfactory factory;
private arraylist asteroids;
private random rand;
public randomasteroidexample() {
appborderscale = 0.9f;
appwidth = 640;
appheight = 640;
appmaintainratio = true;
appsleep = 1l;
apptitle = "random asteroids";
appbackground = color.white;
appfpscolor = color.black;
@override
protected void initialize() {
super.initialize();
rand = new random();
asteroids = new arraylist();
polygonwrapper wrapper =
new polygonwrapper( appworldwidth, appworldheight );
factory = new prototypeasteroidfactory( wrapper );
createasteroids();
private void createasteroids() {
asteroids.clear();
for( int i = 0; i < 42; ++i ) {
asteroids.add( getrandomasteroid() );
}
private prototypeasteroid getrandomasteroid() {
float x = rand.nextfloat() * 2.0f - 1.0f;
float y = rand.nextfloat() * 2.0f - 1.0f;
vector2f position = new vector2f( x, y );
size[] sizes = size.values();
size randomsize = sizes[ rand.nextint( sizes.length ) ];
switch( randomsize ) {
case small: return factory.createsmallasteroid( position );
case medium: return factory.createmediumasteroid( position );
case large:
default: return factory.createlargeasteroid( position );
protected void processinput( float delta ) {
super.processinput( delta );
if( keyboard.keydownonce( keyevent.vk_escape ) ) {
createasteroids();
protected void updateobjects( float delta ) {
super.updateobjects( delta );
for( prototypeasteroid asteroid : asteroids ) {
asteroid.update( delta );
protected void render( graphics g ) {
super.render( g );
g.drawstring( "press esc to respawn", 20, 35 );
matrix3x3f view = getviewporttransform();
asteroid.draw( (graphics2d)g, view );
public static void main( string[] args ) {
launchapp( new randomasteroidexample() );