Everything is going peachy thus far except for the direction of the bullets. I've already got it down so the image of the character changes based on LEFT, RIGHT, UP, DOWN; but I can't seem to get the bullets to travel in the direction the character is facing.
If you test the game below the bullets will fire left or right depending on which way you're facing but if you are facing right and fire, the bullets go right, but if you turn left while those bullets are traveling they turn and start going the other way.
It's kind of hard to explain without testing it yourself. (I've added comments for the code I've added for changing bullet direction)
I believe the answer to my problem is in this bit of code adding something to handle each index of the ArrayList for each bullet, but I've been trying different things and what I have now is the best I've gotten.
for (int i = 0; i < ms.size(); i++) {
Shoot m = (Shoot) ms.get(i);
if (m.isVisible()) {
faceNum = mario.facing(); //ADDED FOR BULLET DIRECTION
m.move(faceNum); //ADDED FOR BULLET DIRECTION
}
else ms.remove(i);
}
Zel.java (Main Class)
package zelm;
import javax.swing.JFrame;
import java.io.*;
import java.util.*;
public class Zel extends JFrame {
public Zel()throws IOException {
add(new Board());
setTitle("Zel");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1000, 1000);
setLocationRelativeTo(null);
setVisible(true);
setResizable(false);
}
public static void main(String[] args)throws IOException {
new Zel();
new Character();
}
}
Board.java
package zelm;
import java.util.*;
import java.io.*;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.Timer;
public class Board extends JPanel implements ActionListener {
BufferedImage bgImage;
public Timer timer;
Character mario;
public ArrayList badGuys;
public boolean ingame;
public int B_WIDTH, B_HEIGHT, faceNum;
public int[][] pos = {
{2380, 29}, {2500, 59}, {1380, 89},
{780, 109}, {580, 139}, {680, 239},
{790, 259}, {760, 50}, {790, 150},
{980, 209}, {560, 45}, {510, 70},
{930, 159}, {590, 80}, {530, 60},
{940, 59}, {990, 30}, {920, 200},
{900, 259}, {660, 50}, {540, 90},
{810, 220}, {860, 20}, {740, 180},
{820, 128}, {490, 170}, {700, 30}
};
public Board()throws IOException {
bgImage = ImageIO.read(getClass().getResourceAsStream("res/forestBG.gif"));
//setBackground(Color.WHITE);
addKeyListener(new TAdapter());
setFocusable(true);
setDoubleBuffered(true);
ingame = true;
mario = new Character();
initBadGuys();
timer = new Timer(5, this);
//timer.setInitialDelay(10);
timer.start();
}
public void addNotify() {
super.addNotify();
B_WIDTH = getWidth();
B_HEIGHT = getHeight();
}
public void initBadGuys()throws IOException {
badGuys = new ArrayList();
for (int i=0; i<pos.length; i++)
badGuys.add(new badGuy(pos[i][0], pos[i][1]));
}
public void paint(Graphics g) {
//g.drawImage(bgImage, 0, 0, null);
super.paint(g);
if (ingame) {
Graphics2D g2d = (Graphics2D)g;
g.drawImage(bgImage, 0, 0, null);
//setBackground(Color.BLACK);
if (mario.isVisible())
g2d.drawImage(mario.getCharacter(), mario.getX(), mario.getY(), this);
ArrayList ms = mario.getBullets();
for (int i = 0; i < ms.size(); i++ ) {
Shoot m = (Shoot) ms.get(i);
g2d.drawImage(m.getBullet(), m.getX(), m.getY(), this);
}
for (int i = 0; i < badGuys.size(); i++) {
badGuy a = (badGuy)badGuys.get(i);
if (a.isVisible())
g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);
}
g2d.setColor(Color.BLACK);
g2d.drawString("Bad Guys left: " + badGuys.size(), 5, 15);
} else {
String msg = "Game Over";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);
g.setColor(Color.BLACK); //color.WHITE
g.setFont(small);
g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2,
B_HEIGHT / 2);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void actionPerformed(ActionEvent e) {
if (badGuys.size() == 0) {
ingame = true; //false for end game
}
ArrayList ms = mario.getBullets();
/*for (int i = 0; i < ms.size(); i++) {
Shoot m = (Shoot) ms.get(i);
if (m.isVisible())
m.move();
else ms.remove(i);
}*/
for (int i = 0; i < ms.size(); i++) {
Shoot m = (Shoot) ms.get(i);
if (m.isVisible()) {
faceNum = mario.facing(); //ADDED FOR BULLET DIRECTION
m.move(faceNum); //ADDED FOR BULLET DIRECTION
}
else ms.remove(i);
}
for (int i = 0; i < badGuys.size(); i++) {
badGuy a = (badGuy) badGuys.get(i);
if (a.isVisible())
a.move();
else badGuys.remove(i);
}
mario.move();
checkCollisions();
repaint();
}
public void checkCollisions() {
Rectangle r3 = mario.getBounds();
for (int j = 0; j<badGuys.size(); j++) {
badGuy a = (badGuy) badGuys.get(j);
Rectangle r2 = a.getBounds();
if (r3.intersects(r2)) {
mario.setVisible(false);
a.setVisible(false);
ingame = false;
}
}
ArrayList ms = mario.getBullets();
for (int i = 0; i < ms.size(); i++) {
Shoot m = (Shoot) ms.get(i);
Rectangle r1 = m.getBounds();
for (int j = 0; j<badGuys.size(); j++) {
badGuy a = (badGuy) badGuys.get(j);
Rectangle r2 = a.getBounds();
if (r1.intersects(r2)) {
m.setVisible(false);
a.setVisible(false);
}
}
}
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
mario.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
try {
mario.keyPressed(e);
}catch (IOException r){}
}
}
}
Character.java
package zelm;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Character {
public int dx, dy, x, y, width, height, faceNum = 1;
BufferedImage charImage, charImageLeft, charImageUp, charImageDown;
public ArrayList bullets;
//public final int CHAR_SIZE = 20;
public boolean visible, charFaceLeft = false, charFaceRight = true,
charFaceUp = false, charFaceDown = false;
public Character()throws IOException {
charImage = ImageIO.read(getClass().getResourceAsStream("res/character.gif"));
charImageLeft = ImageIO.read(getClass().getResourceAsStream("res/characterLeft.gif"));
charImageUp = ImageIO.read(getClass().getResourceAsStream("res/characterUp.gif"));
charImageDown = ImageIO.read(getClass().getResourceAsStream("res/characterDown.gif"));
bullets = new ArrayList();
visible = true;
width = charImage.getWidth(null);
height = charImage.getHeight(null);
x = 40;
y = 60;
}
public int facing() { //ADDED METHOD FOR BULLET DIRECTION
if (charFaceRight)
faceNum = 1;
if (charFaceLeft)
faceNum = 2;
return faceNum;
}
public void move() {
x += dx;
y += dy;
if (x < 1)
x = 1;
if (y < 1)
y =1;
if (x > 970)
x = 970;
if (y > 945)
y = 945;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Image getCharacter() {
if(charFaceRight == true)
return charImage;
if(charFaceLeft == true)
return charImageLeft;
if(charFaceUp == true)
return charImageUp;
if(charFaceDown == true)
return charImageDown;
return charImageLeft;
}
public ArrayList getBullets() {
return bullets;
}
public void setVisible(boolean visible) {
this.visible = visible;
}
public boolean isVisible() {
return visible;
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
public void keyPressed(KeyEvent e)throws IOException {
int key = e.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
fire();
}
if (key == KeyEvent.VK_LEFT) {
dx = -1;
charFaceUp = false;
charFaceDown = false;
charFaceRight = false;
charFaceLeft = true;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 1;
charFaceUp = false;
charFaceDown = false;
charFaceLeft = false;
charFaceRight = true;
}
if (key == KeyEvent.VK_UP) {
dy = -1;
charFaceDown = false;
charFaceLeft = false;
charFaceRight = false;
charFaceUp = true;
}
if (key == KeyEvent.VK_DOWN) {
dy = 1;
charFaceUp = false;
charFaceLeft = false;
charFaceRight = false;
charFaceDown = true;
}
}
public void fire()throws IOException {
if (charFaceRight = true)
bullets.add(new Shoot(x + width, y + height/2));
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
}
Shoot.java
package zelm;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.io.*;
import java.util.*;
import javax.swing.ImageIcon;
import javax.imageio.ImageIO;
public class Shoot {
int x, y, width, height, faceNumber;
BufferedImage bulletImage;
boolean visible;
final int BOARD_WIDTH = 990;
final int BOARD_HEIGHT = 990;
final int BULLET_SPEED = 2;
public Shoot(int x, int y)throws IOException {
bulletImage = ImageIO.read(getClass().getResourceAsStream("res/bullet.jpg"));
visible = true;
width = bulletImage.getWidth(null);
height = bulletImage.getHeight(null);
this.x = x;
this.y = y;
}
public Image getBullet() {
return bulletImage;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isVisible() {
return visible;
}
public void setVisible(Boolean visible) {
this.visible = visible;
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
public void move(int faceNumber) {
if(faceNumber == 1) //ADDED FOR BULLET DIRECTION
x += BULLET_SPEED;
if(faceNumber == 2) //ADDED FOR BULLET DIRECTION
x-= BULLET_SPEED;
if (x > BOARD_WIDTH || x < 1 || y > BOARD_HEIGHT || y < 1)
visible = false;
}
}
badGuy.java
package zelm;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
public class badGuy {
public int x, y, width, height;
public boolean visible;
BufferedImage bowserImage;
public badGuy(int x, int y)throws IOException {
bowserImage = ImageIO.read(getClass().getResourceAsStream("res/bowser.gif"));
width = bowserImage.getWidth(null);
height = bowserImage.getHeight(null);
visible = true;
this.x = x;
this.y = y;
}
public void move() {
if (x < 0)
x = 1000;
x -= 1;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isVisible() {
return visible;
}
public void setVisible(Boolean visible) {
this.visible = visible;
}
public Image getImage() {
return bowserImage;
}
public Rectangle getBounds() {
return new Rectangle(x, y, width, height);
}
}
Any help is appreciated!

New Topic/Question
Reply




MultiQuote





|