Archived
0

refactor(textured-object) Создание общего интерфейса TexturedObject

This commit is contained in:
2013-10-31 00:58:00 +04:00
parent 58e3a123f3
commit d4dd335772
4 changed files with 164 additions and 399 deletions

View File

@@ -8,8 +8,7 @@ import org.lwjgl.opengl.GL11;
import ru.dmitriymx.game.mw.Prometheus; import ru.dmitriymx.game.mw.Prometheus;
public class Main { public class Main {
//private Foxy foxy; private Prometheus mech;
private Prometheus mech;
private void init_display(int width, int height){ private void init_display(int width, int height){
try { try {
@@ -36,31 +35,18 @@ public class Main {
} }
private void render(){ private void render(){
while(Keyboard.next()){ if(Keyboard.isKeyDown(Keyboard.KEY_LEFT)){
if(Keyboard.getEventKey() == Keyboard.KEY_LEFT){ mech.move(-mech.getSpeed(), 0);
if(Keyboard.getEventKeyState()){ mech.setRun(true);
mech.setState(1); }
mech.setRigthRun(true); else if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT)){
} else { mech.move(mech.getSpeed(), 0);
mech.setState(0); mech.setRun(true);
} }
} else if (Keyboard.getEventKey() == Keyboard.KEY_RIGHT){ else {
if(Keyboard.getEventKeyState()){ mech.setRun(false);
mech.setState(1); }
mech.setRigthRun(false);
} else {
mech.setState(0);
}
}
}
if(mech.getState() == 1){
if(mech.getRigthRun()){
mech.setX(mech.getX() - mech.getSpeed());
} else {
mech.setX(mech.getX() + mech.getSpeed());
}
}
mech.render(); mech.render();
} }
@@ -68,8 +54,8 @@ public class Main {
init_display(width, height); init_display(width, height);
init_opengl(width, height); init_opengl(width, height);
mech = new Prometheus(); mech = new Prometheus();
mech.setY(Display.getHeight() - (mech.getHeight()*4)); mech.setY(Display.getHeight() - mech.getHeight());
while(!Display.isCloseRequested()){ while(!Display.isCloseRequested()){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

View File

@@ -5,298 +5,181 @@ import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import ru.dmitriymx.game.engine.Sprite; import ru.dmitriymx.game.engine.Sprite;
public class Prometheus { public class Prometheus implements TexturedObject {
public static int K = 4;
private final double _180_DIV_PI = 180/Math.PI;
private final int WIDTH, HEIGHT;
private final int SPEED = 2 * K;
private int x, y = 0;
private Sprite body, gun; private Sprite body, gun;
private int x, y; private boolean sprite_inverse = false;
private int width, height; private boolean is_run = false;
private int state; private boolean run_left = false;
private boolean inverse = false;
private final int K = 4;
private final int speed = 2 * K;
private boolean rigth = true;
public Prometheus(){ public Prometheus(){
x = y = 0; WIDTH = 48;
width = 48; HEIGHT = 32;
height = 32; body = new Sprite(Prometheus.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-01.png"), WIDTH, HEIGHT);
body = new Sprite(Prometheus.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-01.png"), width, height); gun = new Sprite(Prometheus.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-gun.png"), 48, 16);
gun = new Sprite(Prometheus.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-gun.png"), 48, 16);
setState(0);
} }
/** @Override
* Разворачивание текстуры в другую сторону public int getX() {
* @param value false=вправо, true=влево return x;
*/
public void setInverse(boolean value){
inverse = value;
} }
/** @Override
* Куда развернута текстура public int getY() {
* @return false=вправо, true=влево return y;
*/ }
public boolean getInverse(){
return inverse;
}
/** @Override
* Установка состояние персонажа.<br/> public int getWidth() {
* 0 - idle - стоит на месте<br/> return WIDTH * K;
* 1 - run - бежит }
*/
public void setState(int value){
state = value;
if(state == 0){
body.setFrame(0);
gun.setFrame(0);
} else {
body.setFrame(1);
gun.setFrame(1);
}
}
/** @Override
* Ссостояние персонажа.<br/> public int getHeight() {
* 0 - idle - стоит на месте<br/> return HEIGHT * K;
* 1 - run - бежит }
*/
public int getState(){
return state;
}
public void setX(int value){ @Override
x = value; public void setX(int value) {
} this.x = value;
}
public int getX(){ @Override
return x; public void setY(int value) {
} this.y = value;
}
public void setY(int value){ @Override
y = value; public void render() {
} int _x = get_center_x();
if(_x > Mouse.getX()){
sprite_inverse = true;
}
else if(_x < Mouse.getX()){
sprite_inverse = false;
}
public int getY(){ if(is_run){
return y; if((!run_left && !sprite_inverse) || (run_left && sprite_inverse)){
} body.nextFrame();
gun.nextFrame();
}
else if((run_left && !sprite_inverse) || (!run_left && sprite_inverse)){
body.prevFrame();
gun.prevFrame();
}
}
public void render(){ GL11.glColor3f(1f, 1f, 1f);
Sprite.Coords bodyFrame = body.getFrame(); render_body(body.getFrame());
Sprite.Coords gunFrame = gun.getFrame(); render_gun(gun.getFrame());
}
GL11.glColor3f(1f, 1f, 1f); @Override
public void move(int oX, int oY) {
this.x += oX;
this.y += oY;
if(!inverse && (get_center_x() > Mouse.getX())){ if(oX < 0){
inverse = true; run_left = true;
} else if(inverse && (get_center_x() < Mouse.getX())) { } else {
inverse = false; run_left = false;
} }
}
render_body(bodyFrame); public int getSpeed(){
render_gun(gunFrame); return SPEED;
}
if(state == 1){ public void setRun(boolean value){
if(!inverse){ is_run = value;
if(!rigth){
body.nextFrame();
gun.nextFrame();
}else{
body.prevFrame();
gun.prevFrame();
}
} else {
if(rigth){
body.nextFrame();
gun.nextFrame();
}else{
body.prevFrame();
gun.prevFrame();
}
}
}
}
private void render_body(Sprite.Coords frame){ if(!value){
body.bind(); body.setFrame(0);
gun.setFrame(0);
}
}
GL11.glPushMatrix(); private void render_body(Sprite.Coords frame){
GL11.glTranslatef(x,y,0); body.bind();
GL11.glPushMatrix();
GL11.glTranslatef(x, y, 0);
GL11.glBegin(GL11.GL_QUADS); GL11.glBegin(GL11.GL_QUADS);
if(inverse){ if(!sprite_inverse){
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y1)); GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y1));
GL11.glVertex2f(0, 0); GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y1));
GL11.glVertex2f(body.getWidthSprite() * K, 0);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y2));
GL11.glVertex2f(body.getWidthSprite() * K, body.getHeightSprite() * K);
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y2));
GL11.glVertex2f(0, body.getHeightSprite() * K);
} else {
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y1));
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y1));
GL11.glVertex2f(body.getWidthSprite() * K, 0);
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y2));
GL11.glVertex2f(body.getWidthSprite() * K, body.getHeightSprite() * K);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y2));
GL11.glVertex2f(0, body.getHeightSprite() * K);
}
GL11.glEnd();
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y1)); GL11.glPopMatrix();
GL11.glVertex2f(body.getWidthSprite()*K, 0); }
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y2)); private void render_gun(Sprite.Coords frame){
GL11.glVertex2f(body.getWidthSprite()*K, body.getHeightSprite()*K); int _x;
int _y = y + (5 * K);
if(!sprite_inverse){
_x = x + (19 * K);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y2)); } else {
GL11.glVertex2f(0, body.getHeightSprite()*K); _x = x + (29 * K);
} else { }
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y1)); int offcetX = -10 * K;
GL11.glVertex2f(0, 0); int offcetY = -16 * K;
int mX = Mouse.getX();
int mY = Display.getHeight() - Mouse.getY();
float angle = (float)(Math.atan2(mY - _y, mX - _x) * _180_DIV_PI);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y1)); gun.bind();
GL11.glVertex2f(body.getWidthSprite()*K, 0); GL11.glPushMatrix();
GL11.glTranslatef(_x, _y, 0);
GL11.glRotatef(angle, 0, 0, 1);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y2)); GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(body.getWidthSprite()*K, body.getHeightSprite()*K); if(!sprite_inverse){
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX, offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX + gun.getWidthSprite() * K, offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX + gun.getWidthSprite() * K, offcetY + gun.getHeightSprite() * K);
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX, offcetY + gun.getHeightSprite() * K);
} else {
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX, -(offcetY + gun.getHeightSprite() * K));
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX + gun.getWidthSprite() * K, -(offcetY + gun.getHeightSprite() * K));
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX + gun.getWidthSprite() * K, -offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX, -offcetY);
}
GL11.glEnd();
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y2)); GL11.glPopMatrix();
GL11.glVertex2f(0, body.getHeightSprite()*K); }
}
GL11.glEnd();
GL11.glPopMatrix(); private int get_center_x(){
} return x + ((WIDTH * K) / 2);
}
private void render_gun(Sprite.Coords frame){
gun.bind();
GL11.glPushMatrix();
GL11.glColor3f(1f, 1f, 1f);
int _x;
int _y;
if(!inverse){
_x = (x + (19 * K));
_y = (y + (5 * K));
} else {
_x = (x + (29 * K));
_y = (y + (5 * K));
}
int mX = Mouse.getX();
int mY = Display.getHeight() - Mouse.getY();
int offcetY = (-16 * K);
int offcetX = (-10 * K);
float angle = (float)(Math.atan2(mY - _y, mX - _x) * 180/Math.PI);
GL11.glTranslatef(_x, _y, 0);
GL11.glRotatef(angle, 0, 0, 1);
GL11.glBegin(GL11.GL_QUADS);
if(!inverse){
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX, offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX + gun.getWidthSprite()*K, offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX + gun.getWidthSprite()*K, offcetY + gun.getHeightSprite()*K);
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX, offcetY + gun.getHeightSprite()*K);
} else {
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX, -(offcetY + gun.getHeightSprite()*K));
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX + gun.getWidthSprite()*K, -(offcetY + gun.getHeightSprite()*K));
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX + gun.getWidthSprite()*K, -offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX, -offcetY);
}
GL11.glEnd();
GL11.glPopMatrix();
}
private void draw_target(int x, int y, float angle){
final int size = 100;
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glPushMatrix();
GL11.glTranslatef(x,y,0);
GL11.glRotatef(angle, 0, 0, 1);
GL11.glBegin(GL11.GL_LINES);
GL11.glColor3f(1,0,0);
GL11.glVertex2f(0,0);
GL11.glVertex2f(size,0);
GL11.glColor3f(0,1,0);
GL11.glVertex2f(0,0);
GL11.glVertex2f(0,size);
GL11.glColor3f(0,0,1);
GL11.glVertex2f(0,0);
GL11.glVertex2f(-size,0);
GL11.glColor3f(1,1,1);
GL11.glVertex2f(0,0);
GL11.glVertex2f(0,-size);
GL11.glEnd();
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
private void draw_quad(int x, int y, float angle){
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glPushMatrix();
GL11.glTranslatef(x,y,0);
GL11.glRotatef(angle, 0, 0, 1);
GL11.glColor4f(1, 1, 1, 0.5f);
GL11.glBegin(GL11.GL_QUADS);
if(!inverse){
GL11.glVertex2f(0,0);
GL11.glVertex2f(100,0);
GL11.glVertex2f(100,50);
GL11.glVertex2f(0,50);
} else {
GL11.glVertex2f(0,-50);
GL11.glVertex2f(100,-50);
GL11.glVertex2f(100,0);
GL11.glVertex2f(0,0);
}
GL11.glEnd();
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
private void draw_line(int x1, int y1, int x2, int y2){
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glPushMatrix();
GL11.glColor3f(1,1,0);
GL11.glBegin(GL11.GL_LINES);
GL11.glVertex2f(x1,y1);
GL11.glVertex2f(x2,y2);
GL11.glEnd();
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
public int getSpeed(){
return speed;
}
public int getWidth(){
return width;
}
public int getHeight(){
return height;
}
private int get_center_x(){
return x + ((width * K) / 2);
}
public boolean getRigthRun(){
return rigth;
}
public void setRigthRun(boolean value){
rigth = value;
}
} }

View File

@@ -1,105 +0,0 @@
package ru.dmitriymx.game.mw;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.GL11;
import ru.dmitriymx.game.engine.Sprite;
public class Prometheus2 implements TexturedObject {
private final double _180_DIV_PI = 180/Math.PI;
private final int WIDTH, HEIGHT;
private int x, y = 0;
private Sprite body, gun;
public Prometheus2(){
WIDTH = 48;
HEIGHT = 32;
body = new Sprite(Prometheus2.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-01.png"), WIDTH, HEIGHT);
gun = new Sprite(Prometheus2.class.getResourceAsStream("/ru/dmitriymx/game/mw-prometheus-gun.png"), 48, 16);
}
@Override
public int getX() {
return x;
}
@Override
public int getY() {
return y;
}
@Override
public int getWidth() {
return WIDTH;
}
@Override
public int getHeight() {
return HEIGHT;
}
@Override
public void setX(int value) {
this.x = value;
}
@Override
public void setY(int value) {
this.y = value;
}
@Override
public void render() {
GL11.glColor3f(1f, 1f, 1f);
render_body(body.getFrame());
render_gun(body.getFrame());
}
private void render_body(Sprite.Coords frame){
body.bind();
GL11.glPushMatrix();
GL11.glTranslatef(x, y, 0);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y1));
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y1));
GL11.glVertex2f(body.getWidthSprite(), 0);
GL11.glTexCoord2f(body.floatX(frame.x2), body.floatY(frame.y2));
GL11.glVertex2f(body.getWidthSprite(), body.getHeightSprite());
GL11.glTexCoord2f(body.floatX(frame.x1), body.floatY(frame.y2));
GL11.glVertex2f(0, body.getHeightSprite());
GL11.glEnd();
GL11.glPopMatrix();
}
private void render_gun(Sprite.Coords frame){
int _x = x + 19;
int _y = y + 5;
int offcetX = -16;
int offcetY = -10;
int mX = Mouse.getX();
int mY = Display.getHeight() - Mouse.getY();
float angle = (float)(Math.atan2(mY - _y, mX - _x) * _180_DIV_PI);
gun.bind();
GL11.glPushMatrix();
GL11.glTranslatef(_x, _y, 0);
GL11.glRotatef(angle, 0, 0, 1);
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX, offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y1));
GL11.glVertex2f(offcetX + gun.getWidthSprite(), offcetY);
GL11.glTexCoord2f(gun.floatX(frame.x2), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX + gun.getWidthSprite(), offcetY + gun.getHeightSprite());
GL11.glTexCoord2f(gun.floatX(frame.x1), gun.floatY(frame.y2));
GL11.glVertex2f(offcetX, offcetY + gun.getHeightSprite());
GL11.glEnd();
GL11.glPopMatrix();
}
}

View File

@@ -10,4 +10,5 @@ public interface TexturedObject {
public void setY(int value); public void setY(int value);
public void render(); public void render();
public void move(int oX, int oY);
} }