我正在制作一个基于关卡的游戏,其中包含许多不同的对象。在每个级别中,每种类型的对象都有不同的数量。因此,我一直试图使绘图部分尽可能通用,这样我所要做的就是传入坐标,它会自动绘制。为此,我制作了一个协议,强制每个对象类实现getBP()方法,该方法返回UIBezierPath为每个对象绘制。然后,视图类只需要说
Object.getBP().fill()
但是,这导致了一些奇怪的问题。对象不会以正确的坐标绘制。 y坐标是正确的,但x坐标将它始终放在屏幕的左侧。我认为可能是在视图类中没有创建Bezier路径。这是我在Surface.swift中的代码(这是为了在游戏中绘制一个表面):
func getBP() -> UIBezierPath {
var rect:CGRect
var length:Double = getSurfaceVector().getMagnitude()//length of the surface
var cx = points.1.x+(points.0.x-points.1.x)//center coords of the surface
var cy = points.1.y+(points.0.y-points.1.y)
var bp = UIBezierPath(roundedRect: CGRectMake(CGFloat(cx - length/2), CGFloat(cy-RECT_HEIGHT/2), CGFloat(length), CGFloat(RECT_HEIGHT)), cornerRadius: CGFloat(5))
let transform:CGAffineTransform = CGAffineTransformMakeRotation(CGFloat(Double(angle)*(Double(M_PI)/Double(180))))
bp.applyTransform(transform)
return bp
}
点只是表面起点和终点的元组。 RECT_HEIGHT是绘制以表示曲面的矩形的高度。 angle是表面水平面的角度。
在View.swift中创建表面,我这样做:
Surface(fixed: true, points: (Vector(x: 50, y:100), Vector(x: Double(UIScreen.mainScreen().bounds.width), y: 100)))
我将该表面添加到游戏中的对象数组中。我通过说
在View.swift文件中绘制它surface.stroke()
表面在y屏幕上绘制y值为100,但它以x = 0为中心,因此它在屏幕的一半和一半处。此外,它不会以角度绘制 - 它始终是水平的。有没有更好的方法来做到这一点?发生了什么事?