2.5D гоночная игра в быстрой или объективной C
Я хотел бы сделать 2.5D гоночную игру с нативными фреймворками на iOS, используя swift или target-C. Кто-нибудь пробовал этот опыт? Любой совет?
Я начал смотреть на этот пример JavaScript https://github.com/jakesgordon/javascript-racer/
У меня что-то работает, но у меня неплохие показатели. Участки дороги нарисованы с использованием SKShapeNode.
Здесь вы можете увидеть код 2 основных функций: 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)
}