小编Sha*_*ild的帖子

画布 - 良好的渲染实践?

我最近一直在使用Canvas进行小型Java游戏,我注意到会发生许多奇怪的事情.例如,今天早些时候我创造了一个小游戏,其目标是射击敌舰并获得积分.游戏在屏幕上绘制了微小的32x32图像(有时稍微大一些),并且由于我无视的原因,游戏呈现出奇怪的效果.

例如,我的船上面有一个健康栏:

在此输入图像描述

正如您在图像中看到的那样,纹理非常小.尽管如此,游戏仍然滞后,有时事情会像这样呈现不正确,例如:

在此输入图像描述

如果你仔细观察健康栏的顶部,你可以看到它略微向上移动,它让我感到困惑,因为我的所有渲染都被缓冲了.

我的渲染代码:

public void render(){
    BufferStrategy bs = getBufferStrategy();
    if(bs == null){
        createBufferStrategy(3);
        return;
    }
    Graphics2D g = (Graphics2D)bs.getDrawGraphics();
    toDrawG.setColor(new Color(0x222222));
    toDrawG.fillRect(0, 0, WIDTH, HEIGHT);
    draw((Graphics2D)toDrawG);
    g.drawImage(toDraw, 0, 0, null);
    g.dispose();
    bs.show();
}

