标签:asi override row config nat err holding using 文本
最近使有和 Three.js 开发三维页面,觉得很有趣。以前在做WP应用的时候使用过MonoGame做过一点东西,后来Windows 10上来,MonoGame好像不怎么支持了,也没用了。最近在看Windows 下的C# 3D绘图,发现了SharpDx,随藤摸瓜又爬到来了MonoGame 和发现Xenko.
MonoGame:当前又支持UWP应用,但提供的模板指定的是 14393的SDK。(下次再试试,这今试Xenko)
教程:https://docs.microsoft.com/zh-cn/xamarin/graphics-games/monogame/
Xenko:也是通过Xamarin进行跨平台,现在已是MIT开源。原生支持UWP,但用GameStudio 3.0.0.5生成的项目指定的是 10240的SDK,所以做UWP的话,用新SDK,则要改改。今天折腾一翻:
(为什么不用流行的Unity 3D呢?因为不懂,个人喜欢VS的编码方式,什么引用都看得见,何况Unity3D免费版有限制)
以下使用Xenko创建Windows/Uwp项目:
1.安装SDK:https://xenko.com/
2.启动Xenko 新建项目 MyGame2
3、创建的已是完整可运行的项目
切换UWP运行:
刷了一下,没有运行成功
使用VS 2017打开,提示没有安装 10240的SDK(然则我就是不想安装)
点击确定更新
VS不干了:
那就手动来,文本形式打开项目,修改成当前版本
重新加载项目:
出来了,此时重新生成项目。居然成功了。如果不成功,可以做以下尝试:
把nuget的Direct3D11的文件拷到UWP下:
其实不知道有没有用。因为我建第一个项目的时候是不行了,被我修改一翻后,第二个项目居然行了。
4、代码结构
甚是熟悉的UWP代码结构
MyGame2.UWP引用MyGame2.Game的游戏项目。UWP只是一个壳,实际游戏在MyGame2.Game中
看 BasicCameraController.cs 文件源码
using System;
using Xenko.Core;
using Xenko.Core.Mathematics;
using Xenko.Engine;
using Xenko.Input;
namespace MyGame2
{
///
/// A script that allows to move and rotate an entity through keyboard, mouse and touch input to provide basic camera navigation.
///
///
/// The entity can be moved using W, A, S, D, Q and E, arrow keys or dragging/scaling using multi-touch.
/// Rotation is achieved using the Numpad, the mouse while holding the right mouse button, or dragging using single-touch.
///
public class BasicCameraController : SyncScript
{
private const float MaximumPitch = MathUtil.PiOverTwo * 0.99f;
private Vector3 upVector;
private Vector3 translation;
private float yaw;
private float pitch;
public Vector3 KeyboardMovementSpeed { get; set; } = new Vector3(5.0f);
public Vector3 TouchMovementSpeed { get; set; } = new Vector3(40, 40, 20);
public float SpeedFactor { get; set; } = 5.0f;
public Vector2 KeyboardRotationSpeed { get; set; } = new Vector2(3.0f);
public Vector2 MouseRotationSpeed { get; set; } = new Vector2(90.0f, 60.0f);
public Vector2 TouchRotationSpeed { get; set; } = new Vector2(60.0f, 40.0f);
public override void Start()
{
base.Start();
// Default up-direction
upVector = Vector3.UnitY;
// Configure touch input
if (!Platform.IsWindowsDesktop)
{
Input.Gestures.Add(new GestureConfigDrag());
Input.Gestures.Add(new GestureConfigComposite());
}
}
public override void Update()
{
ProcessInput();
UpdateTransform();
}
private void ProcessInput()
{
translation = Vector3.Zero;
yaw = 0;
pitch = 0;
// Move with keyboard
if (Input.IsKeyDown(Keys.W) || Input.IsKeyDown(Keys.Up))
{
translation.Z = -KeyboardMovementSpeed.Z;
}
else if (Input.IsKeyDown(Keys.S) || Input.IsKeyDown(Keys.Down))
{
translation.Z = KeyboardMovementSpeed.Z;
}
if (Input.IsKeyDown(Keys.A) || Input.IsKeyDown(Keys.Left))
{
translation.X = -KeyboardMovementSpeed.X;
}
else if (Input.IsKeyDown(Keys.D) || Input.IsKeyDown(Keys.Right))
{
translation.X = KeyboardMovementSpeed.X;
}
if (Input.IsKeyDown(Keys.Q))
{
translation.Y = -KeyboardMovementSpeed.Y;
}
else if (Input.IsKeyDown(Keys.E))
{
translation.Y = KeyboardMovementSpeed.Y;
}
// Alternative translation speed
if (Input.IsKeyDown(Keys.LeftShift) || Input.IsKeyDown(Keys.RightShift))
{
translation *= SpeedFactor;
}
// Rotate with keyboard
if (Input.IsKeyDown(Keys.NumPad2))
{
pitch = KeyboardRotationSpeed.X;
}
else if (Input.IsKeyDown(Keys.NumPad8))
{
pitch = -KeyboardRotationSpeed.X;
}
if (Input.IsKeyDown(Keys.NumPad4))
{
yaw = KeyboardRotationSpeed.Y;
}
else if (Input.IsKeyDown(Keys.NumPad6))
{
yaw = -KeyboardRotationSpeed.Y;
}
// Rotate with mouse
if (Input.IsMouseButtonDown(MouseButton.Right))
{
Input.LockMousePosition();
Game.IsMouseVisible = false;
yaw = -Input.MouseDelta.X * MouseRotationSpeed.X;
pitch = -Input.MouseDelta.Y * MouseRotationSpeed.Y;
}
else
{
Input.UnlockMousePosition();
Game.IsMouseVisible = true;
}
// Handle gestures
foreach (var gestureEvent in Input.GestureEvents)
{
switch (gestureEvent.Type)
{
// Rotate by dragging
case GestureType.Drag:
var drag = (GestureEventDrag)gestureEvent;
var dragDistance = drag.DeltaTranslation;
yaw = -dragDistance.X * TouchRotationSpeed.X;
pitch = -dragDistance.Y * TouchRotationSpeed.Y;
break;
// Move along z-axis by scaling and in xy-plane by multi-touch dragging
case GestureType.Composite:
var composite = (GestureEventComposite)gestureEvent;
translation.X = -composite.DeltaTranslation.X * TouchMovementSpeed.X;
translation.Y = -composite.DeltaTranslation.Y * TouchMovementSpeed.Y;
translation.Z = -(float)Math.Log(composite.DeltaScale + 1) * TouchMovementSpeed.Z;
break;
}
}
}
private void UpdateTransform()
{
var elapsedTime = (float)Game.UpdateTime.Elapsed.TotalSeconds;
translation *= elapsedTime;
yaw *= elapsedTime;
pitch *= elapsedTime;
// Get the local coordinate system
var rotation = Matrix.RotationQuaternion(Entity.Transform.Rotation);
// Enforce the global up-vector by adjusting the local x-axis
var right = Vector3.Cross(rotation.Forward, upVector);
var up = Vector3.Cross(right, rotation.Forward);
// Stabilize
right.Normalize();
up.Normalize();
// Adjust pitch. Prevent it from exceeding up and down facing. Stabilize edge cases.
var currentPitch = MathUtil.PiOverTwo - (float)Math.Acos(Vector3.Dot(rotation.Forward, upVector));
pitch = MathUtil.Clamp(currentPitch + pitch, -MaximumPitch, MaximumPitch) - currentPitch;
// Move in local coordinates
Entity.Transform.Position += Vector3.TransformCoordinate(translation, rotation);
// Yaw around global up-vector, pitch and roll in local space
Entity.Transform.Rotation *= Quaternion.RotationAxis(right, pitch) * Quaternion.RotationAxis(upVector, yaw);
}
}
}
5、运行看看
Xenko C#开源游戏引擎入门
标签:asi override row config nat err holding using 文本
原文地址:https://www.cnblogs.com/Yu-weiz/p/9685897.html