ewizard
ewizard

Reputation: 2862

Can't make number negative

I have this swift code:

x = Float(arc4random_uniform(30))
y = Float(arc4random_uniform(30))
z = Float(arc4random_uniform(30))
coords.x = 0.00 - x
coords.y = 0.00 - y
coords.z = 0.00 - z

print("\(coords.x)       \(coords.y)         \(coords.z)      xyz")

For some reason it always outputs the numbers as positive, I have also tried:

x = -Float(arc4random_uniform(30))
y = -Float(arc4random_uniform(30))
z = -Float(arc4random_uniform(30))
coords.x = x
coords.y = y
coords.z = z

and...

x = -1 * Float(arc4random_uniform(30))
y = -1 * Float(arc4random_uniform(30))
z = -1 * Float(arc4random_uniform(30))
coords.x = x
coords.y = y
coords.z = z

...and even one more where I had to cast the random number as an Int to multiply it by -1 within the Float cast.

x = Float(-1*Int(arc4random_uniform(30)))
...

The console output is always something like:

24.0       27.0         29.0      xyz

...no negative numbers.

What am I doing wrong?

EDIT

coords is of type MyDict which I created:

class MyDict : NSDictionary {
    var x: Float = 0.0
    var y: Float = 0.0
    var z: Float = 0.0
}

This is how I am printing the values:

print("\(coords.x)       \(coords.y)         \(coords.z)      xyz")

EDIT

MyDict is now:

struct Coords {
    var x: Float = 0.0
    var y: Float = 0.0
    var z: Float = 0.0
}

EDIT

Code for context - this is happening in a loop:

for nodeInnermost in nodeInner.childNodes {
                    if (nodeInnermost.name?.localizedStandardContains("ship"))! {
                        print(nodeInnermost.childNodes.first ?? "FIRST DOESNT EXIST")
                        var seqArray = [fadeOut, fadeIn]
                        var displacements = [] as Array<Coords>

                        var count = 0
                        var coords = Coords()

                        while count < 5 {
                            if childCount < 5 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 4 && childCount < 10 {
                                coords.x = -Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 9 && childCount < 15 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 14 && childCount < 20 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 19 && childCount < 25 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 24 && childCount < 30 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 29 && childCount < 35 {
                                coords.x = Float(arc4random_uniform(30))
                                coords.y = Float(arc4random_uniform(30))
                                coords.z = Float(arc4random_uniform(30))
                            }
                            else if childCount > 34 && childCount < 40 {
                                coords.x = -Float(arc4random_uniform(30))
                                coords.y = -Float(arc4random_uniform(30))
                                coords.z = -Float(arc4random_uniform(30))
                            }

                            //print("\(x)       \(y)         \(z)      xyz")
                            displacements.append(coords)

                            print("\(coords.x)       \(coords.y)         \(coords.z)      xyz")

                            let moveBy = SCNAction.move(by: SCNVector3Make(coords.x, coords.y, coords.z), duration: 0.5)

                            seqArray.append(fadeOut)
                            seqArray.append(moveBy)
                            seqArray.append(fadeIn)

                            count+=1
                        }

                        while count < 10 {
                            let moveBy = SCNAction.move(by: SCNVector3Make(displacements[9 - count].x, displacements[9 - count].y, displacements[9 - count].z), duration: 0.5)

                            seqArray.append(fadeOut)
                            seqArray.append(moveBy)
                            seqArray.append(fadeIn)

                            count+=1
                        }

                        let sequence = SCNAction.sequence(seqArray)
                        let animation = SCNAction.repeatForever(sequence)

                        nodeInnermost.childNodes.first?.runAction(animation)
                    }
                }

SAMPLE OUTPUT:

https://pastebin.com/Ak1pb6wP

Upvotes: 0

Views: 368

Answers (1)

rmaddy
rmaddy

Reputation: 318884

It makes no sense for your MyDict to extend NSDictionary nor should it be a class. Once you make it a proper struct, your code works fine.

struct MyDict {
    var x: Float = 0.0
    var y: Float = 0.0
    var z: Float = 0.0
}

var coords = MyDict()
coords.x = -Float(arc4random_uniform(30))
coords.y = -Float(arc4random_uniform(30))
coords.z = -Float(arc4random_uniform(30))

print("\(coords.x)       \(coords.y)         \(coords.z)      xyz")

Output:

-24.0       -28.0         -4.0      xyz

Upvotes: 3

Related Questions