我想使用swift或Objective-C在iOS上使用本机框架制作2.5D赛车游戏。有人尝试过这种经历吗?有什么建议吗?
我开始看这个JavaScript示例https://github.com/jakesgordon/javascript-racer/
我工作正常,但表现相对较差。 使用SKShapeNode绘制路段。
在这里您可以看到两个主要功能的代码:drawRoad()和renderPolygon()从renderSegment()调用
func drawRoad()
{
UIGraphicsBeginImageContext(CGSizeMake(widthEcran, heightEcran))
var ctx = UIGraphicsGetCurrentContext();
let baseSegment = findSegment(Int(cameraPosition))
var maximumY = heightEcran // java layer = screen height , sprite or shape = 0
self.clearRoad()
renderedPolys = 0
rendrerdSegments = 0
for var i = 0; i < roadProfondeur; i++
{
var leSegment = segmentsRoute[ ( baseSegment.index + i) % segmentsRoute.count]
leSegment.brouillard = brouillardProgressif(i, vProfondeur: roadProfondeur, vDensite: densiteBrouillard);
projection(&leSegment.p1, cameraX: (CGFloat(joueurX) * roadWidth) , cameraY: cameraHeight, cameraZ: cameraPosition, cameraProfondeur: cameraProfondeurActuelle, vWidth: widthEcran , vHeight: heightEcran , vRoadWidth: roadWidth)
projection(&leSegment.p2, cameraX: (CGFloat(joueurX) * roadWidth) , cameraY: cameraHeight, cameraZ: cameraPosition, cameraProfondeur: cameraProfondeurActuelle, vWidth: widthEcran , vHeight: heightEcran , vRoadWidth: roadWidth)
if (leSegment.p1.cameraZ <= cameraProfondeurActuelle) || // segment derrière nous
(leSegment.p2.screenY <= maximumY) // || ((leSegment.p2.screenY - leSegment.p1.screenY) <= 1) // déjà rendu
{
// on ne fait rien
}
else
{
// on dessine le segment
rendrerdSegments = rendrerdSegments + 1
//NSLog("render segment n° %i : x1=%f y1=%f w1=%f x2=%f y2=%f w2=%f", leSegment.index, leSegment.p1.screenX, leSegment.p1.screenY, leSegment.p1.screenW, leSegment.p2.screenX, leSegment.p2.screenY, leSegment.p2.screenW)
renderSegment(ctx!, vWidth: widthEcran, vBandes: bandes, x1: leSegment.p1.screenX, y1: leSegment.p1.screenY, w1: leSegment.p1.screenW, x2: leSegment.p2.screenX, y2: leSegment.p2.screenY, w2: leSegment.p2.screenW, vBrouillard: leSegment.brouillard, vCouleur: leSegment.color , vCouleurBordure: leSegment.colorBordure, vCouleurTerrain: leSegment.colorTerrain)
}
maximumY = leSegment.p2.screenY
} // fin for
// NSLog("rendered seg = %i", rendrerdSegments)
// NSLog("rendered polys = %i", renderedPolys)
// textureImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// route.texture = SKTexture(CGImage: textureImage.CGImage!)
}
func renderPolygon(ctx : CGContext, x1:CGFloat, y1:CGFloat, x2:CGFloat, y2:CGFloat, x3:CGFloat, y3:CGFloat, x4:CGFloat, y4:CGFloat, fillColor: SKColor)
{
renderedPolys = renderedPolys + 1
let polygon : SKShapeNode = SKShapeNode(path: renderPolygonPath(x1, y1: y1, x2: x2, y2: y2, x3: x3, y3: y3, x4: x4, y4: y4))
polygon.antialiased = false
polygon.strokeColor = fillColor
polygon.fillColor = fillColor
route.addChild(polygon)
}