⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battle.java

📁 StarShip Battle 2004 game The Developing Mobile Phone Applications With J2ME Technology course provi
💻 JAVA
字号:
// TASK 1 -> Bigger Screen
// TASK 2 -> Player can shoot
// TASK 3 -> Bullet hit will destroy enemy ship
// TASK 4 -> Spawn Multiple Enemies
// TASK 5 -> Sound Manager

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.media.*;
import java.io.*;
import java.util.Vector;
import java.util.Random;

public class Battle extends GameCanvas implements Runnable {

	private TiledLayer background; // Layer untuk buat background
	private LayerManager lmgr; // manage layer ?
	private Sprite ship; // image bergerak
	private Sprite enemy; // image bergerak
	private Display deviceDisplay; // display screen kat ne 
	//private Screen mainMenu;
	private MainMenu menu; // menu kat screen nih
	private boolean running = false; // nak tau state dia apa run ke pause ke apa ke
	
	// NEW Variable
	private int width;
    private int height;
    private int tileHeight = 64;
    private TiledLayer landscape;
    private Sprite shot;
    private Vector shots;
    private Vector enemyShots;
    private Vector enemies;
	private Random randNum;
	private int score;
	private int bulletShots;
	private int life;
	private SoundManager shotSounds; // manages the fired shot and explosions sounds (from file sound manager)
	private boolean gameOver = false;
	
    public Battle(Display d, MainMenu m) {
    	super(true);
    	deviceDisplay = d;
    	menu = m;
    	
    	lmgr = new LayerManager();
    	try
    	{
    		width = getWidth();
            height = getHeight();
    		
    		// OLD CODING
    		//Image bkImage = Image.createImage("/background.png");
    		//background = new TiledLayer(7,8,bkImage,20,20);
    		//background.setPosition(20,12);   		
    		/*int map[] = { 1,2,3,4,1,2,3,
    		              2,4,3,1,4,3,1,
    		              4,3,2,1,1,2,4,
    		              2,3,4,1,2,3,1,
    		              3,4,1,2,3,1,4,
    		              2,4,3,1,4,3,1,
    		              4,1,2,3,1,3,4,
    		              2,3,1,4,2,2,1 };*/
    		/*for(int i=0; i < map.length; i++)
    		{
    			int col = i%7;
    			int row = (i-col) /7;
    			background.setCell(col,row,map[i]);
    		}*/    
    					              
	        Image image = Image.createImage("/surface.png");
	        landscape = new TiledLayer(4, 17, image, tileHeight, tileHeight);
	
	        int[] map = {
	            1, 1, 1, 1, 
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1, 
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1, 
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1,
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1, 
				1, 1, 1, 1,
				1, 1, 1, 1
	        };
	
	        for (int i = 0; i < map.length; i++) {
	            int column = i % 4;
	            int row = i / 4;
	            landscape.setCell(column, row, map[i]);
	        }
 
		    shotSounds = new SoundManager();
    		
    	}catch(IOException ioe) {
    		System.out.println("ERR: Loading Image");
    	}
    	
    	initSprites();
    	//lmgr.append(background); // LAMA
    	lmgr.append(landscape); // BARU
    	lmgr.insert(ship,0);
    	//lmgr.insert(enemy,0);
    	Graphics g = getGraphics();
    	lmgr.paint(g,0,0);
    	flushGraphics();
    	
    	shots = new Vector(); // BARU
    	enemyShots = new Vector(); // BARU
    	enemies = new Vector(); // BARU
    	randNum = new Random();
    	score = 0;
    	bulletShots = 0;
    	life = 5;
    }

    public void initSprites(){
    	try{
    		Image shipImage = Image.createImage("/starshipline2.png");
    		ship = new Sprite(shipImage,30,30);
    		ship.setFrame(1);
    		//ship.setPosition(70,130);
    		ship.setPosition((width - 135), height - 40);
    		
    		Image enemyImage = Image.createImage("/alienb.png");   		
			enemy = new EnemyShip(enemyImage, 30, 30);
			enemy.setFrame(1);  		
    		
	        Image shotImage = Image.createImage("/shot.png");
	        shot = new Sprite(shotImage, 2, 10);    		
    		
    	}catch(IOException ioe){
    		System.out.println("ERR: Generating Sprite");
    	}
    }
    
    public void stop(){
    	running = false;
    }
    
    public void start(){
    	running = true;
    	Thread t = new Thread(this);
    	t.start();
    }
    
