Как мне сделать так, чтобы мой апплет переходил на стартовую страницу, а затем в игру? Итак, есть кнопка «Пуск», кнопка «Выход», и когда я нажимаю кнопку «Пуск», игра запускается. Пожалуйста, ответьте по возможности простым языком, так как я новичок. Спасибо :)


Main.java

   import java.awt.Graphics;

   public class Main extends GameLoop {
/**
 * 
 */
    private static final long serialVersionUID = 1L;


     public void init(){
       setSize(960,540);
       Thread th = new Thread(this);
       th.start();
       offscreen = createImage(960,540);
       c = offscreen.getGraphics();
       addKeyListener(this);
   }
   public void paint(Graphics g)
   {
    c.clearRect(0,0,960,480);
    c.drawImage(background, 0, 0, this);
    c.drawImage(mario, x, y, 100, 100, this);
    c.drawImage(goomba, ax, ay, 30, 30, this);
    c.drawImage(foreground, 0, 0 , this ); 
    c.drawImage(pipes, 0, 0, this);
    c.drawImage(block1, 0,  0, this);
    c.drawImage(block2, 0,  0, this);
    c.drawImage(block3, 0,  0, this);
    c.drawImage(block4, 0,  0, this);
    c.drawImage(block5, 0,  0, this);
    c.drawImage(block6, 0,  0, this);
    c.drawImage(block7 , 0, 0, this);
    //c.drawImage(blocks, 0, 0, this);
    g.drawImage(offscreen, 0 , 0 ,this);

}
@Override
public void update(Graphics g){
    paint(g);
}

}


GameLoop.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class GameLoop extends Applet implements Runnable, KeyListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
public int x,y,ax,ay;
public Image offscreen;
public Graphics c;
public boolean jump,down,right,left;
public BufferedImage background, foreground, pipes, blocks, block1, block2,        block3, block4, block5, block6, block7,  walk2, walk3, walk4, walk5, walk6,   jumpR,jumpL, mario, goomba, deadMario, money, block;
public BufferedImage Bblock1, Bblock2, Bblock3;
public int wow;
public int wow2;
public double counter = 4;
public int MaxH, MidH, MinH, delta;




@Override
public void run() {
    x = 60;
    y = 440;
    ax = x +5;
    ay = 493;
    MinH = 440;


    try {
        background = ImageIO.read(new File("resources/background1.png"));
        foreground = ImageIO.read(new File("resources/foreground1.png"));
        blocks = ImageIO.read(new File("resources/blocks1.png"));
        pipes = ImageIO.read(new File("resources/pipes1.png"));
        walk2 = ImageIO.read(new File("resources/walk2.png"));
        walk3 = ImageIO.read(new File("resources/walk3.png"));
        walk4 = ImageIO.read(new File("resources/walk4.png"));
        walk5 = ImageIO.read(new File("resources/walk5.png"));
        walk6 = ImageIO.read(new File("resources/walk6.png"));
        jumpR = ImageIO.read(new File("resources/jumpR.png"));
        jumpL = ImageIO.read(new File("resources/jumpL.png"));
        goomba = ImageIO.read(new File("resources/goomba.gif"));
        deadMario = ImageIO.read(new File("resources/deadmario.png"));
        money = ImageIO.read(new File("resources/money.png"));
        block = ImageIO.read(new File("resources/Block.png"));
        block1 = ImageIO.read(new File("resources/block1.png"));
        block2 = ImageIO.read(new File("resources/block2.png"));
        block3 = ImageIO.read(new File("resources/block3.png"));
        block4 = ImageIO.read(new File("resources/block4.png"));
        block5 = ImageIO.read(new File("resources/block5.png"));
        block6 = ImageIO.read(new File("resources/blocks6.png"));
        block7 = ImageIO.read(new File("resources/block7.png"));
        Bblock1 = ImageIO.read(new File("resources/Bblock1.png"));
        Bblock2 = ImageIO.read(new File("resources/Bblock2.png"));
        Bblock3 = ImageIO.read(new File("resources/Bblock3.png"));
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    mario = walk2;
    while(true)
    {
        if (y <=440&& jump != true){
            y += 5;

        }
        if (y <=175){
            y = MinH;
        }

    if(ax != 475 && ax < 475){
        ax++;
    }
    if(ax >= 475 && ax != 60){
        ax = ax - 475;
        repaint();
    }
    if(x >= 468 && x <= 546){
        y=385;
    }
    if(x >= 736 && x <= 826){
        y=355;
    }

    if(x >= 160 && x <= 200 && y < 440 && y > 400){
        y = MinH;
            block1 = block; 

                }

    if(x >= 264 && x <= 338 && y < 440 && y > 400){
        y = MinH;
        block3 = Bblock1;
                }
    if(x >= 339 && x <=410 && y < 440 && y > 400){
        y = MinH;
        block5 = Bblock2;
                }

    if (block1 == block && y >=  440){
        c.drawImage(money, 210, 332,30,20, this);

    }
    if (block3 == Bblock1 && y >=  440){
        c.drawImage(money, 337, 332,30,30, this);

    }
    if (block5 == Bblock2 && y >=  440){
        c.drawImage(money, 395, 332,30,30, this);

    }




        wow++;
        wow2++;
        if(wow >= 20){
            wow = 0;
        }
        if(wow <= 5 && right == true){
            mario = walk2;
        }
        if(wow >= 5 && wow <=10 && right == true){
            mario = walk2;
        }
        if(wow <= 10 && wow >=5 && right == true){
            mario = walk5;
        }
        if(wow >= 10  && wow <=5 &&right == true){
            mario = walk2;
        }


        if(wow2 >= 20){
            wow2 = 0;
        }
        if(wow2 <= 5 && left == true){
            mario = walk3;
        }
        if(wow2 >= 5 && left == true){
            mario = walk6;
        }
        if(wow2 <= 10 && wow >=5 && left == true){
            mario = walk6;
        }
        if(wow2 >= 10  && wow <=5 && left == true){
            mario = walk3;
}   


    if(left == true){
        x-=2;

    }
    if(right == true){
        x+=2;

    }
    if(jump == true){
        counter += 0.1;
     y = y + (int) ((Math.sin(counter ) + Math.cos(counter))*15.5); 

    }
    if(counter == 7){
        counter = 4;
    }
    if(down == true){
        y+=2;

    }

if(y >= MinH ){
        y = MinH;
}

    System.out.println("(" + x + "," + y + ")");
    repaint();

    try {
        Thread.sleep(20);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

}


@Override
public void keyTyped(KeyEvent e) {
// don't use

}


@Override
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == 37 ){
        left = true;
        }
    if(e.getKeyCode() == 38){
        jump = true;
        mario = jumpR;
    }
    if(e.getKeyCode() == 39){
        right = true;
    }
    if(e.getKeyCode() == 40){
        down = true;
    }

}


@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == 37){
        left = false;   
        mario = walk3;
    }
    if(e.getKeyCode() == 38){
        jump = false;
        mario = walk2;
        counter = 4;


    }
    if(e.getKeyCode() == 39){
        right = false;
        mario = walk2;
    }
    if(e.getKeyCode() == 40){
        down = false;
        mario = walk2;
    }
}

}

