JPCT рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ 3 рдбреА рдЗрдВрдЬрди

jPCT рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ 3 рдбреА рдЗрдВрдЬрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдУрдкрдирдЬреАрдПрд▓ рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд░реЗрдВрдбрд░рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдбреЗрд╕реНрдХрдЯреЙрдк, рдЗрдВрдЯрд░рдиреЗрдЯ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП 3 рдбреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддреЛ рдЪрд▓реЛ рдЙрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдЦреЗрд▓ рд▓рд┐рдЦрдХрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЫрд╡рд┐

JPCT рдпрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ред рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реНрдерд╛рди рдкрд░ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдЖрдкрдХреЛ рдЬрд╛рд░ рдлрд╛рдЗрд▓реЗрдВ, рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЖрд╡рд╢реНрдпрдХ рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдорд┐рд▓реЗрдВрдЧреЗред рдЕрдЧрд▓рд╛, рдПрдХреНрд▓рд┐рдкреНрд╕ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ, рдЕрдЧрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЯреИрдм рдкрд░, рдмрд╛рд╣реНрдп рдЬрд╛рд░ рдЬреЛрдбрд╝реЗрдВ рдЬреЛрдбрд╝реЗрдВ jpct.jar, lwjgl.jar, lwjgl_util.jarред Jpct рдХреЗ рд▓рд┐рдП, javadoc рдХрд╛ рд╕реНрдерд╛рди рдФрд░ lwjgl рдХреЗ рд▓рд┐рдП, рдореВрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
рдЫрд╡рд┐

рдЖрдЗрдП рдкрдиреАрд░ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдПрдХ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдЙрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЦреЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╢рд╛рдпрдж рдХреЛрдИ рднреА 3D jPCT рдЗрдВрдЬрди, Object3D, Camera, World рдХреЛ рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред jPCT 3 рдбреА рдореЙрдбрд▓ рдХреЗ рдХрдИ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдпрд╣рд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдВред рд▓реЛрдбрд░ рд▓реЛрдб 3 рдбреАрдПрд╕ рд╡рд░реНрдЧ рдХреА рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 3ds рдореЙрдбрд▓ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рджреГрд╢реНрдп рдореЗрдВ 3ds рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рдПрдЧрд╛ред 3 рдбреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдлрд┐рд░ рдмрдирд╛рд╡рдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдЧреА, рдмрд╢рд░реНрддреЗ рдХрд┐ рдмрдирд╛рд╡рдЯ рдХреЗ рдирд╛рдо 3 рдбреА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдВред рдмрдирд╛рд╡рдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рднрд░реА рд╣реБрдИ рд╣реИ:

final TextureManager texMan = TextureManager.getInstance();
texMan.addTexture( "TextureName.png", new Texture ( "TextureFileName.png" ) );

рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╡рд░реНрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЗ addObject рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрдИ рд╡рд┐рд╢реНрд╡ рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдорд╛рдирджрдВрдбреЛрдВ, рдЧрдгрдирд╛ рдЖрдпрдд, рдЖрджрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ "рдмрд┐рд▓реНрдб" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╡рд░реНрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреА buildAllObjects () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреБрдирд┐рдпрд╛ рдмрдирд╛рдИ, рдЕрдм рдЬреИрд╕реЗ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд╢ рд╣реЛрдиреЗ рджреЛ! рд╣рдо рдкреНрд░рдХрд╛рд╢ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА AddLight рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд▓рд╛рд▓, рд╣рд░реЗ рдФрд░ рдиреАрд▓реЗ рд░рдВрдЧ рдХреА рддреАрд╡реНрд░рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред JPCT рдореЗрдВ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ SimpleVector (рд╡рд░реНрдЧ jPCT) рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддреАрди рдлреНрд▓реЛрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╡рд╛рд▓реЗ "рдкреБрд░рд╛рдиреЗ" рд░реВрдк рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдпрд╣ рд╕рдм рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдХреИрдорд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреИрдорд░реЗ рдХреЛ рд╡рд╕реНрддреБ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдШреБрдорд╛рдпрд╛, рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╕реНрддреБ рдХреЗ z рдЕрдХреНрд╖ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рдВрд░реЗрдЦрд┐рдд)ред рд╡реИрд╕реЗ, jPCT рдореЗрдВ, x рдЕрдХреНрд╖ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, z рдЕрдХреНрд╖ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ y рдЕрдХреНрд╖ рдиреАрдЪреЗ (рдкреИрд░реЛрдВ рдХреЗ рдиреАрдЪреЗ) рд╣реЛрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, jPCT рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

