Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'CGFloat' is not Convertible to 'Float' AND MORE

I have more problems within my app. My errors is as the title says:

  1. Swift Compiler Error.

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)
    }

  1. Swift Compiler Error.

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
        }
    }

  1. Swift Compiler Error.

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 :)

like image 807
StigPing Avatar asked Sep 29 '14 07:09

StigPing


People also ask

Is CGFloat double or Float?

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.

What is the difference between Float and CGFloat?

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.

What is a CGFloat?

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.


1 Answers

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.

like image 83
Milos Avatar answered Sep 19 '22 21:09

Milos