В моем коде каждый раз, когда я двигаю плеер, лабиринт снова рисует сам. Я не могу добавить врагов, потому что когда я это делаю, экран начинает сходить с ума и рисует сам себя еще быстрее. Так вот мой код. Я пытаюсь создать игру, которая на самом деле является лабиринтом и марио. Будут враги, которые попытаются напасть на него и убить его, он должен go до конца (зеленый блок).
Проблема в том, что каждый раз, когда игрок перемещает, весь лабиринт снова рисует сам. Я буду рад получить помощь здесь.
//This is my class
public class Maze extends JFrame{
Enemy e1;
Mario mario;
Coin c1;
int scores=0;
//pathX and pathY are the first cordination of mario player
int pathX= 1;
int pathY =1;
//The maze conatins 1-blocked, 0-empty place to go.
private int[][] maze =
{ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, Globals.MARIO, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1},
{1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, Globals.EXIT, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
public int[][] getMaze() {
return maze;
}
public Maze() {
setTitle("Welcome to mario maze!");
setSize(640,480);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//mario gets x,y in the maze , width and height, health, speed and scores=0.
mario=new Mario(pathX,pathY,30, 30,100,3.0f,scores);
e1= new Enemy(6,4,30,30,100,1.0f,this);
}
}
//this function call other functions of painting.
public void paint(Graphics g) {
super.paint(g);
g.translate(50,50);
drawMaze(g);
drawMario(g);
showMarioDetails(g);
showCoins(g);
//e1.paint(g);
Enemy e2= new Enemy (7,7,30,30,100,1.0f,this);
//e2.paint(g);
// EnemyAttacking(mario,e1 );
}
//This is the function that draws the maze:
public void drawMaze(Graphics g)
{
//Lets draw the maze now:
for (int row = 0; row < maze.length; row++)
{
for (int col = 0; col < maze[0].length; col++)
{
Color color=null;
switch(maze[row][col])
{
case Globals.BLOCKED:
{
g.setColor(Color.BLACK);
g.drawRect(30*col, 30*row,30,30);
g.setColor(Color.BLACK);
g.fillRect(30*col, 30*row,30,30);
g.drawImage(new ImageIcon(this.getClass().getResource("../images/tree1.png")).getImage(),col*30,row*30,30,30,this);
break;
}
case Globals.EXIT: color= Color.GREEN; break;
default: color=Color.WHITE; break;
}
if (maze[row][col] !=1)
{
g.setColor(color);
g.fillRect(30*col, 30*row,30,30);
g.setColor(Color.BLACK);
g.drawRect(30*col,30*row,30,30);
}
}
}
}
//This is the function that draws mario.
public void drawMario(Graphics g)
{
mario.setX(pathX);
mario.setY(pathY);
if(mario.getHealth()>0)
{
g.drawImage(mario.getTexture(), mario.getX()*30,mario.getY()*30,30, 30, this);
}
}
protected void processKeyEvent(KeyEvent e)
{
if (e.getID() != KeyEvent.KEY_PRESSED) //check if the player pressed some button.
{
return;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) //check if the player pressed the right button.
{
if(maze[pathY][pathX+1]!=1)
{
pathX++;
mario.setMarioPic(3);
}
}
else
if (e.getKeyCode() == KeyEvent.VK_LEFT) //check if the player pressed the left button.
{
if(maze[pathY][pathX-1]!=1)
{
pathX--;
mario.setMarioPic(2);
}
}
else
if( e.getKeyCode()== KeyEvent.VK_UP) //check if the player pressed the up button.
{
if(maze[pathY-1][pathX]!=1)
{
pathY--;
mario.setMarioPic(1);
}
}
else
if(e.getKeyCode()==KeyEvent.VK_DOWN) //check if the player pressed the down button.
{
if(maze[pathY+1][pathX]!=1)
{
pathY++;
mario.setMarioPic(0);
}
}
repaint();
}