public void draw(Graphics2D g){
    if(Settings.planets){
    renderer.renderPlanets();
    }
    if(level != null){
    for(int i = 0 ; i < level.entityList.size(); i++){
        if(level.entityList.get(i) != null){
        level.entityList.get(i).render(renderer);
        }
        }
    }
    renderer.overlayString("Space Game", 20, 20, 24, 0xFFFFFF);
    renderer.overlayString(VERSION, 20, 50, 24, 0xFFFFFF);
    renderer.overlayString("FPS: " + renderer.fps, 20, 70, 24, …
Run Code Online (Sandbox Code Playgroud)

java rendering

17
推荐指数
2
解决办法
5579
查看次数

如何检查两个字符串是否大致相等?

我正在为一个游戏做一个聊天响应者,我想知道是否有一种方法可以比较两个字符串,看看它们是否相近于彼此,例如:

如果有人输入:"力量等级?" 它会做一个函数..然后如果有人输入:"Str level?" 它会做同样的功能,但我想它,这样,如果有人做了一个错字或类似的东西,它会自动检测他们试图键入例如什么:"力量tlevel" 也会使函数被调用.

我在这里问的是一些简单的东西,还是需要我做一个巨大的刺激性功能来检查字符串?

如果你对我的解释感到困惑(不是我的优点之一)那么这基本上就是我所要求的.

如何检查两个字符串是否彼此相似?

java string

16
推荐指数
2
解决办法
1万
查看次数

如何绘制大型BufferedImage的一部分?

我有一个10000x10000 BufferedImage而且我只想把它的一部分画到a Canvas,有没有办法用args这样做:

x, y, width, height

例如,drawImage(img,x,y,width,height)会从图像开始绘制一个矩形,从(x,y)开始,并以(width,height)为维度?

编辑:

我要重新提出这个问题:

我有一个10000x10000的图像,我只想在屏幕上显示它的一部分,只是将它偏移x和y的问题是,这仍然会导致整个图像被渲染时出现延迟,其中大部分都是在画布上.我怎么能基本上这样做才能渲染整个图像,但我可以滚动它而不会导致画布滞后?

java graphics rendering bufferedimage

6
推荐指数
1
解决办法
1万
查看次数

我可以使用lambda表达式来累积变量中的和吗?

我有一个Item[] items包含一些关于自身的基本统计数据.

public float getAttackDamage() {
    float bonus = 0;
    for(int i = 0 ; i < items.length; i++){
        if(items[i] != null){
            bonus += items[i].getAttackDamage();
        }
    }
    return baseAttackDamage + attackDamageScaling * level + bonus;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是我当前循环我的字符项并将它们getAttackDamage()应用于返回结果的方式.

有没有办法可以重写这个来使用lambda表达式?我试过以下:

public float getAttackDamage() {
    float bonus = 0;
    Arrays.stream(items).forEach(i -> bonus += i.getAttackDamage());
    return baseAttackDamage + attackDamageScaling * level + bonus;
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用(编译器错误).这可能吗?

java lambda java-8 java-stream

6
推荐指数
1
解决办法
1629
查看次数

在Windows中,实际上是剪贴板?

这可能听起来像一个愚蠢的问题,但实际上是剪贴板?我注意到剪贴板的使用方式比我原先想象的要复杂得多,我的好奇心飙升了.我认为剪贴板基本上跟踪了一串文本,一个图像或一个文件,然后只是将它粘贴到用户指定的任何地方(如果上下文匹配).

然而,对于像MS Word这样的文字处理软件,我注意到你可以直接从网站上复制和粘贴样式,而在skype这样的程序上,你可以在记事本文件中复制看似普通文本的引号,但实际上是skype的ui格式化的注释. .

我看了一个虚假的skype报价生成器的源代码,看起来有多个剪贴板?或者剪贴板是否放置在Key-Value类型的地图中?

windows clipboard

5
推荐指数
1
解决办法
276
查看次数

BoxLayout忽略setYAlighment

这是一个功能:

/**
 * Creates an instance of a JLabel with the given arguments
 * @param text The text to be displayed on the Label
 * @param font The font of the label
 * @param bold set to true if you want the label's text to be bold
 * @param fontSize The size of the font to be rendered
 * @param alignment An alignment (E.g. CENTER_ALIGNMENT)
 * @param verticleAlignment an optional argument to allow one to choose the Y alignment
 * …
Run Code Online (Sandbox Code Playgroud)

java layout swing alignment boxlayout

4
推荐指数
1
解决办法
506
查看次数

Java - >>运算符?

我已经查看了oracle网站,但这对我来说似乎很先进,请有人能给我一个基本的故事来了解java中的>>运算符吗?也许一个基本的例子会很好.

java

1
推荐指数
1
解决办法
175
查看次数

如何更改JTextArea中某些单词的颜色?

我只是为了好玩而让自己成为一个小小的使者.我想这样做,当你在那里看到某个单词时,例如你的用户名就会变成蓝色.

例如,它看起来像这样:

User1:你好,你好吗?
User2:我很好,谢谢,你呢:)

(粗体=蓝色,不粗体=黑色)

这就是我的客户目前的看法: 窗户

无论如何..我希望这些信息足以让您理解我的问题/问题.谢谢 :)

java swing jframe jtextarea

1
推荐指数
1
解决办法
850
查看次数

扫描局域网的插槽?

我正在创建一个基本的小游戏,我希望它能够使用套接字扫描局域网,我当前的代码工作,但它是粗糙和缓慢.

我当前的代码就这样工作,它得到当前计算机前2个八度(例如192.168),然后它做一个双for循环(0-255)从192.168.0.0扫描到192.168.255.255,在我看来这是一个非常扫描局域网中所有IP的低效方法.

这是代码:

new Thread(new Runnable() {
@Override
public void run() { 
            int next = 0;
            try{
            String ipAd = InetAddress.getLocalHost().getHostAddress();
            String ipStart = ipAd.substring(0, NetHandler.nthOccurrence(ipAd, '.', 2)-1);

            Socket s;

            for(int i = 0 ; i < 255; i++){
                for(int j = 0 ; j < 255; j++){
                    s = new Socket();
                    String ip = ipStart + (i + "." + j);
                    tests++;
                    server = ip;    
                    try{
                    s.connect(new InetSocketAddress(ip, 26655), 10);
                    }catch(Exception e){
                        continue;
                    }
                    servers[next++] = ip;
                    componentList.add(new GuiButton(ids++, …
Run Code Online (Sandbox Code Playgroud)

java sockets

0
推荐指数
1
解决办法
1956
查看次数