package template.shooting; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsConfiguration; import java.util.ArrayList; import javax.media.j3d.AmbientLight; import javax.media.j3d.BoundingSphere; import javax.media.j3d.DirectionalLight; import javax.media.j3d.Geometry; import javax.media.j3d.Texture; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.image.TextureLoader; import framework.AI.GeometryGraph; import framework.AI.IState; import framework.AI.Location; import framework.RWT.RWTBoard; import framework.RWT.RWTCanvas3D; import framework.RWT.RWTContainer; import framework.RWT.RWTFrame3D; import framework.RWT.RWTLabel; import framework.RWT.RWTVirtualController; import framework.RWT.RWTVirtualKey; import framework.animation.Animation3D; import framework.animation.AnimationFactory; import framework.gameMain.SimpleGame; import framework.model3D.BackgroundBox; import framework.model3D.CollisionResult; import framework.model3D.GeometryCollector; import framework.model3D.ModelFactory; import framework.model3D.Object3D; import framework.model3D.Position3D; import framework.model3D.Universe; import framework.physics.Ground; import framework.physics.PhysicsUtility; import framework.physics.Velocity3D; import framework.view3D.Camera3D; /** * シューティングゲームのためのテンプレート * @author 新田直也 * */ public class PreSeminarShooting extends SimpleBattleGame { private boolean bShot = false; private RWTContainer container; // プレイ画面のコンテナ private RWTLabel gameOver = null; // ゲームオーバー表示用 private RWTLabel scoreDisplay = null; // スコア表示用 private int score = 0; // スコア @Override public void init(BattleField field, Camera3D camera) { // 環境光 AmbientLight amblight = new AmbientLight(new Color3f(0.3f, 0.3f, 0.3f)); amblight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); field.placeLight(amblight); // 平行光源 DirectionalLight dirlight = new DirectionalLight(true, // 光のON/OFF new Color3f(1.0f, 1.0f, 1.0f), // 光の色 new Vector3f(0.0f, -1.0f, -0.5f) // 光の方向ベクトル ); dirlight.setInfluencingBounds(new BoundingSphere(new Point3d(), 10000.0)); field.placeLight(dirlight); // キャラクターの3Dデータを読み込み配置する Object3D pochaBody = ModelFactory.loadModel("data\\pocha\\pocha.wrl").createObject(); Animation3D pochaAnimation = AnimationFactory.loadAnimation("data\\pocha\\walk.wrl"); Player player = new Player(pochaBody, pochaAnimation); player.setPosition(new Position3D(120.0, 30.0, 30.0)); player.setDirection(new Vector3d(0.0, 0.0, 1.0)); field.place(player); // ステージの3Dデータを読み込み配置する Object3D stageObj = ModelFactory.loadModel("data\\Neuschwanstein\\Neuschwanstein.wrl").createObject(); Ground stage = new Ground(stageObj); field.place(stage); // 背景を作成する buildSkyBox(field); // カメラの設定(三人称視点にする) camera.addTarget(player); camera.setCameraBack(new Vector3d(0.0, 4.0, 7.0)); camera.setViewLine(player.getDirection()); camera.setFieldOfView(1.5); } @Override public RWTFrame3D createFrame3D() { RWTFrame3D f = new RWTFrame3D(); f.setSize(800, 600); f.setTitle("Pre-Seminar Shooting Game"); f.setMouseCapture(true); return f; } protected RWTContainer createRWTContainer() { container = new RWTContainer() { @Override public void build(GraphicsConfiguration gc) { RWTCanvas3D canvas; if (gc != null) { canvas = new RWTCanvas3D(gc, true); } else { canvas = new RWTCanvas3D(true); } canvas.setRelativePosition(0.0f, 0.0f); canvas.setRelativeSize(1.0f, 1.0f); gameOver = new RWTLabel(0.25f, 0.5f, "Game Over!!", Color.RED, new Font("", Font.ITALIC, 36)); gameOver.setVisible(false); canvas.addWidget(gameOver); RWTBoard scoreBoard = new RWTBoard(0.72f, 0.035f, 0.27f, 0.08f, new Color(1.0f, 1.0f, 1.0f, 0.3f)); scoreBoard.setVisible(true); canvas.addWidget(scoreBoard); scoreDisplay = new RWTLabel(0.75f, 0.1f, "Score: " + score, Color.WHITE, new Font("", Font.PLAIN, 20)); scoreDisplay.setVisible(true); canvas.addWidget(scoreDisplay); addCanvas(canvas); repaint(); } // RWT側ではイベント処理をしない @Override public void keyPressed(RWTVirtualKey key) {} @Override public void keyReleased(RWTVirtualKey key) {} @Override public void keyTyped(RWTVirtualKey key) {} }; return container; } @Override public void progress(RWTVirtualController virtualController, long interval) { // *** 以下にキー操作のプログラムを書く *** // 戦場のすべての登場物(プレイヤーや敵など)を一斉に動かす battleField.motion(interval); // *** ゲームオーバーか否かを判定する *** // *** 点数計算 *** // カメラの回転 camera.setViewLine(battleField.getPlayerDirection()); } /** * ゲームのメイン * @param args */ public static void main(String[] args) { PreSeminarShooting game = new PreSeminarShooting(); game.setFramePolicy(5, 33, false); game.start(); } /** * 背景を作成する * @param field */ private void buildSkyBox(BattleField field) { TextureLoader loaderTop = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureTop = loaderTop.getTexture(); TextureLoader loaderBottom = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureBottom = loaderBottom.getTexture(); TextureLoader loaderNorth = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureNorth = loaderNorth.getTexture(); TextureLoader loaderSouth = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureSouth = loaderSouth.getTexture(); TextureLoader loaderWest = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureWest = loaderWest.getTexture(); TextureLoader loaderEast = new TextureLoader("data\\konan\\sky.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null); Texture textureEast = loaderEast.getTexture(); BackgroundBox background = new BackgroundBox(textureNorth, textureWest, textureSouth, textureEast, textureTop, textureBottom); BoundingSphere bs = new BoundingSphere(); bs.setRadius(1000); background.setApplicationBounds(bs); field.place(background); } }