Minecraft forge 1.7.10で鉱石を追加する
鉱石の追加方法をまとめます。
まず、鉱石にしたいブロックを追加します。
ここでは、鉱石の名前をMelliteとします。
Oreblock.java
public static Block Mellite;
.....
@EventHandler
public void init1(FMLPreInitializationEvent Event) {
Mellite = new Melliteore();
GameRegistry.registerBlock(Mellite, "Mellite");
}
Melliteore.java
public class Melliteore extends Block {
public Melliteore() {
super(Material.iron);
setCreativeTab(CreativeTabs.tabBlock);
setBlockName("Mellite");
setBlockTextureName("slime:Mellite");
setHardness(2.0f);
}
}
それでは、追加したブロックを鉱石にしていきます。
randomores.java
public class SlimeOres implements IWorldGenerator{
private WorldGenerator ore1
@Override
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
switch (world.provider.dimensionId) {
case -1:
break;
case 0:
break;
case 1:
break;
default:
break;
}
}
Switch文の-1はネザー、0は通常世界、1はエンドです。
次は鉱石の生成です。
randomores.java
public randomores() {
this.ore1 = new WorldGenMinable(Oreblock.Mellite, 4);
}
private void runGenerator(WorldGenerator generator, World world, Random rand, int chunk_X, int chunk_Z, int chancesToSpawn, int minHeight, int maxHeight) {
if (minHeight < 0 || maxHeight > 256 || minHeight > maxHeight)
throw new IllegalArgumentException("Illegal Height Arguments for WorldGenerator");
int heightDiff = maxHeight - minHeight + 1;
for (int i = 0; i < chancesToSpawn; i ++) {
int x = chunk_X * 16 + rand.nextInt(16);
int y = minHeight + rand.nextInt(heightDiff);
int z = chunk_Z * 16 + rand.nextInt(16);
generator.generate(world, rand, x, y, z);
}
}
public randomores(){}のところで鉱石の最大生成数を設定しています。
runGeneratorのところは鉱石の生成頻度とランダムに鉱石を生成させるアルゴリズムを設定しています。
先ほどのswitch文でメソッドを呼び出しましょう。
randomores.java
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
switch (world.provider.dimensionId) {
case -1:
break;
case 0:
this.runGenerator(this.ore1, world, random, chunkX, chunkZ, 20, 0, 12);
break;
case 1:
break;
default:
break;
}
}
20は生成頻度、0は最小生成高度、12は最高生成高度です。
最後に イベントに追加しましょう。
Oreblock.java
@EventHandler
public void event1(FMLInitializationEvent Event) {
GameRegistry.registerWorldGenerator(new randomores(), 0);
}
参考にしたページ : Basic Modding - World Generation - Minecraft Mods & Modding by BedrockMiner
C# WPFでコントロールのサイズをウィンドウに合わせる
ハマったのでメモ。
- 結論
HorizontalAlignmentとVerticalAlignmentをStretchにして、
widthとheightとAutoにする(書き込む)だけ。
Javafxファイル・チューザの作成と使用方法
JavaFXのファイルチューザについて書かれているサイトがあまり見当たらなかったので、作成及び使用方法についてまとめます。
javafx scene builderを使用しています。
- ファイルチューザの作成
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open File");
fileChooser.showOpenDialog(null);
で作成できます。
fileChooser.showOpenDialog(stage);でオーナーを設定します。
nullでも大丈夫です。
- Buttonで開く
@FXML
protected void fileaction(ActionEvent a) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open File");
File file = fileChooser.showOpenDialog(null);
}
FXMLは省略します。
- ファイルチューザの拡張子フィルタの設定
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("All", "*.*"),
new FileChooser.ExtensionFilter("PNG", "*.png")
);
("タイトル", "名前.拡張子")と書きます。全てを選択する場合は*です。
- 初期ディレクトリの設定
fileChooser.setInitialDirectory(
new File(System.getProperty("user.home"))
);
この場合ピクチャやビデオなどがあるuserホームを開きます。
- 画像ファイルを開いてwindowに表示する
File file = fileChooser.showOpenDialog(null);
ファイルを開いて表示するには、fileChooser.showOpenDialog(null);を上記のように変更します。
次に、ファイルのパスを取得します。
String url = "file:///"+file.getPath();
最初に file:/// を付けないとエラーになってしまうので注意しましょう。
最後に、Imageviewとして表示します。
@FXML ImageView image1;
.......
Image image2 = new Image(url);
image1.setImage(image2);
- 最後に全てのソースコードを貼ります
Sample.FXML
<!--?xml version="1.0" encoding="UTF-8"?-->
<!--?import javafx.scene.control.*?-->
<!--?import javafx.scene.image.*?-->
<!--?import java.lang.*?-->
<!--?import javafx.scene.layout.*?-->
<!--?import javafx.scene.layout.BorderPane?-->
<borderpane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"><center>
<pane prefheight="400.0" prefwidth="400.0" borderpane="" alignment="CENTER">
<children>
<imageview fx:id="image1" fitheight="186.0" fitwidth="200.0" layoutx="100.0" layouty="118.0" pickonbounds="true" preserveratio="true"></imageview>
<button##/button>
</children>
</pane>
</center>
</borderpane>
Main.java
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.fxml.FXMLLoader;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
SampleController.java
import java.io.File;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.FileChooser;
public class SampleController {
@FXML Button file1;
@FXML ImageView image1;
@FXML
protected void fileaction(ActionEvent a) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open File");
fileChooser.setInitialDirectory(
new File(System.getProperty("user.home"))
);
File file = fileChooser.showOpenDialog(null);
String url = "file:///"+file.getPath();
Image image2 = new Image(url);
image1.setImage(image2);
System.out.println(url);
}
}