diff --git a/resource/java/ru/dmitriymx/game/mw-prometheus-01.png b/resource/java/ru/dmitriymx/game/mw-prometheus-01.png new file mode 100644 index 0000000..bf20dca Binary files /dev/null and b/resource/java/ru/dmitriymx/game/mw-prometheus-01.png differ diff --git a/resource/java/ru/dmitriymx/game/mw-prometheus-gun.png b/resource/java/ru/dmitriymx/game/mw-prometheus-gun.png new file mode 100644 index 0000000..510bc39 Binary files /dev/null and b/resource/java/ru/dmitriymx/game/mw-prometheus-gun.png differ diff --git a/src/ru/dmitriymx/game/Main.java b/src/ru/dmitriymx/game/Main.java index 502bf29..fae5a23 100644 --- a/src/ru/dmitriymx/game/Main.java +++ b/src/ru/dmitriymx/game/Main.java @@ -5,9 +5,11 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; +import ru.dmitriymx.game.mw.Prometheus; public class Main { - private Foxy foxy; + //private Foxy foxy; + private Prometheus mech; private void init_display(int width, int height){ try { @@ -22,7 +24,7 @@ public class Main { private void init_opengl(int width, int height) { GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glClearColor(0, 0, 0.3f, 0); + GL11.glClearColor(0.0f, 0.0f, 0.0f, 0); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); @@ -36,39 +38,38 @@ public class Main { private void render(){ while(Keyboard.next()){ if(Keyboard.getEventKey() == Keyboard.KEY_LEFT){ - foxy.setInverse(true); if(Keyboard.getEventKeyState()){ - foxy.setState(1); + mech.setState(1); + mech.setRigthRun(true); } else { - foxy.setState(0); + mech.setState(0); } } else if (Keyboard.getEventKey() == Keyboard.KEY_RIGHT){ - foxy.setInverse(false); if(Keyboard.getEventKeyState()){ - foxy.setState(1); + mech.setState(1); + mech.setRigthRun(false); } else { - foxy.setState(0); + mech.setState(0); } } } - final int speed = 5 * 4; - if(foxy.getState() == 1){ - if(foxy.getInverse()){ - foxy.setX(foxy.getX() - speed); + if(mech.getState() == 1){ + if(mech.getRigthRun()){ + mech.setX(mech.getX() - mech.getSpeed()); } else { - foxy.setX(foxy.getX() + speed); + mech.setX(mech.getX() + mech.getSpeed()); } } - foxy.render(); + mech.render(); } public void start(int width, int height){ init_display(width, height); init_opengl(width, height); - foxy = new Foxy(); - foxy.setY(Display.getHeight() - (34*4)); + mech = new Prometheus(); + mech.setY(Display.getHeight() - (mech.getHeight()*4)); while(!Display.isCloseRequested()){ GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); diff --git a/src/ru/dmitriymx/game/Sprite.java b/src/ru/dmitriymx/game/Sprite.java index 66da96b..c3a7165 100644 --- a/src/ru/dmitriymx/game/Sprite.java +++ b/src/ru/dmitriymx/game/Sprite.java @@ -5,7 +5,7 @@ import java.io.InputStream; public class Sprite extends Texture { public class Coords{ - int x1,y1,x2,y2; + public int x1,y1,x2,y2; Coords(int x1, int y1, int x2, int y2){ this.x1 = x1; this.y1 = y1; @@ -59,6 +59,14 @@ public class Sprite extends Texture { } } + public void prevFrame(){ + if(current_frame == 0){ + current_frame = max_frames-1; + } else { + current_frame--; + } + } + /** * Ширина одного спрайта * @return diff --git a/src/ru/dmitriymx/game/mw/Prometheus.java b/src/ru/dmitriymx/game/mw/Prometheus.java new file mode 100644 index 0000000..2a5230e --- /dev/null +++ b/src/ru/dmitriymx/game/mw/Prometheus.java @@ -0,0 +1,317 @@ +package ru.dmitriymx.game.mw; + +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.GL11; +import ru.dmitriymx.game.Sprite; + +public class Prometheus { + private Sprite body, gun; + private int x, y; + private int width, height; + private int state; + private boolean inverse = false; + private final int K = 4; + private final int speed = 2 * K; + private boolean rigth = true; + + public Prometheus(){ + x = y = 0; + width = 48; + height = 32; + 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); + setState(0); + } + + /** + * Разворачивание текстуры в другую сторону + * @param value false=вправо, true=влево + */ + public void setInverse(boolean value){ + inverse = value; + } + + /** + * Куда развернута текстура + * @return false=вправо, true=влево + */ + public boolean getInverse(){ + return inverse; + } + + /** + * Установка состояние персонажа.
+ * 0 - idle - стоит на месте
+ * 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); + } + } + + /** + * Ссостояние персонажа.
+ * 0 - idle - стоит на месте
+ * 1 - run - бежит + */ + public int getState(){ + return state; + } + + public void setX(int value){ + x = value; + } + + public int getX(){ + return x; + } + + public void setY(int value){ + y = value; + } + + public int getY(){ + return y; + } + + public void render(){ + Sprite.Coords bodyFrame = body.getFrame(); + Sprite.Coords gunFrame = gun.getFrame(); + + GL11.glColor3f(1f, 1f, 1f); + + if(!inverse && (get_center_x() > Mouse.getX())){ + inverse = true; + } else if(inverse && (get_center_x() < Mouse.getX())) { + inverse = false; + } + + render_body(bodyFrame); + render_gun(gunFrame); + + /*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(); + float _a = (float)(Math.atan2(mY - _y, mX - _x) * 180/Math.PI); + draw_target(_x, _y, 0); + draw_quad(_x,_y,_a);*/ + + if(state == 1){ + if(!inverse){ + 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){ + body.bind(); + + GL11.glPushMatrix(); + GL11.glTranslatef(x,y,0); + + GL11.glBegin(GL11.GL_QUADS); + if(inverse){ + 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); + } else { + 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()*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); + } + GL11.glEnd(); + + GL11.glPopMatrix(); + } + + 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; + } +}