小编Pab*_*blo的帖子

使用SpriteKit阻止对象发生碰撞

我正在测试SpriteKit的功能,我遇到了一个问题.我正在阅读比特面具,碰撞,类别和联系.我得到它们是什么,大多数情况下,至少,我没有得到类别位掩码的点,但我得到碰撞位掩码,这是我需要解决我的问题.

好吧我的问题是我有两种不同类型的精灵:对象第二种.名称并没有多大意义,但它只是为了测试.我希望第二个有冲动,我希望对象有力量.我能够在精灵上应用相应的向量,但我不希望它们相互碰撞.我希望他们通过并忽略彼此的存在.

我尝试通过为彼此分配不同的碰撞位掩码来解决该问题:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let texture = SKTexture(imageNamed: "pokeball")
    let object = SKSpriteNode(texture: texture)

    object.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: object.size.width,height: object.size.height))
    object.physicsBody?.affectedByGravity = false
    object.yScale = 0.5
    object.xScale = 0.5

    for t in touches {
        object.position = t.location(in: self)
    }
    self.addChild(object)
    object.physicsBody?.collisionBitMask = UInt32(4)
    object.physicsBody?.applyForce(CGVector(dx: 0, dy: 10))

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let texture = SKTexture(imageNamed: "purple")
    let second = SKSpriteNode(texture: texture)
    let …
Run Code Online (Sandbox Code Playgroud)

sprite-kit swift

11
推荐指数
1
解决办法
1652
查看次数

我是否需要为 Xcode 资源使用不同的图像尺寸?

我一直有点担心我是否应该用相应的通用尺寸填充我的所有资源:

在此输入图像描述

我有大约 20-30 张图像,因此如果我必须为每个资源添加三个 png,那将是一个问题。提交我的申请是否需要这样做?我的应用程序在没有其他尺寸的情况下运行良好吗?(x2,x3)

xcode ios

5
推荐指数
1
解决办法
1177
查看次数

无法从node-pg导入客户端

我正在尝试在 Node 项目中使用 Postgresql。我正在使用模块化导入,因此在导入“pg”时遇到问题:

import * as pg from 'pg'
const { Client } = pg
let client = new Client()
Run Code Online (Sandbox Code Playgroud)

导致这个错误

        let client = new Client()
                     ^
TypeError: Client is not a constructor
Run Code Online (Sandbox Code Playgroud)

我看过其他几个与此类似的问题,但仍然存在问题:

import { native as pg } from 'pg';
let client = new pg.Client()
Run Code Online (Sandbox Code Playgroud)

导致这个错误:

import { native as pg } from 'pg';
         ^^^^^^
    SyntaxError: Named export 'native' not found. The requested module 'pg' is a CommonJS module, which may not support all module.exports as named …
Run Code Online (Sandbox Code Playgroud)

postgresql node.js

5
推荐指数
1
解决办法
3941
查看次数

更改 SKScene 中心点

我正在开发一个简单的 2d 游戏,并尝试从级别 1(场景一)切换到级别 2(场景二)。为了测试的目的,两个级别都包含相同的内容。这是我的转换代码:

    let transition = SKTransition.push(with: SKTransitionDirection.left, duration: 1)
    let nextScene = Scene(size: levelBuilder.scene.size)
    nextScene.scaleMode = .aspectFill
    nextScene.backgroundColor = UIColor(red:0.17, green:0.24, blue:0.31, alpha:1.0)
    levelBuilder.scene.view?.presentScene(nextScene, transition: transition)

    nextScene.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    nextScene.physicsWorld.contactDelegate = levelBuilder.scene.physicsWorld.contactDelegate

    loadLevelContents(level: 2, world: 1, borderPercentage: 30)
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但问题不在于转换,而在于将节点加载到场景二中,这发生在此处:

loadLevelContents(level: 2, world: 1, borderPercentage: 30)
Run Code Online (Sandbox Code Playgroud)

定位效果很好,但问题是一切都是基于屏幕中间的中心点或相对 (0,0) 。

场景2的中心点位于左下角

在此输入图像描述

虽然我需要它像场景 1 一样,位于屏幕中间: 在此输入图像描述

如何将这个相对点或中心点(不确定它叫什么)更改为所有 SKScene 的屏幕中间

sprite-kit swift

4
推荐指数
1
解决办法
258
查看次数

停止在主线程上运行的DispatchQueue

我有这段代码:

    DispatchQueue.main.asyncAfter(deadline: .now() + (delay * Double(isDelayAccounted.hashValue)) + extraDelay) {
        self.isShootingOnHold = false
        self.shoot()
        self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)   
    }
Run Code Online (Sandbox Code Playgroud)

现在,我希望能够阻止此线程执行.怎么能阻止它被执行?例如,3秒后,我决定我不想再执行,所以我想停止它.

grand-central-dispatch swift dispatch-queue

4
推荐指数
2
解决办法
5660
查看次数

Podfile中目标中的目标

我正在尝试将Google Mobile Ads SKD安装到我的Xcode项目中。我安装了Cocoapods,然后将Podfile初始化到我的项目中:

# Uncomment the next line to define a global platform for your project
platform :ios, '10.2'

target 'Cubical' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for Cubical

  target 'CubicalTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'CubicalUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么我的主项目中有目标(Cubical)。我从未真正使用过CubicalTests或CubicalUITests,因为我真的不需要测试UI或任何代码片段。我正在考虑删除这两个文件夹。

我的问题是