    public void run(){
    	System.out.println("In the game loop");
    	shotSounds.playSingleSoundBGM("/bgmusic2.wav");
    	Graphics g = getGraphics();
    	int ks = 0;
    	int currentX = 0, currentY = 0;
    	
    	long enemyTime = System.currentTimeMillis();
    	
    	while(running){
    		displayTextOnScreen(g);
    		ks = getKeyStates();
    		currentX=ship.getX();
    		currentY=ship.getY(); // TAMBAH
    		
    		ship.setFrame(1);
   		
   			checkCollision(); // Check for collision
   			
    		if ((ks & LEFT_PRESSED) != 0) {
    			if((currentX)>0) {
    				ship.move(-5,0);
    			}
    		}
    		else if((ks & RIGHT_PRESSED) !=0) {
    			if((currentX-5)< width - 35){
    				ship.move(5,0);
    			}
    		}
    		else if((ks & UP_PRESSED) != 0) { // BUTTON UP
    			if((currentY-5)>0){
    				ship.move(0,-5);
    			}
			}
    		else if((ks & DOWN_PRESSED) != 0) { // BUTTON DOWN
    			if((currentY)< height - 35){
    				ship.move(0,5);
    			}
			}
			else if((ks & FIRE_PRESSED) != 0) { // CODING TEMBAK
	            Sprite newShot = new Sprite(shot);
	            newShot.setPosition(ship.getX() + 14, ship.getY());
	            newShot.setVisible(true);
	            lmgr.insert(newShot, 1); 
	            shots.addElement(newShot); // Masukkan object Sprite ke dalam Vector untuk retrieve balik
	            shotSounds.playShotSound(); // PLAY SOUND MASA TEMBAK
	            bulletShots += 1; // Bullet Count
			}					
			else if((ks & GAME_A_PRESSED) != 0) {
    			stop();
    		}
    		
    		// Create Multiple Enemies 		
    		long start = System.currentTimeMillis();
    		
				if (((start - enemyTime) > 2000) && (enemies.size() < 10)) {
                    EnemyShip newEnemy = new EnemyShip(this.enemy); // Create new enemy object using enemy (Sprite)
                    newEnemy.setPosition(nextInt(randNum, 10, 100), nextInt(randNum, 5, 10)); // Create Random Coordinate for new Enemy
                    newEnemy.setVisible(true);
                    enemies.addElement(newEnemy); // Add New enemy sprite into vector
                    lmgr.insert(newEnemy, 1);     // Add New enemy sprite into layermanager
                    enemyTime = System.currentTimeMillis();
                }

                long rand = System.currentTimeMillis();
				
				// Randomise enemy movement
                for (int i = 0; i < enemies.size(); i++) {
                    EnemyShip enemy = (EnemyShip) enemies.elementAt(i); // Retrieve balik enemy object dari Vector

                    int x = enemy.getDx(); // Get Current Position
                    int y = enemy.getDy(); // Get Current Position

                    // Create Random Number using Long Integer
                    long yrand = rand % 20;
                    rand = rand % 30;

                    if (yrand == 5) {
                        if (y != 1) {
                            y = 1;
                        } else if (rand > 20) {
                            y = -1;
                        }
                    }

                    if (enemy.getX() != ship.getX()) {
                        if (rand == 7) {
                            if (enemy.getX() < ship.getX()) {
                                x = 1;
                            } else {
                                x = -1;
                            }
                        }
                    }
					
					// Random Shooting for Enemy
                    if (rand == 8) {
                        Sprite newShot = new Sprite(shot);
                        newShot.setPosition(enemy.getX() + 7, enemy.getY());
                        newShot.setVisible(true);
                        lmgr.insert(newShot, lmgr.getSize() - 2);
                        enemyShots.addElement(newShot); // Masuk Dalam Vector Element
                    }

                    enemy.move(x, y); // Move to new coordinate
                    enemy.setDx(x); // Save the new coordinate
                    enemy.setDy(y); // Save the new coordinate
                    rand = enemy.getY() + System.currentTimeMillis();
					
					// Remove Enemy if terkeluar dari screen (Bottom)
                    if (enemy.getY() > height) {
                        lmgr.remove(enemy);
                        enemies.removeElement(enemy);
                    }
                                        
                }  		
    		
    		// BULLET MOVEMENT - PLAYER
			for (int i = 0; i < shots.size(); i++) {
                Sprite shot = (Sprite) shots.elementAt(i); // Vector
                shot.move(0, -5); // Menuju ke atas

                if (shot.getY() < -10) { // Kalau Terlebih dari screen, dia ilang
                    lmgr.remove(shot);
                    shots.removeElement(shot);
                }
            } 
    		
    		try {
    			Thread.sleep(50);
    		}	
    		catch(InterruptedException ie) {
    		}
    	} 
    }
    
