I have more problems within my app. My errors is as the title says:
Error1: 'CGFloat' is not Convertible to 'Float'
Code for the 1st and 2nd error:
self.setPositionRelativeBot(pipeBot, x: xx, y: offset)
self.setPositionRelativeTop(pipeTop, x: xx, y: offset + space)
Here is the whole func:
func spawnPipeRow(offs: Float)
{
let offset = offs - space / 2
let pipeBot = mainPipe.copy() as Pipe
let pipeTop = mainPipe.copy() as Pipe
pipeBot.texture = SKTexture(imageNamed: "BotPipe")
pipeTop.texture = SKTexture(imageNamed: "TopPipe")
pipeBot.texture!.filteringMode = SKTextureFilteringMode.Nearest
pipeTop.texture!.filteringMode = SKTextureFilteringMode.Nearest
pipeBot.isBottom = true
let xx = self.view!.bounds.size.width
self.setPositionRelativeBot(pipeBot, x: xx, y: offset)
self.setPositionRelativeTop(pipeTop, x: xx, y: offset + space)
pipeBot.physicsBody = SKPhysicsBody(rectangleOfSize: pipeBot.size)
pipeTop.physicsBody = SKPhysicsBody(rectangleOfSize: pipeTop.size)
pipeBot.physicsBody!.dynamic = false
pipeTop.physicsBody!.dynamic = false
pipeBot.physicsBody!.contactTestBitMask = birdCategory
pipeTop.physicsBody!.contactTestBitMask = birdCategory
pipeBot.physicsBody!.collisionBitMask = birdCategory
pipeTop.physicsBody!.collisionBitMask = birdCategory
pipes.append(pipeBot)
pipes.append(pipeTop)
self.addChild(pipeBot)
self.addChild(pipeTop)
}
Error1: 'Float' is not identical to 'UInt8'
Code for the 1st error:
vel -= 85 - (self.view!.bounds.size.height - bird.position.y)
Error2: 'SKPhysicsBody?' does not have a member named 'velocity'
Code for the 2nd error:
bird.physicsBody.velocity = CGVectorMake(0, vel)
Here is the whole func:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
if (!bird.physicsBody!.dynamic)
{
//First touch
self.spawnPipeRow(0)
bird.physicsBody!.dynamic = true
bird.physicsBody!.velocity = CGVectorMake(0, 175)
scoreLabel.hidden = false
isMoving = true
} else if (isMoving)
{
var vel: Float = 200
if (self.view!.bounds.size.height - bird.position.y < 85)
{
vel -= 85 - (self.view!.bounds.size.height - bird.position.y)
}
bird.physicsBody.velocity = CGVectorMake(0, vel)
} else
{
overlay.removeFromParent()
for pi in pipes
{
pi.removeFromParent()
}
pipes.removeAll(keepCapacity: false)
score = 0
bird.physicsBody!.dynamic = false
bird.position = CGPoint(x: 150, y: view!.bounds.size.height / 2 - 10)
scoreLabel.hidden = true
isGroundMoving = true
}
}
Error1: 'CGFloat' is not identical to 'UInt8'
Code for the 1st and 2nd error (Same error both lines):
ground1.position.x -= movingSpeed
ground2.position.x -= movingSpeed
Error2: Cannot invoke '-=' with an argument list of type '(@lvalue CGFloat, $T9)'
Code for the 3rd and 4th error (Same error both lines):
background1.position.x -= movingSpeed / 3
background2.position.x -= movingSpeed / 3
Error3: 'CGFloat' is not identical to 'UInt8'
pipe.position.x -= movingSpeed
Here is the whole func:
override func update(currentTime: CFTimeInterval)
{
if (isGroundMoving)
{
ground1.position.x -= movingSpeed
ground2.position.x -= movingSpeed
if (ground1.position.x <= -self.view!.bounds.size.width / 2)
{
ground1.position.x = self.view!.bounds.size.width * 1.5 - 2
}
if (ground2.position.x <= -self.view!.bounds.size.width / 2)
{
ground2.position.x = self.view!.bounds.size.width * 1.5 - 2
}
background1.position.x -= movingSpeed / 3
background2.position.x -= movingSpeed / 3
if (background1.position.x <= -self.view!.bounds.size.width / 2)
{
background1.position.x = self.view!.bounds.size.width * 1.5 - 2
}
if (background2.position.x <= -self.view!.bounds.size.width / 2)
{
background2.position.x = self.view!.bounds.size.width * 1.5 - 2
}
if (isMoving)
{
for (var i = 0; i < pipes.count; i++)
{
let pipe = pipes[i]
if (pipe.position.x + (pipe.size.width / 2) < 0)
{
pipe.removeFromParent()
continue
}
if (pipe.position.x + (pipe.size.width / 2) < self.view!.bounds.size.width / 2 && pipe.isBottom && !pipe.pointAdded)
{
score++
pipe.pointAdded = true
}
pipe.position.x -= movingSpeed
if (i == pipes.count - 1)
{
if (pipe.position.x < self.view!.bounds.width - pipe.size.width * 2.0)
{
self.spawnPipeRow(self.randomOffset())
}
}
}
scoreLabel.text = "Score: \(score)"
}
}
}
I hope some of you guys can figure this out for me because I can't :)
As others have said, CGFloat is a float on 32-bit systems and a double on 64-bit systems. However, the decision to do that was inherited from OS X, where it was made based on the performance characteristics of early PowerPC CPUs.
The Float and CGFloat data types sound so similar you might think they were identical, but they aren't: CGFloat is flexible in that its precision adapts to the type of device it's running on, whereas Float is always a fixed precision.
A CGFloat is a specialized form of Float that holds either 32-bits of data or 64-bits of data depending on the platform. The CG tells you it's part of Core Graphics, and it's found throughout UIKit, Core Graphics, Sprite Kit and many other iOS libraries.
Error 1: Use CGFloat
instead of Float
. For example:
var vel: CGFloat = 200
Error 2: physicsBody is an optional (can be nil), so use ?.
operator to conditionally unwrap it before referencing its velocity
:
bird.physicsBody?.velocity = CGVectorMake(0, vel)
All of your errors seem to be caused by one of these two issues. For example, spawnPipeRow
's argument is again offs: Float
instead of CGFloat
. And I suspect the same is true of the values that you did not declare in the snippets you provided, such as space
or movingSpeed
.
To understand what CGFloat
is, Command-click on it – this will take you to CoreGraphics
API where you can read that CGFloat
is a "native type ... which is Float on 32-bit architectures and Double on 64-bit architectures."
Also, I would tend to use ?
rather than !
when modifying physicsBody
as the latter will crash if the physicsBody
is nil.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With