final FrameBuffer buffer = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL);
buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE);
buffer.enableRenderer(IRenderer.RENDERER_OPENGL);

рддрдм рдЬрдм рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рдо рдЗрд╕реЗ рдЙрд╕рдХреА рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдВрдЧреЗ:

buffer.disableRenderer(IRenderer.RENDERER_OPENGL);
buffer.dispose();

рджреБрдирд┐рдпрд╛ рдХреЛ рдмрдлрд░ рдореЗрдВ рд▓рд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

buffer.clear(java.awt.Color.BLUE);
theWorld.renderScene(buffer);
theWorld.draw(buffer);
buffer.update();
buffer.displayGLOnly();

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рдм рдХреБрдЫ рдиреАрд▓рд╛ рд╣реЛрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, jpct рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ KeyMapper рдХреНрд▓рд╛рд╕ рд╣реИред рдЖрдк рдмрд╕ рдПрдХ рдирдпрд╛ KeyMapper рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдк рдкреЛрд▓ (), рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЯрдХреНрдХрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рднреА рд╣реИред рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдореЗрдВ, рдорд╛рдЙрд╕ рджреАрд╡рд╛рд░реЛрдВ рд╕реЗ рдЯрдХрд░рд╛рдПрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ, рдорд╛рдЙрд╕ рдФрд░ рдкрдиреАрд░ рдХреА рдЯрдХреНрдХрд░ рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдорд╛рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо setCollisionMode рд╡рд┐рдзрд┐ (Object3D.COLLISION_CHECK_SELF) рдХрд╣рддреЗ рд╣реИрдВред рдФрд░ рдкрдиреАрд░ рдФрд░ рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВрд╕реАрдореЛрд╢рдирдХреЛрдб (Object3D.COLLISION_CHECK_OTHERS)ред рдкрдиреАрд░ рдЕрднреА рднреА рд╣рдореЗрдВ рдПрдХ рдЯрдХрд░рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЬрд╛рди рд╕рдХреЗрдВ рдХрд┐ рдЦреЗрд▓ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ (addCollisionListener (рдпрд╣))ред рдЕрдм рд╣рд░ рдмрд╛рд░ рдЬрдм рдорд╛рдЙрд╕ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ Object3D рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ CheckForCollisionEllipsoid (SimpleVector - Move, SimpleVector - рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдЬреЛ рдорд╛рдЙрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рд▓рдЧрднрдЧ 8, - рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЧрд╣рд░рд╛рдИ)ред рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдЧреЛрд▓реЗ рдФрд░ рдПрдХ рдШрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреНрд░рдорд╢рдГ, рддрд░реАрдХреЗ checkForCollisionSpherical (...), checkForCollision (...)ред рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рднреМрддрд┐рдХреА рд╕реЗ рдЬреЗрдкреАрд╕реАрдЯреА рдореЗрдВ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЗрд▓реЗрдЯред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреВрд░рд╛ рдХреЛрдб:

 import java.awt.Color; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import com.threed.jpct.*; public class RatDungeon implements CollisionListener { private final Object3D rat; private final Object3D cheese; private Camera camera; private final Camera attached = new Camera(); private final World theWorld = new World(); private final KeyMapper keyMapper; private boolean forward = false; private boolean backward = false; private boolean left = false; private boolean right = false; private boolean doLoop = true; private final SimpleVector ellipsoid = new SimpleVector(15, 18, 32); private final float SPEED = 2.0f; private final float MAXSPEED = 3.0f; private boolean switchCamera = false; private final int high_camera = 1; private final int attached_camera = 2; private int cameraType = high_camera; private final float cellSize = 60f; private boolean gameOver = false; public RatDungeon() throws Exception { textures (); rat = loadObject( "Nave.3ds" ); rat.scale(0.3f); rat.setCollisionMode( Object3D.COLLISION_CHECK_SELF ); theWorld.addObject(rat); cheese = loadObject( "queso.3DS" ); cheese.scale(0.8f); cheese.setCollisionMode( Object3D.COLLISION_CHECK_OTHERS ); cheese.addCollisionListener(this); theWorld.addObject(cheese); loadWorld(); Config.linearDiv = 700; Config.lightDiscardDistance = 650; Config.collideOffset = 800; theWorld.addLight( new SimpleVector (175, -250, -175), 15, 15, 15 ); theWorld.addLight( new SimpleVector (350, -250, 0), 15, 15, 15 ); theWorld.addLight( new SimpleVector (0, -250, 0), 15, 15, 15 ); theWorld.addLight( new SimpleVector (350, -250, -350), 15, 15, 15 ); theWorld.addLight( new SimpleVector (0, -250, -350), 15, 15, 15 ); theWorld.buildAllObjects(); keyMapper = new KeyMapper(); } private void loop() throws Exception { final FrameBuffer buffer = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL); buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE); buffer.enableRenderer(IRenderer.RENDERER_OPENGL); moveCamera(); final long delay = 20; long previous = System.currentTimeMillis(); while( doLoop ) { buffer.clear(java.awt.Color.BLUE); theWorld.renderScene(buffer); theWorld.draw(buffer); buffer.update(); buffer.displayGLOnly(); final long current = System.currentTimeMillis(); if( current - previous > delay ) { pollControls(); move(); moveCamera(); if( switchCamera ) { switchCamera = false; if( cameraType == high_camera ) { cameraType = attached_camera; theWorld.setCameraTo(attached); } else if( cameraType == attached_camera ) { cameraType = high_camera; theWorld.setCameraTo(camera); } } previous = current; if( gameOver ) { System.out.println( "Game over!!!" ); gameOver = false; } } } buffer.disableRenderer(IRenderer.RENDERER_OPENGL); buffer.dispose(); System.exit(0); } private void loadWorld() throws Exception { final BufferedReader in = new BufferedReader( new FileReader( "level.txt" ) ); String s; int width = 0, height = 0; int ratX = 0, ratY = 0; int cheeseX = 0, cheeseY = 0; int line_num = -1; final List< int[] > walls = new ArrayList<int []>(); while( ( s = in.readLine() ) != null ) { if( s.startsWith("rat", 0) ) { final StringTokenizer st = new StringTokenizer(s); st.nextToken(); ratX = Integer.parseInt( st.nextToken() ); ratY = Integer.parseInt( st.nextToken() ); } else if( s.startsWith("cheese", 0) ) { final StringTokenizer st = new StringTokenizer(s); st.nextToken(); cheeseX = Integer.parseInt( st.nextToken() ); cheeseY = Integer.parseInt( st.nextToken() ); } else { if( ( s.indexOf('_') != -1 ) || ( s.indexOf('|') != -1 ) ) { if( width == 0 ) width = s.length()/2; if( s.indexOf('|') != -1 ) line_num++; for( int i = 0; i < s.length(); i++ ) { if( s.charAt(i) == '_' ) { final int coords[] = { i/2, line_num, i/2, line_num + 1 }; walls.add( coords ); } else if( s.charAt(i) == '|' ) { final int coords[] = { i/2 - 1, line_num, i/2, line_num + 1 }; walls.add( coords ); } } } } } height = line_num + 1; createTable( width, height, walls ); rat.translate( cellSize*ratX, 0, - cellSize*ratY ); cheese.translate( cellSize*cheeseX, -5, - cellSize*cheeseY ); camera = theWorld.getCamera (); camera.rotateX( (-1.1f-0.14f) ); camera.setPosition( new SimpleVector( cellSize*(width/2), -cellSize*(height + 2), - cellSize*height ) ); } private void move() { SimpleVector moveRes = new SimpleVector(0, 0, 0); if( forward ) { final SimpleVector t = rat.getZAxis(); t.scalarMul(SPEED); moveRes.add(t); } if( backward ) { final SimpleVector t = rat.getZAxis(); t.scalarMul(-SPEED); moveRes.add(t); } if( left ) { rat.rotateY( (float) Math.toRadians(-1.8f) ); } if( right ) { rat.rotateY( (float) Math.toRadians(1.8f) ); } if( moveRes.length() > MAXSPEED ) { moveRes.makeEqualLength( new SimpleVector(0, 0, MAXSPEED) ); } moveRes = rat.checkForCollisionEllipsoid(moveRes, ellipsoid, 8); rat.translate(moveRes); moveRes = new SimpleVector(0, 0, 0); } private void moveCamera() { attached.setPositionToCenter(rat); attached.align(rat); attached.rotateCameraX( (float) Math.toRadians(30) ); attached.moveCamera( Camera.CAMERA_MOVEOUT, 150 ); } private void pollControls() { KeyState ks = null; while( ( ks = keyMapper.poll() ) != KeyState.NONE ) { if(ks.getKeyCode() == KeyEvent.VK_ESCAPE) { doLoop = false; } if(ks.getKeyCode() == KeyEvent.VK_C ) { if( cameraType == high_camera ) switchCamera = true; } if(ks.getKeyCode() == KeyEvent.VK_D ) { if( cameraType == attached_camera ) switchCamera = true; } if( ks.getKeyCode() == KeyEvent.VK_UP ) { forward = ks.getState(); } if (ks.getKeyCode() == KeyEvent.VK_DOWN) { backward = ks.getState(); } if (ks.getKeyCode() == KeyEvent.VK_LEFT) { left = ks.getState(); } if (ks.getKeyCode() == KeyEvent.VK_RIGHT) { right = ks.getState(); } if (org.lwjgl.opengl.Display.isCloseRequested()) { doLoop = false; } } private void createTable( final int sizeX, final int sizeY, final List< int[] > walls ) { for( int x = 0; x < sizeX; x++ ) { for( int y = 0; y < sizeY; y++ ) { final Object3D cell = Primitives.getBox( cellSize/2, 0.1f ); cell.translate( x*cellSize, 0, - y*cellSize ); cell.rotateY( (float )Math.PI/4 ); if( ( x%2 + y%2 ) == 1 ) cell.setAdditionalColor( new Color( 0, 250, 0 ) ); else cell.setAdditionalColor( new Color( 0, 0, 250 ) ); cell.setLighting( Object3D.LIGHTING_NO_LIGHTS ); theWorld.addObject(cell); } } final Color wallColor = new Color( 230, 10, 10 ); for( int i = 0; i < walls.size(); i++ ) { final int cell1X = walls.get(i)[0]; final int cell1Y = walls.get(i)[1]; final int cell2X = walls.get(i)[2]; final int cell2Y = walls.get(i)[3]; final int x = cell2X; final int y = cell1Y; final Object3D wall = Primitives.getBox( cellSize/2, 0.1f ); wall.rotateY( (float )Math.PI/4 ); wall.translate( cellSize*x, -cellSize/2, -cellSize*y ); if( cell1X < cell2X ) { wall.rotateZ( (float )Math.PI/2 ); wall.translate( new SimpleVector( -cellSize/2, 0, 0 ) ); } else { wall.rotateX( (float )Math.PI/2 ); wall.translate( new SimpleVector( 0, 0, -cellSize/2 ) ); } wall.setAdditionalColor( wallColor ); wall.setCollisionMode( Object3D.COLLISION_CHECK_OTHERS ); theWorld.addObject(wall); } } private Object3D loadObject( final String fileName ) { final Object3D objParts [] = Loader.load3DS( fileName, 1f ); Object3D ret = new Object3D (0); for( int i = 0; i < objParts.length; i++ ) { final Object3D part = objParts [i]; part.setCenter( new SimpleVector(0, 0, 0) ); part.rotateX( (float)-Math.PI/2 ); part.rotateMesh(); part.setRotationMatrix( new Matrix() ); if( (i&1) == 1 ) { part.setTransparency(0); } ret = Object3D.mergeObjects (ret, part); } return ret; } private void textures() { final TextureManager texMan = TextureManager.getInstance(); texMan.addTexture( "ROJO.JPG", new Texture ( "ROJO.JPG" ) ); texMan.addTexture( "QUESO.JPG", new Texture ( "QUESO.JPG" ) ); } @Override public void collision(final CollisionEvent ce) { gameOver = true; } @Override public boolean requiresPolygonIDs() { return false; } public static void main(final String[] args) throws Exception { new RatDungeon().loop(); } } 


рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЧреЗрдо рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ (рдЬрд╛рд╡рд╛ рдПрдкреНрд▓реЗрдЯ) рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдиреНрдпреВрдирддрдо рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рдВрджрд░реНрдн:
jPCT рд╡рд┐рдХрд┐
JPCT рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕
рд╕реНрд░реЛрдд рдкрд╛рда рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ

Source: https://habr.com/ru/post/In127808/


All Articles