1)从我的Xcode项目中删除Tests和UITests文件夹是否有任何缺点?如果可以,我可以直接从Podfile中删除这两个目标吗?

2)假设我要保留这两个目标。我是否必须将广告连播添加到所有三个目标?还是两个嵌套目标继承了目标“ Cubical”的任何Pod

3)我需要将Google Mobile Ads SDK添加到链接框架中吗?还是Cocoapods已经做到了?

我的最终吊舱如下所示:

# Uncomment the …
Run Code Online (Sandbox Code Playgroud)

xcode ios cocoapods swift

4
推荐指数
1
解决办法
1470
查看次数

为SpriteKit创建按钮

我正在为我正在构建的精灵工具包应用程序创建主菜单.在整个项目中,我使用SKScenes来保持我的关卡和实际的游戏玩法.但是,现在我需要一个主菜单,其中包含"Play","Levels","Shop"等按钮......但是,我现在添加按钮的方式感觉不太舒服,就像这样:

let currentButton = SKSpriteNode(imageNamed: button)  // Create the SKSpriteNode that holds the button

self.addChild(currentButton) // Add that SKSpriteNode to the SKScene
Run Code Online (Sandbox Code Playgroud)

我检查按钮的触摸如下:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    let touchLocation = touch!.location(in: self)

    for node in self.nodes(at: touchLocation) {
        guard let nodeName = node.name else {
            continue
        }
        if nodeName == ButtonLabel.Play.rawValue {
            DispatchQueue.main.asyncAfter(deadline: .now()) {
                let transition = SKTransition.reveal(with: .left, duration: 1)
                self.view?.presentScene(self.initialLevel, transition: transition)
                self.initialLevel.loadStartingLevel()
            }
            return
        }
        if nodeName …
Run Code Online (Sandbox Code Playgroud)

sprite-kit swift

2
推荐指数
1
解决办法
759
查看次数

Swift 中获取 Timer 的时间间隔中剩余的时间

我有一个精灵使用计时器每 x 秒“射击”更多精灵:

self.shootingEngine = Timer.scheduledTimer(timeInterval: (Double(60)/Double(self.ratePerMinute)), target: self, selector: #selector(ShootingEnemy.shoot), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)

所以时间间隔定义为:

(Double(60)/Double(self.ratePerMinute)) // Let's say it is 2 seconds.
Run Code Online (Sandbox Code Playgroud)

时间间隔,在此示例中为 2 秒。它每 2 秒触发一次 shot() 方法。现在,我想弄清楚如何获取计时器再次运行 shot() 方法之前的剩余时间。例如,我想知道距离下一次 shot() 还剩 0.74 秒

我正在考虑使用这个:

NSDate().timeIntervalSince1970 * 1000
Run Code Online (Sandbox Code Playgroud)

将时间保存到变量中,然后找出与当前时间的差值。但是,我首先想检查是否有更简单的方法来避免存储另一个实例变量。

swift

1
推荐指数
1
解决办法
2966
查看次数

如何正确恢复应用内购买?

我有几个应用内购买.但是,我读到我需要提供一种方法来恢复它们,以防他们意外删除我的应用程序.它们是不可消耗的物品,如皮肤和纹理.我正在阅读本网站的教程:https://code.tutsplus.com/tutorials/in-app-purchase-tutorial-with-swift-3-ios-sdk--cms-27595

但是,他们对恢复交易的解释使我感到困惑.他们这样做了:

@IBAction func restorePurchaseButt(_ sender: Any) {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
nonConsumablePurchaseMade = true
UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade")

UIAlertView(title: "IAP Tutorial",
message: "You've successfully restored your purchase!",
delegate: nil, cancelButtonTitle: "OK").show()
}
Run Code Online (Sandbox Code Playgroud)

但是,他们从未向我展示他们实际使用paymentQueueRestoreCompletedTransactionsFinished()的位置.我知道他们正在使用restorePurchaseButt()来恢复购买.但是,我不理解这两种方法.

SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
Run Code Online (Sandbox Code Playgroud)

这段代码甚至可以检查用户是否进行了购买?我没有看到任何if语句.我假设也许restoreCompletedTransactions()触发paymentQueueRestoreCompletedTransactionsFinished(),但我不确定?但是,即使它确实如此,paymentQueueRestoreCompletedTransactionsFinished()如何检查玩家是否进行了这些交易?现在,当有多个应用内购买时,如何进行恢复?

in-app-purchase swift

1
推荐指数
1
解决办法
3091
查看次数

在Swift 4中从数组中删除特定对象

我试图从数组保持事件对象中删除特定的Event对象(我自己的类).这是我对数组的声明.

private var positiveEvents : [Event] = []
Run Code Online (Sandbox Code Playgroud)

现在,这是我如何尝试从数组中删除Event对象.此方法(disposeOfflineEvents)每30秒调用一次,因此positiveEvents可能包含某些元素或根本不存在任何元素.

func disposeOfflineEvents() {
    for event in positiveEvents {
        if !event.ongoing {
            positiveEvents.remove(at:  positiveEvents.index(where: { $0 === event })!)
            print("! - Disposing of an event!")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到了这个问题,但我使用的是Swift 4,所以我没有索引(of:Event)方法.我当前的解决方案的问题是,当使用"==="检查对象的相等性时,我偶尔会遇到错误:

在此输入图像描述

有没有更好的方法呢?

swift

1
推荐指数
1
解决办法
3398
查看次数