YouTubeでThinMatrixのチュートリアルを使用して作成しているマルチプレイヤーゲームにいくつかのコードを追加するにはどうすればよいですか?私は自分のチュートリアルに従っていきました。正直なところ...私のゲームに自分のものを追加することを決めました。誰かが、ゲームのプレイヤーエンティティの位置を更新するコードを教えてくれますか?私はすでに(基本的な)ネットワーキングを行う方法を知っています。更新クライアントのポジションのような単純なことを行うマルチプレーヤーコード(java用)を追加するには
ありがとうございました!
編集:
package entities;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.util.vector.Vector3f;
public class Camera {
private float distanceFromPlayer = 35;
private float angleAroundPlayer = 0;
private Vector3f position = new Vector3f(0, 0, 0);
private float pitch = 20;
private float yaw = 0;
private float roll;
private Player player;
public Camera(Player player){
this.player = player;
}
public void move(){
calculateZoom();
calculatePitch();
calculateAngleAroundPlayer();
float horizontalDistance = calculateHorizontalDistance();
float verticalDistance = calculateVerticalDistance();
calculateCameraPosition(horizontalDistance, verticalDistance);
this.yaw = 180 - (player.getRotY() + angleAroundPlayer);
}
public Vector3f getPosition() {
return position;
}
public float getPitch() {
return pitch;
}
public float getYaw() {
return yaw;
}
public float getRoll() {
return roll;
}
private void calculateCameraPosition(float horizDistance, float verticDistance){
float theta = player.getRotY() + angleAroundPlayer;
float offsetX = (float) (horizDistance * Math.sin(Math.toRadians(theta)));
float offsetZ = (float) (horizDistance * Math.cos(Math.toRadians(theta)));
position.x = player.getPosition().x - offsetX;
position.z = player.getPosition().z - offsetZ;
position.y = player.getPosition().y + verticDistance + 4;
}
private float calculateHorizontalDistance(){
return (float) (distanceFromPlayer * Math.cos(Math.toRadians(pitch+4)));
}
private float calculateVerticalDistance(){
return (float) (distanceFromPlayer * Math.sin(Math.toRadians(pitch+4)));
}
private void calculateZoom(){
float zoomLevel = Mouse.getDWheel() * 0.03f;
distanceFromPlayer -= zoomLevel;
if(distanceFromPlayer<5){
distanceFromPlayer = 5;
}
}
private void calculatePitch(){
if(Mouse.isButtonDown(1)){
float pitchChange = Mouse.getDY() * 0.2f;
pitch -= pitchChange;
if(pitch < 0){
pitch = 0;
}else if(pitch > 90){
pitch = 90;
}
}
}
private void calculateAngleAroundPlayer(){
if(Mouse.isButtonDown(0)){
float angleChange = Mouse.getDX() * 0.3f;
angleAroundPlayer -= angleChange;
}
}
}
プレーヤークラス:
package entities;
import models.TexturedModel;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.vector.Vector3f;
import renderEngine.DisplayManager;
import terrains.Terrain;
public class Player extends Entity {
private static final float RUN_SPEED = 40;
private static final float TURN_SPEED = 160;
private static final float GRAVITY = -50;
private static final float JUMP_POWER = 18;
private float currentSpeed = 0;
private float currentTurnSpeed = 0;
private float upwardsSpeed = 0;
private boolean isInAir = false;
public Player(TexturedModel model, Vector3f position, float rotX, float rotY, float rotZ,
float scale) {
super(model, position, rotX, rotY, rotZ, scale);
}
public void move(Terrain terrain) {
checkInputs();
super.increaseRotation(0, currentTurnSpeed * DisplayManager.getFrameTimeSeconds(), 0);
float distance = currentSpeed * DisplayManager.getFrameTimeSeconds();
float dx = (float) (distance * Math.sin(Math.toRadians(super.getRotY())));
float dz = (float) (distance * Math.cos(Math.toRadians(super.getRotY())));
super.increasePosition(dx, 0, dz);
upwardsSpeed += GRAVITY * DisplayManager.getFrameTimeSeconds();
super.increasePosition(0, upwardsSpeed * DisplayManager.getFrameTimeSeconds(), 0);
float terrainHeight = terrain.getHeightOfTerrain(getPosition().x, getPosition().z);
if (super.getPosition().y < terrainHeight) {
upwardsSpeed = 0;
isInAir = false;
super.getPosition().y = terrainHeight;
}
}
private void jump() {
if (!isInAir) {
this.upwardsSpeed = JUMP_POWER;
isInAir = true;
}
}
private void checkInputs() {
if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
this.currentSpeed = RUN_SPEED;
} else if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
this.currentSpeed = -RUN_SPEED;
} else {
this.currentSpeed = 0;
}
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
this.currentTurnSpeed = -TURN_SPEED;
} else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
this.currentTurnSpeed = TURN_SPEED;
} else {
this.currentTurnSpeed = 0;
}
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
jump();
}
}
}
コードなしでは手助けできないので、これまでに試したことをお見せください。 (また、あなたの質問を部品に分解し、一度に一つのことを尋ねる)。コードなしでは、例えば、プレイヤーエンティティはどのように公開/管理されていますか?あなたの問題のネットワーキングは関連しているのか、Javaメソッドの問題ですか?プレーヤーエンティティはカスタムクラスですか?プレーヤーエンティティをメソッド呼び出しで移動できるようにメソッドを設定しましたか? – sorifiend
ダウンロードリンクから20のクラスのようなコードを提供することができますか?そして、私は、キャラクターを動かすようなユーザー入力システムと、カメラを動かすシステムを持っています。私は、世界、スカイボックス、エンティティなど、膨大な量のバイトを送信するなどのやり方を理解することはできません。私が自分で作ったという意味ならカスタムで作ったのですが、そうです。いいえ。しかし、あなたが望むなら、私はあなたにダウンロードリンクを与えることができます。お返事ありがとうございました – rjhwinner03
ここにはあまり多くのコードがありません。質問を特定の問題に絞り込む必要があります。あなたが送ることができる最も小さい量が何であるかについてデータを送信するために考える。例えば、動きを扱う場合、実際には、視線方向のピッチとヨーで位置のx、y、z座標を送信するだけでよく、送信されるデータはほとんどなくtcpまたはudp接続で更新できます。送信/受信するコードを送信して解釈するコードが必要ですが、膨大な量の情報を送信するのではなく、スマート情報を送信することです。それは本当に大きな話題です.... – sorifiend