这可能是一个非常无聊的问题.我刚刚开始学习Java
我不明白paintComponent方法的操作.我知道如果我想画一些东西,我必须覆盖paintComponent方法.
public void paintComponent(Graphics g)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但它何时被称为?我从来没有看到像"object.paintComponent(g)"这样的东西,但它仍然是在程序运行时绘制的.
什么是Graphics参数?这个从哪里来?调用方法时必须提供参数.但正如我之前所说,似乎永远不会明确地调用此方法.那么谁提供这个参数呢?为什么我们必须将其转换为Graphics2D?
public void paintComponent(Graphics g)
{
...
Graphics2D g2= (Graphics2D) g;
...
}
Run Code Online (Sandbox Code Playgroud) 谷歌提供BaseGameUtils图书馆,并建议我们扩展它BaseGameActivity.但是,该课程使游戏在游戏开始时自动登录.如果玩家不想或不能连接到他的Google帐户,那么在游戏开始时这可能非常耗时.
所以我不想要这个功能.相反,我想提供一个登录按钮.只有当他点击该按钮时才能连接播放器.从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮.我怎样才能做到这一点?
我在git中有一个跟踪文件,但现在我不想再跟踪它了(我不希望它出现在下一次提交中,但我仍然希望将它放在文件夹中).
在Changes工具窗口中,我已将该文件设置为但ignored在Configured Ignored Files某种程度上,当我更改该文件时,更改仍显示在更改列表中?
这些线条是否相同?
float a = 2.0f;
Run Code Online (Sandbox Code Playgroud)
和
float a = 2.000000f;
Run Code Online (Sandbox Code Playgroud) 我已经通过libgdx构建了一个游戏并将apk文件上传到开发者控制台.但是,它说
您的制作APK需要符合以下条件:
- 您的布局应该利用平板电脑上的可用空间
那么我应该对布局做出哪些改变?因为据我所知,在libgdx中,布局与游戏完全无关.
在这里的教程中,它表明完全可以为同一个包名使用两个OAuth 2.0客户端ID.
您应该创建两个客户端ID,一个具有发布证书指纹,另一个具有调试证书指纹.确保为两者使用相同的包名称.这允许Play游戏服务识别来自您使用任一证书签名的链接APK的呼叫
于是,我按照上面的链接教程:第一去Game Service的Developer Console,Add a new Game.然后我添加了一个Linked app这个游戏,它需要我创建一个OAuth 2.0客户端ID.使用我的发布密钥的SHA1创建第一个客户端ID后,我找不到任何按钮来创建另一个客户端ID.所以我转到Cloud Developer Console,发现我可以在APIs & auth- > 下创建第二个客户端ID Credentials.我使用我debug.keystore的SHA1作为第二个客户端ID.然后我用调试密钥和释放密钥编译和测试我的示例游戏.
但是,在运行应用程序并尝试登录后,结果是只接受使用发布密钥的应用程序(使用第一个客户端ID),而使用调试密钥的应用程序(使用第二个客户端ID)不是公认.
然后我尝试在Cloud Developer Console中删除我的发布密钥的客户端ID(以便调试密钥的客户端ID仍然是那里唯一的客户端ID)并再次测试我的应用程序.这次,接受使用调试密钥的应用程序,并且当然不接受使用释放密钥的应用程序.
这是否意味着我无法为同一个包名创建多个OAuth 2.0客户端ID?
synchronized (Foo.class) {
while (someCondition) {
try {
Foo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
似乎这个线程在其他一些线程调用时interrupt()或notify()在此线程上都会唤醒.这两者有什么不同吗?
- 编辑 -
我知道一个用于通知一个对象,另一个用于中断一个线程.但是这两者都导致了相同的结果,也就是说,这个线程被唤醒了,所以我想问的是这两种情况的后果是如何相互不同的.
根据这篇文章,SpriteBatch实例需要在dispose()不再需要时调用.然而,当我查看一些libgdx的官方例子,如Pax Britannica和Super Jumper时,我发现他们从不打电话SpriteBatch.dispose().这是为什么?
从Java 7开始,我们可以使用try-with-resources语句:
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
Run Code Online (Sandbox Code Playgroud)
如果br.readLine()和br.close() 两个抛出异常,readFirstLineFromFile将从try块抛出异常(异常),并且将禁止来自try-with-resources语句的隐式finally块(异常)的异常.br.readLine()br.close()
在这种情况下,我们可以通过从try块的异常调用方法来从隐式finally块中检索抑制的异常,如下所示:getSuppresed
try {
readFirstLineFromFile("Some path here..."); // this is the method using try-with-resources statement
} catch (IOException e) { // this is the exception from the try block
Throwable[] suppressed = e.getSuppressed();
for …Run Code Online (Sandbox Code Playgroud) 我知道可以用这种方式检索指针索引
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
Run Code Online (Sandbox Code Playgroud)
它在某些方法中用作参数,如event.getPointerId(int pointerIndex)或event.getX(int pointerIndex)
但我不明白它的意义是什么,以及它如何从一个事件改变到另一个事件