我是新来的,但在我遇到问题时多年来一直提到这个网站。你们非常乐于助人。不幸的是,我希望实现的目标,我无法在任何地方找到。
我正在使用C#GDI +构建一个游戏引擎,并且它的表现非常出色(考虑到GDI +对游戏的无能为力)。
我正在尝试模拟视图。因此,如果视图位于某个位置,则会根据ViewX
和ViewY
位置更新GameObject位置(在Engine.Loop()循环中)。例如:
obj.X -= ViewY;
obj.Y -= ViewY;
在实践中,这是有效的。视图移动,GameObject全部位于正确的位置。但问题是,当我返回对象的值时,它们只返回该位置,如果ViewX位置例如设置为1,则对象全部移动,看起来像视图正在移动...除了视图不是。
下面是游戏循环的代码(非常自我解释):
//Game loop
if (objects.Count > 0)
{
foreach (GameObject obj in instances)
{
try
{
if (obj.Active) //Only perform this action if the object is currently active
{
if (RectangleInsideView(obj.X, obj.Y, obj.Width, obj.Height))
{
obj.Draw();
}
obj.Step();
//It's because it is constantly updating the object position based on the views position rather than accepting where the view is and
//Just relating it's position to it.
//Eg. if ViewX = 2, obj.X is = obj.X -2...
//We some how need to have a false X and Y variable to set and return...
obj.X = obj.X - ViewX;
obj.Y = obj.Y - ViewY;
}
}
catch (Exception ex) { }
}
}
我知道为什么会这样,但我不明白我是如何解决它的。
答案 0 :(得分:0)
我不太理解这个问题,但这听起来不对:
因此,如果视图位于某个位置,则GameObject位置为 更新(在Engine.Loop()循环中)基于ViewX和ViewY 位置。
obj.X = obj.X - ViewX;
obj.Y = obj.Y - ViewY;
有物体有位置。视图只绘制对象。如果您使用GDI +进行游戏,那么还有很多工作要做!
foreach (GameObject obj in instances)
{
if (obj.Active) //Only perform this action if the object is currently active
{
// obj.X -= ViewY and obj.Y -= ViewY;;
GameObject objCopy = view.convertViewIn();
Point[] points = view.convertToScreenCoords(objCopy.getPoints());
Point a = ps[0];
Point b = ps[1];
graphics.DrawLine(usePen, a.X, a.Y, b.X, b.Y);
}
}
public override Point[] convertToScreenCoords(IList<Vector3D> list)
{
Point[] points = new Point[list.Count];
for (int i = 0; i < list.Count; i++)
{
points[i] = convertToScreenCoords(list[i]);
}
return points;
}
public override Point convertToScreenCoords(TheoCAD.Maths.Vector3D coords)
{
return coords.GetTransformedCoord(this.matrixRotateScaleToScreen).toPoint();
}
public Vector3D GetTransformedCoord(Matrix3D matrix)
{
double[] result = new double[4];
double[] temp = new double[4];
temp[0] = this.X;
temp[1] = this.Y;
temp[2] = this.Z;
temp[3] = 1d;
for (int i = 0; i <= 3; i++)
{
result[i] = 0;
for (int j = 0; j <= 3; j++)
{
result[i] += matrix[i, j] * temp[j];
}
}
if (Math.Abs(result[3]) >= 1e-8)
{
result[0] /= result[3];
result[1] /= result[3];
result[2] /= result[3];
}
return new Vector3D(result[0], result[1], result[2]);
}
我会推荐“Java中的杀手游戏编程”。有怎么做这样的事情。 http://shop.oreilly.com/product/9780596007300.do