📄 battle.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 + -