《Java 2D游戏编程入门》—— 8.3 创建一个原型编辑器

简介: 现在是时候创建一些多边形了。尽管有可能可以猜到每个点,但要创建9个小行星形状,手动进行的话,工作量还是很大的。就像大多数程序一样,我也很懒。编写一个编辑器来创建多边形,这样会容易很多。位于javagames.prototype包中的PrototypeEditor,如图8.9所示。

本节书摘来异步社区《Java 2D游戏编程入门》一书中的第8章,第8.3节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

8.3 创建一个原型编辑器

现在是时候创建一些多边形了。尽管有可能可以猜到每个点,但要创建9个小行星形状,手动进行的话,工作量还是很大的。就像大多数程序一样,我也很懒。编写一个编辑器来创建多边形,这样会容易很多。位于javagames.prototype包中的PrototypeEditor,如图8.9所示。

aaf35f3d18dcd86a660ad0191c7455599e65c81c

如果模型存储为文件,它们将在运行时加载。然而,做这些事情所需的代码还没有介绍过,因此,编辑器将会作弊。当按下空格键的时候,编辑器会产生出能够粘贴到其他源文件中的代码。本书的第二部分将会介绍使用真正的文件,因此,你不必为此而担心。

polygon列表保存了模型的点。mousePos是鼠标的当前位置,布尔变量closed所保存的值,确定了在绘制时多边形的最后一个点是否和第一个点相连。

processInput()方法处理编辑器的交互。当按下鼠标左键时,会给多边形添加一个点。鼠标中键用于切换closed变量。鼠标右键从多边形删除点。C键清除整个多边形,空格键打印出多边形代码。printPolygon()方法向控制台打印出当前的多边形,以便可以将其粘贴到一个文本文件中或复制到其他的代码文件中。打印到调试控制台的输出如下所示:

