天天看點

《Java 2D遊戲程式設計入門》—— 8.4 用原型小行星工廠生産小行星

本節書摘來異步社群《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 &lt; 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() );