java中world有关该如何学习?

本人是刚开始学计算机,目前学校在教java。遇到的问题是常常遇到“写一个小游戏”这种问题,不是普通的小游戏,带图像的创建world的那种,使用javalib.worldimages以及javalib.funworld。这种不知道该如何去写,搞不清楚整体应该如何安排,没有思路。请问自学的话有什么渠道?最好是那种视频带着做这种游戏,有具体例子。以及,怎样学习构建class的思路?
举个例子,制作经典的《太空侵略者》这个游戏,大概要实现的样子如图:

img

知道这种需要用到ontick方法,但是不知道具体是怎么运作的,自己写不会写。

利用JAVASE的东西,画这个图其实很简单,不简单的是这个子弹的生命周期的控制。
1、红色方块其实是很多的对象,他有生命值,当一个子弹跟他有碰撞后,就会减少一定生命值的血量,到负数的时候,就将它销毁,说白了,就是将他移出JPanel,再将它设置为null;方便下一次GC回收他。
2、当发射一个子弹后,其实每个子弹是一个线程,当子弹碰撞到方块后,将这个线程销毁。
3、下面的发射枪其实是一个图片,只是程序中将通过键盘左右移动,点击鼠标左键来发射子弹。
具体的有个教程,看看韩顺平的java教程里面就有坦克大战,里面详细的讲了。希望对你有所帮助

给你你个参考资料很好的

在 Java 2D 游戏教程的这一部分中,我们将使用 Java 创建一个简单的太空侵略者游戏克隆。 源代码和图像可在作者的 Github Java-Space-Invaders 存储库中找到。

太空侵略者是由 Nishikado Tomohiro Nishikado 设计的街机游戏。 它于 1978 年首次发布。

在“太空侵略者”游戏中,玩家控制一门大炮。 他即将拯救地球免遭邪恶太空入侵者的入侵。

用 Java 开发太空侵略者
在我们的 Java 克隆中,我们有 24 个入侵者。 这些外星人重重炮击地面。 当玩家射击导弹时,只有当导弹击中外星人或棋盘顶部时,他才能射击另一枚导弹。 玩家使用空格键射击。 外星人随机发射炸弹。 每个外星人只有在前一个击中底部后才会发射炸弹。

com/zetcode/SpaceInvaders.java

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.JFrame;

public class SpaceInvaders extends JFrame {

public SpaceInvaders() {

    initUI();
}

private void initUI() {

    add(new Board());

    setTitle("Space Invaders");
    setSize(Commons.BOARD_WIDTH, Commons.BOARD_HEIGHT);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setLocationRelativeTo(null);
}

public static void main(String[] args) {

    EventQueue.invokeLater(() -> {

        var ex = new SpaceInvaders();
        ex.setVisible(true);
    });
}

}

这是主要的类。 它设置了应用。

com/zetcode/Commons.java

package com.zetcode;

public interface Commons {

int BOARD_WIDTH = 358;
int BOARD_HEIGHT = 350;
int BORDER_RIGHT = 30;
int BORDER_LEFT = 5;

int GROUND = 290;
int BOMB_HEIGHT = 5;

int ALIEN_HEIGHT = 12;
int ALIEN_WIDTH = 12;
int ALIEN_INIT_X = 150;
int ALIEN_INIT_Y = 5;

int GO_DOWN = 15;
int NUMBER_OF_ALIENS_TO_DESTROY = 24;
int CHANCE = 5;
int DELAY = 17;
int PLAYER_WIDTH = 15;
int PLAYER_HEIGHT = 10;

}

Commons.java文件具有一些公共常数。 他们是不言自明的。

com/zetcode/sprite/Alien.java

package com.zetcode.sprite;

import javax.swing.ImageIcon;

public class Alien extends Sprite {

private Bomb bomb;

public Alien(int x, int y) {

    initAlien(x, y);
}

private void initAlien(int x, int y) {

    this.x = x;
    this.y = y;

    bomb = new Bomb(x, y);

    var alienImg = "simg/alien.png";
    var ii = new ImageIcon(alienImg);

    setImage(ii.getImage());
}

public void act(int direction) {

    this.x += direction;
}

public Bomb getBomb() {

    return bomb;
}

public class Bomb extends Sprite {