Vector2f[] v = new Vector2f[] {
  new Vector2f(-0.2895149f, 0.3865415f),
  new Vector2f(-0.47104853f, -0.28012514f),
  new Vector2f(-0.14241004f, 0.15805948f),
  new Vector2f(-0.13615024f, -0.30516434f),
  new Vector2f(0.28012514f, -0.2832551f),
  new Vector2f(0.17370892f, 0.21752739f),
  new Vector2f(-0.19248825f, 0.40219092f),
  new Vector2f(-0.18622851f, 0.25195616f),
  };```
render()方法显示常用的指令,并且绘制多边形以及轴线。drawAxisLines()方法在编辑器中绘制两条线,表示x轴和y轴。

drawPolygon()方法负责渲染当前模型。如果多边形只是一个点,那么,绘制单个的点。接下来,如果多边形有多个点,那么所有的点(除了最后一个点以外)都绘制。如果多边形是闭合的,那么,最后一个点连接到第一个点。如果多边形不是闭合的,那么,从最后一个点到当前鼠标位置绘制一条线。drawPoint()和drawLine()方法都是标准版本。

package javagames.prototype;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javagames.util.*;

public class PrototypeEditor extends SimpleFramework {
  private ArrayList polygon;
  private Vector2f mousePos;
  private boolean closed;
  public PrototypeEditor() {
    appTitle = "Prototype Editor 1.0";
    appWidth = 640;
    appHeight = 640;
    appBackground = Color.WHITE;
    appFPSColor = Color.BLACK;
  }
  protected void initialize() {
    super.initialize();
    polygon = new ArrayList();
  }
  protected void processInput( float delta ) {
    super.processInput( delta );
    mousePos = getWorldMousePosition();
    if( mouse.buttonDownOnce( MouseEvent.BUTTON1 ) ) {
      polygon.add( mousePos );
    }
    if( mouse.buttonDownOnce( MouseEvent.BUTTON2 ) ) {
      closed = !closed;
    }
    if( mouse.buttonDownOnce( MouseEvent.BUTTON3 ) ) {
      if( !polygon.isEmpty() ) {
        polygon.remove( polygon.size() - 1 );
      }
    }
    if( keyboard.keyDownOnce( KeyEvent.VK_C ) ) {
      polygon.clear();
    }
    if( keyboard.keyDownOnce( KeyEvent.VK_SPACE ) ) {
      printPolygon();
    }
  }
  private void printPolygon() {
    System.out.println( "Vector2f[] v = new Vector2f[] { " };
    for( Vector2f v : polygon ) {
      System.out.print( " new Vector2f(" );
      System.out.print( v.x + "f, " );
      System.out.print( v.y + "f)" );
      System.out.println( "," );
    }
    System.out.println( ");" );
  }
  protected void render( Graphics g ) {
    super.render( g );
    g.drawString( "Close Polygon: " + closed, 20, 35 );
    g.drawString( "Left Mouse: Add point", 20, 50 );
    g.drawString( "Right Mouse: Remove point", 20, 65 );
    g.drawString( "Center Mouse: Toggle Close", 20, 80 );
    g.drawString( "C: Clear Polygon", 20, 95 );
    g.drawString( "Space Bar: Print Polygon", 20, 110 );
    drawAxisLines( g );
    drawPolygon( g );
  }
  private void drawAxisLines( Graphics g ) {
    g.setColor( Color. BLUE );
    Vector2f left = new Vector2f( appWorldWidth / 2.0f, 0.0f );
    Vector2f right = new Vector2f( -left.x, 0.0f );
    drawLine( g, left, right );
    Vector2f top = new Vector2f( 0.0f, appWorldHeight / 2.0f );
    Vector2f bottom = new Vector2f( 0.0f, -top.y );
    drawLine( g, top, bottom );
  }
  private void drawPolygon( Graphics g ) {
    g.setColor( Color.BLACK );
    if( polygon.size() == 1 ) {
      drawPoint( g, polygon.get( 0 ) );
    }
    for( int i = 0; i < polygon.size() - 1; ++i ) {
      drawLine( g, polygon.get(i), polygon.get( i+1 ) );
    }
    if( closed && polygon.size() > 1 ) {
      Vector2f P = polygon.get( polygon.size() - 1 );
      Vector2f S = polygon.get( 0 );
      drawLine( g, S, P );
    }
    if( !(polygon.isEmpty() || closed) ) {
      Vector2f P = polygon.get( polygon.size() - 1 );
      Vector2f S = mousePos;
      drawLine( g, S, P );
    }
  }
  private void drawPoint( Graphics g, Vector2f v ) {
    Matrix3x3f view = getViewportTransform();
    Vector2f s = view.mul( v );
    g.drawRect( (int)s.x, (int)s.y, 1, 1 );
  }
  private void drawLine( Graphics g, Vector2f v0, Vector2f v1 ) {
    Matrix3x3f view = getViewportTransform();
    Vector2f S = view.mul( v0 );
    Vector2f P = view.mul( v1 );
    g.drawLine( (int)S.x, (int)S.y, (int)P.x, (int)P.y );
  }
  public static void main( String[] args ) {
    launchApp( new PrototypeEditor() );
  }
}`

相关文章
|
4天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
19 3
|
2天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
13 4
|
21天前
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
38 1
java制作游戏,如何使用libgdx,入门级别教学
|
2天前
|
SQL IDE Java
入门Cloud Toolkit:简化你的Java应用开发与部署流程
【10月更文挑战第19天】作为一名长期从事Java开发的程序员,我一直致力于寻找能够简化日常开发工作的工具。在众多工具中,阿里巴巴推出的Cloud Toolkit引起了我的注意。这款免费的插件旨在帮助开发者更轻松地进行开发、测试及部署工作,尤其是在与云服务交互时表现尤为出色。本文将从个人的角度出发,介绍Cloud Toolkit的基本功能及其使用技巧,希望能帮助初学者快速上手这款实用工具。
10 1
|
12天前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
15 2
|
12天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
14 2
|
2月前
|
Java 程序员 UED
Java中的异常处理:从入门到精通
【9月更文挑战第23天】在Java编程的世界中,异常是程序执行过程中不可避免的事件,它们可能会中断正常的流程并导致程序崩溃。本文将通过浅显易懂的方式,引导你理解Java异常处理的基本概念和高级技巧,帮助你编写更健壮、更可靠的代码。我们将一起探索如何捕获和处理异常,以及如何使用自定义异常来增强程序的逻辑和用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和实用的技巧。
39 4
|
3月前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
2月前
|
Java 程序员
Java中的异常处理:从入门到精通
在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
|
3月前
|
Java 程序员 UED
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。