【问题标题】:Problems with packages understanding包理解问题
【发布时间】:2020-06-12 01:31:00
【问题描述】:

我正在用 java 制作游戏,所以我需要一些帮助。 我想在包中组织我的代码,但我不明白属于哪个 .java 文件。 My file organization

App.java

package main;
import engine.io.Window;
import org.lwjgl.glfw.GLFW;
public class App implements Runnable {
    public Thread game;
    public static Window window;
    public static final int WIDTH = 1280, HEIGHT = 760;
    public void start() {
        game = new Thread(this, "game");
        game.start();
    }
    public static void init() {
        window = new Window(WIDTH, HEIGHT, "Game");
        window.create();
    }
    public void run() {
        init();
        while (!window.shouldClose()) {
            update();
            render();
        } 
    }
    private void update() {
        window.update();
    }
    private void render() {
        window.swapBuffers();
    }
    public static void main(String[] args) {
        new App().start();
    }
}

还有Window.java

package engine.io;

import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWVidMode;

public class Window {
    private int width, height;
    private String title;
    private long window;
    public int frames;
    public static long time;

    public Window(int width, int height, String title) {
        this.width = width;
        this.height = height;
        this.title = title;
    }

    public void create() {
        if (!GLFW.glfwInit()) {
            System.err.println("ERROR: GLFW wasn't initializied");
            return;
        }

        window = GLFW.glfwCreateWindow(width, height, title, 0, 0);

        if (window == 0) {
            System.err.println("ERROR: Window wasn't created");
            return;
        }

        GLFWVidMode videoMode = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor());
        GLFW.glfwSetWindowPos(window, (videoMode.width() - width) / 2, (videoMode.height() - height) / 2);
        GLFW.glfwMakeContextCurrent(window);


        GLFW.glfwShowWindow(window);

        GLFW.glfwSwapInterval(1);

        time = System.currentTimeMillis();
    }

    public void update() {
        GLFW.glfwPollEvents();
        frames++;
        if (System.currentTimeMillis() > time + 1000) {
            GLFW.glfwSetWindowTitle(window, title + " | FPS: " + frames);
            time = System.currentTimeMillis();
            frames = 0;
        }
    }

    public void swapBuffers() {
        GLFW.glfwSwapBuffers(window);
    }

    public boolean shouldClose() {
        return GLFW.glfwWindowShouldClose(window);
    }
}

我收到以下错误: 声明的包“main”与预期的包“ourRTS”不匹配 和 无法解析导入引擎。

【问题讨论】:

  • 我不会将包命名为“main”。我会使用 engine.io 作为包。你有域名吗?许多人使用 ip-name 来保留自己的名字,例如 'package engine.foobar.com;'
  • 你的目录结构与包名匹配吗? IE。 App.java 在名为main/Window.javaengine/io/ 的文件夹中,与您项目的根目录相关吗?你使用的是什么目录布局?

标签: java package naming


【解决方案1】:

将一个目录视为“默认”或“主”目录;无论它是什么,它的名称都不必与项目相关。它可以在磁盘的根目录,也可以不在根目录,它可以从根目录向下很多层,这样它的位置无关紧要。

应用程序中每个包中的第一个名称(在第一个句点之前)是该“默认”目录之外的目录名称。每个包中的连续名称(每个句点之后)是前一个包名称段下的目录级别。

您拥有“engine.io”,因此在您的默认目录下您将拥有目录“engine”,并且在该目录下有一个名为“io”的目录。包“engine.io”中的所有java文件必须在io目录中。

这些是目录和包名称,因为它们必须存在于您的 java 文件和项目中。在 Eclipse 中,默认目录通常命名为“src”,有时顶级包名目录位于该目录下。我不知道你的是否是这样组织的,但这是一种常见的方式。

【讨论】:

  • 所以在 App.java 中应该是“package ourRTS.src.main;”是的???而对于 Window.java “package ourRTS.src.engine.io;”所以呢?
  • 包通常都是小写的。
  • @Slava_Yarmolenko 我不知道包裹应该是什么。你有一个目录.../src/engine/engine.io(它不能在包中保存java文件,顺便说一句),你有.../src/main/java/ourRTS。如果您打算将 java 文件放在后者中,那么是的,包必须是(或以)ourRTS 结尾,这会起作用,但会破坏小写包名称的 java 命名约定。我认为您的意思是前者的 /src/engine/io ,但是我不知道您的“基本”(“默认”,“根”)目录是什么-两个具有源的目录应该是相同的。
  • 我已将我的文件夹结构的屏幕截图放在一个链接中。
  • 是的,我在上一条评论中提到了它。我不知道包的“根”目录是/src/还是/src/main/java。
猜你喜欢
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2011-10-11
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多