首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JavaFX 8中的博弈矩阵表示为像素

将JavaFX 8中的博弈矩阵表示为像素
EN

Stack Overflow用户
提问于 2014-10-16 01:13:19
回答 1查看 897关注 0票数 0

我正在构建一个游戏仿真器,我有一个矩阵来表示一个显示器的像素。如何使用JavaFX 8来表示它(Swing给了我许多关于键绑定和声音的问题)。图像应该经常刷新。谢谢!

示例:

我有一个带有布尔值的matrix64。1代表白色,0代表黑色。我想调用一个方法(画图()),它将矩阵的值表示为显示像素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-16 02:42:24

最快的方法可能是使用WritableImage。你可以打电话给

代码语言:javascript
复制
WritableImage.getPixelWriter().setPixels(...);

若要从某些数据更新图像,请执行以下操作。对于您的情况,最方便的方法可能是将数据(“矩阵”)表示为一个一维字节数组,并使用PixelFormat将字节值映射为颜色数组(表示为argb值)。您可以调用setPixels(...)方法的适当版本。

(因此,您的paint()方法只需调用setPixels方法,可能需要进行一些计算,以查看图像的哪些部分需要更新。)

此示例使用此技术在图像上绘制一个小的(8x8)矩形。

代码语言:javascript
复制
import java.nio.ByteBuffer;

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class DirectImageFromArray extends Application {

    @Override
    public void start(Stage primaryStage) {
        final int width = 64 ;
        final int height = 32 ;

        final int boxSize = 8 ;

        final int blackArgb = 0xFF << 24 ;
        final int whiteArgb = 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF ;

        byte[] data = new byte[width*height];
        for (int y = 0 ; y < boxSize; y++) {
            int scanLineStride = y * width ;
            for (int x = 0 ; x < boxSize; x++) {
                data[x+scanLineStride] = 1 ;
            }
        }

        WritableImage img = new WritableImage(width, height);

        // indexed colors 0 -> black, 1 -> white:
        PixelFormat<ByteBuffer> pixelFormat = 
                PixelFormat.createByteIndexedInstance(new int[] {blackArgb, whiteArgb});

        // write entire image:
        img.getPixelWriter().setPixels(0, 0, width, height, pixelFormat, data, 0, width);

        // represents the first pixel that is white:
        IntegerProperty firstLitPixel = new SimpleIntegerProperty();

        // update the data array and then the image when the property changes:
        firstLitPixel.addListener((obs, oldValue, newValue) -> {

            // track portion that changes:
            int minChangedX = width ;
            int minChangedY = height ;
            int maxChangedX = 0 ;
            int maxChangedY = 0 ;

            // move box
            for (int y = 0; y < boxSize; y++) {

                // set left edge of box to black:
                int oldIndex = (oldValue.intValue() + y * width) % (width * height) ;
                data[oldIndex] = 0 ;

                // set right edge of new box location to white:
                int newIndex = (newValue.intValue() + y * width + boxSize - 1) % (width*height) ;
                data[newIndex] = 1 ;

                // update changed portion:
                int oldX = oldIndex % width ;
                int oldY = oldIndex / width ;
                int newX = newIndex % width ;
                int newY = newIndex / width ;
                minChangedX = Math.min(minChangedX, Math.min(oldX, newX));
                maxChangedX = Math.max(maxChangedX, Math.max(oldX, newX));
                minChangedY = Math.min(minChangedY, Math.min(oldY, newY));
                maxChangedY = Math.max(maxChangedY, Math.max(oldY, newY));
            }
            int minIndex = minChangedX + minChangedY * width ;
            int changedWidth = maxChangedX - minChangedX + 1;
            int changedHeight = maxChangedY - minChangedY + 1;

            // update image
            img.getPixelWriter().setPixels(minChangedX, minChangedY, 
                    changedWidth, changedHeight, 
                    pixelFormat, data, minIndex, width);
        });

        // animate the property:
        Timeline animation = new Timeline(new KeyFrame(Duration.millis(10), event -> 
            firstLitPixel.set((firstLitPixel.get() + 1) % (width * height))
        ));

        animation.setCycleCount(Animation.INDEFINITE);
        animation.play();

        ImageView imageView = new ImageView(img);
        StackPane root = new StackPane(imageView);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26394701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档