From 2dd4d8929b078464faaa0c928c835db5f4a2dcc1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 27 Oct 2013 03:03:54 +0400 Subject: [PATCH] =?UTF-8?q?feature(prometheus)=20=D0=9D=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D0=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dmitriymx/game/mw-prometheus-01.png | Bin 0 -> 2878 bytes .../ru/dmitriymx/game/mw-prometheus-gun.png | Bin 0 -> 1255 bytes src/ru/dmitriymx/game/Main.java | 33 +- src/ru/dmitriymx/game/Sprite.java | 10 +- src/ru/dmitriymx/game/mw/Prometheus.java | 317 ++++++++++++++++++ 5 files changed, 343 insertions(+), 17 deletions(-) create mode 100644 resource/java/ru/dmitriymx/game/mw-prometheus-01.png create mode 100644 resource/java/ru/dmitriymx/game/mw-prometheus-gun.png create mode 100644 src/ru/dmitriymx/game/mw/Prometheus.java 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 0000000000000000000000000000000000000000..bf20dca1c6ae9c720b5ac5d802997e2778268298 GIT binary patch literal 2878 zcmeHJi96KW8~@s87-nqUQI8DpPlj9tQ5$8u#E8l^JE7_xH}5;Lx{WGA%9 zP9v2iS0j~*OUM#Qw_$$M@6Y)C?&o>l^SZj1o&aYw4AyCB!`#N+I&fTriNpSTnLFq9Jt09x}z*mwZ|-~+Iy-E6o#2o6Jl zVD|ekoj}mRXh_2^Di5Kv3ApjO19!=DBwsAuw8tNMB8W`B^ zSeXKVV6lTW%8h`2R=PGUt7E9 zytaEid2BFNw(`NA|JR^xa}T1Hg=fVN;xKbRjfAsHFeTq)HxKhsOnPnk$)qC$*&6q4 zOIK?uras1${DXa-yOh{Fk~zH7xp_=U30{V{zJ6`x3a{G9T{5SU^abLB9fEfzvGzpi zyh<6V()VH>-K9JPzkDP~*WG`2O-N8Dxh`eAZG30MRUdTzsL+u{7qIx7GxWce$!GqX zJoItJ8DBSQ2rIO_aN=Qy6@;X)sfOJ_k}-!}ACelhDY8(dRN}BW(`~CEZSV*9CA*+c zpt6Z=Z=RPqY97+N+JiGG&Yhll4X#~W$l`y%EoNuo&AW>yg)&E1&R%m?G1zhZcz z{VFZ~=XUvn;)dgVT3Znkdb8Vfh$J<-KNIg4>U&~`MGySP`avDkL}|A=4DM*Y&Lg== z9e3;(p<>~i#o1QEenIMU{ZeA37@USnN9L)9WA1DzXdf6lwUTxuXWG0qR3&Qa4j!gv z%xmBNeuWR}vK*5_V=(1Bx)^Qkjr}QzR-wko!n$gZUl3-zzx#7%g47)*-DsJr5F#Yl zUV(=xNQW2r=xV_+f{b7~8u_jYY80f2`O})hOK)TBwg*8EEI)RtPm4P})rxp=1*=h# zc}tAKKz|L!-W_s5J?r}1%haa}ym%Q0s@AMcXAB?`pK5v!CBHf$bxC~`vG#<~DjBGM zy5val?#sWAD&^@ElV4kVU<8f*HE%Kj8-b|%p%FHz$zR@ji5z~w+>IEz0MXJjxIHez z==7ec#JSS~T^eLGXC>aotK06Eh|6r;cVG}%-3#7)lyyrF82`VpFimdJvzkege2f9C{n5*;6>|`tA z4Jl=tR*EKUn9Dq3BbP6Nt3@kKo7X3*9hZo;5Z(%AxGxga!DwGZt5|%P)Drc1foN;V z|NdnsDSL~GHs~aj36kR<-?(B@L}poLa|Y-^VE(a!zi8sC`Wff+yRgBNtk;Fu>;O%l z{+5G_(loDJ730FMzi?jiMU{V$9b3n!^XE5mx1p zz>%nV=Y~A+ZXBzjM=9hAYFcEvq`C`pn3PDPd zsR;cV>67TS6sIYZw*33L`n=JEB#K%=Vr_J zk}zf3)_iYd)S#k{{n)U@5-VSA@Ja1SPj8c>M*Yqrk#IHLnkd*hm~tmsE8x@_h$E2m z+-M7Gv@C7s37%#Yw8W+R(9%OZS7gt2mJ^!fl+`A2Gf#@}xTaZg7QHsrAn11H&hi|h z$*+-59{aH^9-dm4kmtc$&=OK|FrbL`=9|;mYORiqu9uptxxEyOZK@5Zn#^{naW-4q z^6kU_rH5MU)((xr?n?&AcJW&C#WwfRO4_5RvS!D@p`({6O1tuJdNi1b0OWWY24MC`#|UKVP>M)kAD+fV(5hXUPr(B zRWvlo^Smlw^4dn+xVJ?NXW4QEA1Uh<7T7WJXb4nnI;NU6r0}coWmJ4}&?Ir80tNTk zi>boH2=JG8%okbts%Uofm~S(r5FOQ=FF)l&S%7`;4xC?2$iA=+oW0q;-MsS3b@j(^ z!ZfS`-c*)rT~=PI-DaUm;T%)1?+~*w%<-b08mtfv6cXVG9T)uGkvo%x6glKSlyfqa zVVlN)`u!#fm{gRbiz^z})PP@wO?KD+iGGirQx&GXlGvQX_T<*AjFb-}@$6$K^iuQ| z@~u8k6^tT7{AUs_FF+3rJfnSiipPGDyqrO{^$v$^6#gNB^8Klb7N(KW$8p}N7|q)Z z$co(~gmK@FUq050eJHtS)=KPYPEAx6IHzlH`1l2R1n)OGhPhR)P$YRMcgw9mWj9u! iGQ7usnq#^7O(D|G$NlVE(&*JLgL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..510bc39951cdbcddbb78c78140cb978ecff29120 GIT binary patch literal 1255 zcmaJ>eNd7I7=MwPW@@gkLef#^nt9h$W@M29ex+C`v7A9E8bzrY6)ILLnccY->ino_ zDt-*3IhE23`%=3LKbC^#8>A^-=^#X$4ipi28N2q^Znr<4@B96J_uO;$+#p4UIoc!b z0RV6$hKG;=0JhbdJKKF`^^Xeb%B=y$B8LS5%@S9&wODmJ@K7KCJSbedlCauZuQ?x1 zVFAF}&;K?U=OnGj+C-*?9!>q0$w*}&BXB_4%yUx7e=l)FHl4)U^x1+xQwkH#lB_rvT8c=T8qoxi6e93 z?t?9z{`joXXIohLKg$uC;EZgEBegjN>H*yTYl>rD9DrXBEy4eA=FgoIU77O-=MPFR zGz}n?h$v3JM(5DxLf5(-n3j$%an+mYi<6%e31(2~Sb6K^m{+>J{#yNQ^Y2FWuyVXC zd8`~JqhIBr8TjU=+<-iPTQDl+i*2am{n`@(g7?v+5gM-=m!imj+&z@c#jqyF_XTsD zG3ljyMh6pPCB)=@=KEt$+DSAG)=Y=I{VZ0lT91`Q6}1A>kLE#0xymKUw|iM;`#tlt z?Z-U!oC$G8+!AGGqiFi%R?*Bc+H0dW2OEz9RcHU;rAZceH1n+Ig`~rNY4sST=$=p+ z0}5xS4PHYhIADXZSY;FNUWAvAHYOCz>*eh@DX9W2+X7jy0WURTdVE0!7t>LRx;z(f zn}9Qwp-c;vNkg^KG4;CE9<0npX?xRYq0q?Li*G`AhGt

$1}XoZ$IPVAaUr`d$Of zzw1E5rX1?39XR#M%!7iqc!$BYVBNXt2K0v~jgc(PeswGP6LoE*m>DgrUAE zNrf6GA-%w9cGz&##yBl~QWbqn!TuzA&ER7(S@8TF$k+I=lrcDVkB{8`*MATNXoAMc zSrxR{MYXuLF*WS-iZKJ4Q+DZ&@T(p~ztJ$X7p{iG& pvXW3AN?x357sHSa5HC@;;YP#K)TQ=@IO`t*h@p`o%|Y?k{sNppj<^5- literal 0 HcmV?d00001 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; + } +}