/** * Copyright 2008 - 2011 * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loonframework * @author chenpeng * @email:ceponline@yahoo.com.cn * @version 0.3.3 */ package loon.srpg.effect; import loon.LSystem; import loon.opengl.GLEx; import loon.utils.MathUtils; public class TriangleEffect { private int height; private float[][] delta; private float[] pos; private float[] move; private float[] avg; private float vector; private float v_speed; public TriangleEffect(float[][] res, float ad1[], float x, float y, float speed) { this(res, x, y, speed); this.setAverage(ad1); } public TriangleEffect(float[][] res, float x, float y, float speed) { this.setDelta(res); this.v_speed = speed; this.pos = new float[2]; this.move = new float[2]; this.move[0] = x; this.move[1] = y; this.resetAverage(); this.height = LSystem.viewSize.getHeight(); } public void setDelta(float[][] res) { this.delta = res; } public float[][] getDelta() { return delta; } public void setAverage(float[] res) { this.avg = res; } public void resetAverage() { this.avg = new float[2]; for (int j = 0; j < delta.length; j++) { for (int i = 0; i < avg.length; i++) { avg[i] += delta[j][i]; } } for (int i = 0; i < avg.length; i++) { avg[i] /= 3D; } } public void setPosX(float x) { this.pos[0] = x; } public void setPosY(float y) { this.pos[1] = y; } public void setPos(float x, float y) { this.setPosX(x); this.setPosY(y); } public float getPosX() { return pos[0]; } public float getPosY() { return pos[1]; } public void setVector(float v) { this.vector = v; } public void setVectorSpeed(float v) { this.v_speed = v; } public void setMoveX(float x) { this.move[0] = x; } public void setMoveY(float y) { this.move[1] = y; } public void setMove(int x, int y) { setMoveX(x); setMoveY(y); } public void next() { pos[0] += move[0]; pos[1] += move[1]; vector += v_speed; vector %= 360f; if (vector < 0.0f) { vector += 360f; } } public float[][] drawing(float x, float y) { float[][] location = new float[3][2]; for (int i = 0; i < delta.length; i++) { float d = getLine(delta[i][0] - avg[0], delta[i][1] - avg[1]); float d1 = getDegrees(delta[i][0] - avg[0], delta[i][1] - avg[1]); float d2 = MathUtils.cos(MathUtils.toRadians(vector + d1)) * d + avg[0] + pos[0] + x; float d3 = MathUtils.sin(MathUtils.toRadians(vector + d1)) * d + avg[1] + pos[1] + y; location[i][0] = (d2 + 0.5f); location[i][1] = (d3 + 0.5f); } return location; } public void draw(GLEx g) { draw(g, 0, 0); } public void draw(GLEx g, float x, float y) { next(); float[][] res = drawing(x, y); for (int i = 0; i < res.length; i++) { int index = (i + 1) % 3; g.drawLine(res[i][0], height - res[i][1], res[index][0], height - res[index][1]); } } public void drawPaint(GLEx g, float x, float y) { next(); float[][] res = drawing(x, y); float xs[] = new float[3]; float ys[] = new float[3]; final int size = res.length; for (int i = 0; i < size; i++) { xs[i] = res[i][0]; ys[i] = height - res[i][1]; } g.fillPolygon(xs, ys, 3); } private float getLine(float x, float y) { return MathUtils.sqrt(MathUtils.pow(MathUtils.abs(x), 2f) + MathUtils.pow(MathUtils.abs(y), 2f)); } public static float getDegrees(float r1, float r2) { if (r1 == 0.0f && r2 == 0.0f) { return 0.0f; } float d2 = MathUtils .sqrt(MathUtils.pow(r1, 2f) + MathUtils.pow(r2, 2f)); float d3 = MathUtils.toDegrees(MathUtils.acos(r1 / d2)); if (MathUtils.asin(r2 / d2) < 0.0f) { return 360f - d3; } else { return d3; } } }