    private boolean destroyed;

    public Bomb(int x, int y) {

        initBomb(x, y);
    }

    private void initBomb(int x, int y) {

        setDestroyed(true);

        this.x = x;
        this.y = y;

        var bombImg = "simg/bomb.png";
        var ii = new ImageIcon(bombImg);
        setImage(ii.getImage());
    }

    public void setDestroyed(boolean destroyed) {

        this.destroyed = destroyed;
    }

    public boolean isDestroyed() {

        return destroyed;
    }
}

}

这是Alien子画面。 每个外星人都有一个内部的Bomb类。

public void act(int direction) {

this.x += direction;

}

从Board类中调用act()方法。 用于在水平方向上定位外星人。

public Bomb getBomb() {

return bomb;

}

当外星人将要投下炸弹时,将调用getBomb()方法。

com/zetcode/sprite/Player.java

package com.zetcode.sprite;

import com.zetcode.Commons;

import javax.swing.ImageIcon;
import java.awt.event.KeyEvent;

public class Player extends Sprite {

private int width;

public Player() {

    initPlayer();
}

private void initPlayer() {

    var playerImg = "simg/player.png";
    var ii = new ImageIcon(playerImg);

    width = ii.getImage().getWidth(null);
    setImage(ii.getImage());

    int START_X = 270;
    setX(START_X);

    int START_Y = 280;
    setY(START_Y);
}

public void act() {

    x += dx;

    if (x <= 2) {

        x = 2;
    }

    if (x >= Commons.BOARD_WIDTH - 2 * width) {

        x = Commons.BOARD_WIDTH - 2 * width;
    }
}

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {

        dx = -2;
    }

    if (key == KeyEvent.VK_RIGHT) {

        dx = 2;
    }
}

public void keyReleased(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {

        dx = 0;
    }

    if (key == KeyEvent.VK_RIGHT) {

        dx = 0;
    }
}

}

这是Player子画面。 我们用光标键控制大炮。

int START_X = 270;
setX(START_X);

int START_Y = 280;
setY(START_Y);

这些是播放器精灵的初始坐标。

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

if (key == KeyEvent.VK_LEFT) {

    dx = -2;
}

...

如果按左光标键,则dx变量将设置为 -2。 下次调用act()方法时,播放器向左移动。

public void keyReleased(KeyEvent e) {

int key = e.getKeyCode();

if (key == KeyEvent.VK_LEFT) {

    dx = 0;
}

if (key == KeyEvent.VK_RIGHT) {

    dx = 0;
}

}

如果释放左或右光标,则dx变量将设置为零。 播放器精灵停止移动。

com/zetcode/sprite/Shot.java

package com.zetcode.sprite;

import javax.swing.ImageIcon;

public class Shot extends Sprite {

public Shot() {
}

public Shot(int x, int y) {

    initShot(x, y);
}

private void initShot(int x, int y) {

    var shotImg = "simg/shot.png";
    var ii = new ImageIcon(shotImg);
    setImage(ii.getImage());

    int H_SPACE = 6;
    setX(x + H_SPACE);

    int V_SPACE = 1;
    setY(y - V_SPACE);
}

}

这是Shot子画面。 用 Space 键触发射击。 H_SPACE和V_SPACE常数用于适当地定位导弹。

com/zetcode/sprite/Sprite.java

package com.zetcode.sprite;

import java.awt.Image;

public class Sprite {

private boolean visible;
private Image image;
private boolean dying;

int x;
int y;
int dx;

public Sprite() {

    visible = true;
}

public void die() {

    visible = false;
}

public boolean isVisible() {

    return visible;
}

protected void setVisible(boolean visible) {

    this.visible = visible;
}

public void setImage(Image image) {

    this.image = image;
}

public Image getImage() {

    return image;
}

public void setX(int x) {

    this.x = x;
}

public void setY(int y) {

    this.y = y;
}

public int getY() {

    return y;
}

public int getX() {

    return x;
}

public void setDying(boolean dying) {

    this.dying = dying;
}

public boolean isDying() {

    return this.dying;
}

}