    // Method for checking ship, enemy and bullet collision
    private void checkCollision() {
    	
    	// While looping in run(), checking for collision
    	
        for (int n = 0; n < enemies.size(); n++) {
            Sprite enemy = (Sprite) enemies.elementAt(n);
			
			// If player collides with any enemy ship
            if (ship.collidesWith(enemy, true)) {
            	enemy.setFrame(3);
                lmgr.remove(enemy);
                enemies.removeElement(enemy);
                destroyPlayerShip(); // Destroy the Player's Ship
            }
			
			// If Player bullet collides with any enemy ship
            for (int i = 0; i < shots.size(); i++) {
                Sprite shot = (Sprite) shots.elementAt(i);
				
                if (shot.collidesWith(enemy, true)) {
                	enemy.setFrame(3);
                    destroyEnemyShip();
                    lmgr.remove(shot);
                    lmgr.remove(enemy);
                    shots.removeElement(shot);
                    enemies.removeElement(enemy);
                }
            }
        }    	
    	
    	// If enemy bullet terkeluar dari screen, remove.
		for (int i = 0; i < enemyShots.size(); i++) {
	        Sprite enemyShot = (Sprite) enemyShots.elementAt(i);
	        enemyShot.move(0, 4);
	
	        if (enemyShot.getY() > height) {
	            lmgr.remove(enemyShot);
	            enemyShots.removeElement(enemyShot);
	        }
	        
	        // If enemy bullet collides with player's ship
	        if(enemyShot.collidesWith(ship,true)){
				life -= 1; // Deduct Player's Life
				lmgr.remove(enemyShot);
	            enemyShots.removeElement(enemyShot);
	            destroyPlayerShip(); // Destroy the Player's Ship
			}                  
	    }
    }
	
	// Destroy Enemy Ship
	private void destroyEnemyShip(){
		score += 1;
		Graphics g = getGraphics();
		lmgr.paint(g,0,0);
		
		shotSounds.playExplosionSound(); // PLAY SOUND meletop
		
		if(score == 7)
		{
			shotSounds.playSingleSound("/3_frags.wav");
		}
		else if (score == 8)
		{
			shotSounds.playSingleSound("/2_frags.wav");
		}
		else if (score == 9)
		{
			shotSounds.playSingleSound("/1_frag.wav");
		}
		
		// If Score is 10, then game is finished
		if(score == 10)
		{
    		gameOver = true;
    		shotSounds.playSingleSound("/youwin.wav");
    		g.setColor(255, 255, 255);
    		String youwinString = "YOU WIN! THANK YOU FOR PLAYING!";
            g.drawString(youwinString, (width - g.getFont().stringWidth(youwinString)) / 2, height / 2, Graphics.LEFT | Graphics.TOP);
		}
        if(gameOver)
        {
        	stop();
        }		
		
		flushGraphics();
		try{
			Thread.sleep(50);
		}catch(InterruptedException ie){}
	}
	
	// Destroy Player's Ship
	private void destroyPlayerShip(){
		Graphics g = getGraphics();

		shotSounds.playExplosionSound(); // PLAY SOUND

		ship.setFrame(4);
		lmgr.paint(g,0,0);
		
		try{
			Thread.sleep(50);
		}catch(InterruptedException ie){}
		ship.setFrame(1);
		ship.setPosition((width - 135), height - 40);
		if(life < 1)
		{
    		gameOver = true;
    		g.setColor(255, 255, 255);
            g.drawString("GAME OVER", (width - g.getFont().stringWidth("GAME OVER")) / 2, height / 2, Graphics.LEFT | Graphics.TOP);
            shotSounds.playSingleSound("/humiliation.wav"); // Play Sound
		}
        if(gameOver)
        {
        	stop();
        }		
		flushGraphics();
	}	
	
	// Show Text When Playing
	private void displayTextOnScreen(Graphics g) {
		lmgr.paint(g, 0, 0);
        g.setColor(255, 255, 255);

        String scoreString = "Frags: " + score;
        String lifeString = "Life: " + life;
        String bulletString = "Shots: " + bulletShots;
        g.drawString(bulletString, width - g.getFont().stringWidth(bulletString) - 4, 0, Graphics.TOP | Graphics.LEFT);
        g.drawString(lifeString, getWidth() / 2, 20, Graphics.HCENTER | Graphics.BASELINE);
		g.drawString(scoreString, 0, 0, Graphics.TOP | Graphics.LEFT);
		flushGraphics();
	}
	
	// Random Range Number
	private int nextInt(Random r, int lower, int higher) {  
		int x = r.nextInt(higher-lower)+lower;
		return x;
	} 
	
}
    
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -