package org.test;
import loon.LTransition;
import loon.Screen;
import loon.canvas.LColor;
import loon.event.GameTouch;
import loon.geom.RectBox;
import loon.opengl.GLEx;
import loon.opengl.LTexturePack;
import loon.utils.TArray;
import loon.utils.timer.LTimer;
import loon.utils.timer.LTimerContext;
public class LTexturePackTest extends Screen {
TArray<Move> moveList;
// 显示用精灵大小
final int show_size = 64;
// 实际精灵大小
final int really_size = 24;
LTexturePack imagePack;
/**
* 建立一个移动对象,用以管理LTexturePack中图像的移动
*/
public class Move {
RectBox rect = new RectBox(0, 0, show_size, show_size);
LTimer timer = new LTimer(150);
int id;
float x, y;
int action = 1;
int type = -1;
public Move(int id, int type, float x, float y) {
this.id = id;
this.type = type;
this.x = x;
this.y = y;
}
public void setX(float x) {
this.x = x;
rect.setX(x);
}
public void setY(float y) {
this.y = y;
rect.setY(y);
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public boolean intersects(Move m) {
return rect.intersects(m.rect);
}
public void update() {
if (timer.action(elapsedTime)) {
action++;
if (action > 4) {
action = 1;
}
}
}
}
@Override
public LTransition onTransition() {
return LTransition.newEmpty();
}
@Override
public void draw(GLEx g) {
if (isOnLoadComplete()) {
synchronized (moveList) {
// 当执行glBegin后,将在GLEx触发一个渲染批处理事件,仅在执行glEnd后提交
// 渲染内容到窗体。如果不调用此函数,则LTexturePack依旧可以执行,但是效率
// 可能会受到一定影响(每次渲染都单独提交)。
imagePack.glBegin();
for (Move o : moveList) {
switch (o.type) {
case 0:
imagePack.draw(o.id, o.x, o.y, show_size, show_size,
(o.action - 1) * really_size, 0, o.action
* really_size, really_size, 0,
LColor.yellow);
break;
case 1:
imagePack.draw(o.id, o.x, o.y, show_size, show_size,
o.action * really_size, 0, (o.action - 1)
* really_size, really_size, 0);
break;
}
o.update();
}
// 提交渲染结果到游戏画面
imagePack.glEnd();
}
}
}
@Override
public void onLoad() {
// 最先绘制用户画面
setFristOrder(DRAW_USER_PAINT());
// 不绘制精灵
setSecondOrder(null);
// 最后绘制桌面
setLastOrder(DRAW_DESKTOP_PAINT());
imagePack = new LTexturePack();
// 加载小图到LTexturePack
int heroImgId = imagePack.putImage("assets/h_a.png");
int enemyImgId = imagePack.putImage("assets/e_a.png");
// 宣布所有图像加载完毕(如果调用此函数,则释放所有已加载的资源,仅保留一块主纹理;如果不调用此函数,
// LTexturePack将允许动态增减图像,但是已加载的小图资源不会自动释放(可手动释放,或者dispose全部清空))
imagePack.packed();
// 构建一个Move集合,用以控制图像移动与显示
this.moveList = new TArray<Move>(10);
moveList.add(new Move(heroImgId, 0, 0, 32));
moveList.add(new Move(heroImgId, 0, 0, 136));
moveList.add(new Move(heroImgId, 0, 0, 220));
moveList.add(new Move(enemyImgId, 1, getWidth() - show_size, 32));
moveList.add(new Move(enemyImgId, 1, getWidth() - show_size, 136));
moveList.add(new Move(enemyImgId, 1, getWidth() - show_size, 220));
add(MultiScreenTest.getBackButton(this,0));
}
@Override
public void alter(LTimerContext timer) {
}
@Override
public void resize(int width, int height) {
}
@Override
public void touchDown(GameTouch e) {
}
@Override
public void touchUp(GameTouch e) {
}
@Override
public void touchMove(GameTouch e) {
}
@Override
public void touchDrag(GameTouch e) {
}
@Override
public void resume() {
}
@Override
public void pause() {
}
@Override
public void close() {
}
}