Jayesh Khullar

Ответов: 1

Ответы (1)

За штатами нужно успевать. Например, у вас будет состояние START и состояние RUNNING. Если игра находится в состоянии НАЧАЛО, вы должны нарисовать начальный экран, если он находится в состоянии РАБОТА, вы должны нарисовать свою игру. Позже у вас могут быть состояния PAUSE и GAME_OVER, чтобы вы могли показывать там разные экраны.

Для этого вам понадобится перечисление State, например:

public enum State
{
    START, RUNNING, PAUSE, GAME_OVER;
}

Затем в вашем классе GameLoop создайте переменную для хранения текущего состояния.

private State state = State.START;

Затем в коде отрисовки и в любом другом месте вы можете проверить переменную текущего состояния и нарисовать соответствующий экран.

public void run()
{
    switch(state)
    {
    case START:
        //DRAW THE START SCREEN
        break;
    case RUNNING:
        //DRAW THE GAME
        break;
    case PAUSE:
        //DRAW THE PAUSE SCREEN
        break;
    case GAME_OVER:
        //DRAW THE GAME OVER SCREEN
        break;
    default:
        throw new RuntimeException("Unknown state: " + state);
    }
}

Более чистым решением было бы иметь класс Screen с методом рисования. Затем ваш GameLoop просто ищет экран, связанный с данным состоянием, и вызывает на нем метод рисования. Таким образом, ваш код рисования остается аккуратно привязанным к каждому экрану, а не размещенным в одном месте. По мере роста количества экранов вы просто добавляете еще одну реализацию экрана. Вот код, чтобы показать, что я имею в виду:

Вот интерфейс экрана. У вас будет реализация экрана для каждого состояния.

public interface Screen
{
    void update();
    void draw();
    void handleInput();
}

Вот пустой пример RunningScreen.

public class RunningScreen implements Screen
{
    @Override
    public void update()
    {
        //UPDATE LOGIC, MOVE ENTITIES OR WHATEVER
    }

    @Override
    public void draw()
    {
        //DRAW THE RUNNING SCREEN
    }

    @Override
    public void handleInput()
    {
        //CHECK FOR USER INPUT AND UPDATE THE SCREEN STATE
    }

}

Вот пустой пример StartScreen.

public class StartScreen implements Screen
{

    @Override
    public void update()
    {
        //UPDATE THE START SCREEN
    }

    @Override
    public void draw()
    {
        //DRAW THE START SCREEN
    }

    @Override
    public void handleInput()
    {
        //CHECK FOR INPUT, TRANSITION TO THE RUNNING SCREEN WHEN THE USER CLICKS START
    }

}

Ваш игровой цикл просматривает экран, зарегистрированный для обработки текущего состояния, затем вызывает соответствующие методы.

public class GameLoop
{
    private State state = State.START;
    private Map screens = new HashMap<>();

    public void addScreen(State state, Screen screen)
    {
        screens.put(state, screen);
    }

    public void run()
    {
        Screen screen = screens.get(state);
        screen.handleInput();
        screen.update();
        screen.draw();
    }
}

Тогда ваш Main может выглядеть примерно так. Он создает новый GameLoop и регистрирует экраны для каждого состояния.

public class Main
{
    public static void main(String[] args)
    {
        GameLoop game = new GameLoop();
        game.addScreen(State.START, new StartScreen());
        game.addScreen(State.RUNNING, new RunningScreen());
        //Add other states here
        game.run();
    }
}

Надеюсь, это даст вам некоторые идеи о том, как реализовать нужную вам функциональность.

2022 WebDevInsider