8.4 更新相应类(Updating Our Objects)
现在我们已经有了一个ObjectBuilder对象,时候更新Mallet类了因为我们不再把它画成一个点了。我们还需要增加新类Puck,在相同包下面新建类Puck,并添加如下代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/objects/Puck.java
private static final int POSITION_COMPONENT_COUNT = 3;
public final float radius, height;
private final VertexArray vertexArray;
private final List<DrawCommand> drawList;
public Puck(float radius, float height, int numPointsAroundPuck) {
GeneratedData generatedData = ObjectBuilder.createPuck(new Cylinder(
new Point(0f, 0f, 0f), radius, height), numPointsAroundPuck);
this.radius = radius;
this.height = height;
vertexArray = new VertexArray(generatedData.vertexData);
drawList = generatedData.drawList;
}
当我们创建Puck对象的时候,它会用vertextArray保存顶点数据用drawList保存绘制命令,添加如下代码以完成类定义:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/objects/Puck.java
public void bindData(ColorShaderProgram colorProgram) {
vertexArray.setVertexAttribPointer(0, colorProgram.getPositionAttributeLocation(),
POSITION_COMPONENT_COUNT, 0);
}
public void draw() {
for (DrawCommand drawCommand : drawList) {
drawCommand.draw();
}
第一个方法bindData()采用的模式与Table和Mallet一样:它把顶点数据绑定到着色器定义的属性上。第二个方法draw()则遍历由方法ObjectBuilder.createPuck()创建的绘制命令。
我们还需要更新Mallet类,用以下代码替换之前Mallet类中的所有代码:
//AirHockeyWithImprovedMallets/src/com/airhockey/android/objects/Mallet.java
private static final int POSITION_COMPONENT_COUNT = 3;
public final float radius;
public final float height;
private final VertexArray vertexArray;
private final List<DrawCommand> drawList;
public Mallet(float radius, float height, int numPointsAroundMallet) {
GeneratedData generatedData = ObjectBuilder.createMallet(new Point(0f,
0f, 0f), radius, height, numPointsAroundMallet);
this.radius = radius;
this.height = height;
vertexArray = new VertexArray(generatedData.vertexData);
drawList = generatedData.drawList;
}
public void bindData(ColorShaderProgram colorProgram) {
vertexArray.setVertexAttribPointer(0, colorProgram.getPositionAttributeLocation(),
POSITION_COMPONENT_COUNT, 0);
}
public void draw() {
for (DrawCommand drawCommand : drawList) {
drawCommand.draw();
}
}
这同样采用了与Puck类相同的模式。
下一节将更新着色器以方便绘制形体(点击进入下一节)