GVKun编程网logo

Swift-SpriteKit CGPoint对齐(swiftui padding)

11

对于想了解Swift-SpriteKitCGPoint对齐的读者,本文将提供新的信息,我们将详细介绍swiftuipadding,并且为您提供关于ios–Swift/SpriteKit:如何创建水滴效

对于想了解Swift-SpriteKit CGPoint对齐的读者,本文将提供新的信息,我们将详细介绍swiftui padding,并且为您提供关于ios – Swift / SpriteKit:如何创建水滴效果?、ios – Swift SpriteKit委托模式、ios – Swift Spritekit等距地图触摸位置、ios – Swift&SpriteKit:全屏图像的有价值信息。

本文目录一览:

Swift-SpriteKit CGPoint对齐(swiftui padding)

Swift-SpriteKit CGPoint对齐(swiftui padding)

我正在迅速进行一个项目,并且能够制作精灵。我试图在许多不同的地方制作精灵。作为测试,我将游戏场景中的代码替换为:

class GameScene: SKScene {    override func didMoveToView(view: SKView){        let wall = SKSpriteNode(imageNamed: "Wall")        wall.position = CGPoint(x: 289, y: 0)    }    }

我不明白的是,这段代码在左下角产生了一个精灵。正如预期的那样,在y方向上仅显示了一半的精灵,但是x方向似乎完全偏离了。如果我尝试将x值设置为289以下的任何数字,它将不会出现。0,0点真的是289,0还是我缺少什么?我正在为iPhone
6编程,如果有所作为。

谢谢!

答案1

小编典典

您的场景不一定与您的视图大小相同。您可以按照以下步骤检查场景的大小:

view.scene!.frame.sizeview.scene!.frame.widthview.scene!.frame.heightview.scene!.frame.midXview.scene!.frame.midY

ios – Swift / SpriteKit:如何创建水滴效果?

ios – Swift / SpriteKit:如何创建水滴效果?

我想知道如何在 Swift(SpriteKit)中产生以下效果.

我想添加一些ShapeNodes并用-yscale 1填充背景图像.

但我认为这种效果在某种程度上是不同的,因为背景图像不仅仅是水平镜像 – 它还有一些图形效果(它以水珍珠的形状反映出来等等).

是用ShaderNode完成的吗?

有人知道如何在SpriteKit中创建相同的效果 – 就像水珍珠看起来像是在“相机”上,它们反映了背景“waterpearl like”?

谢谢.

解决方法

嗯,你可以创建一堆水图像,并在屏幕上的某个z位置随机显示它们,但是我觉得这个效果是在另一个程序中进行的,如团结或类似的东西,你最好的选择是制造透明的水滴作为图像,让它们随机显示在屏幕上.

ios – Swift SpriteKit委托模式

ios – Swift SpriteKit委托模式

我一直在努力学习如何最近使用代表,实际上似乎在很大程度上理解它.但是我有一个问题.

我有1个GameViewController,1个StartScene和1个MenuScene

在我的GameViewController中,我有两个方法,我想从MenuScene调用.到目前为止,我一直在使用NSNotification,它工作正常但我正在尝试使用委托.

所以我在MenuScene中设置了一个协议

protocol MenuSceneDelegate {
 func gameOver()
 func showGameCenter()
}

我比这样引用它

var menuSceneDelegate: MenuSceneDelegate?

在GameViewController中,我在顶部添加了MenuSceneDelegate.到目前为止,一切都很标准.但是我遇到的主要问题是当我在GameViewController中设置委托时就像这样

let skView = view as! SKView!
    var scene = StartScene(size: skView.bounds.size)

    skView.ignoresSiblingOrder = true
    scene.scaleMode = .Resizefill

    skView.presentScene(scene)

    scene.menuSceneDelegate = self   //Sets delegate to StartScene not MenuScene

它只适用于StartScene.如何将GameViewController委托从StartScene设置为MenuScene.如果我首先展示MenuScene,一切正常.但是我首先介绍了StartScene,因此我试图了解如何将委托设置为MenuScene.

我试过下面这样的东西,但它不起作用,只是似乎没有

var menuScene = MenuScene(size: skView.bounds.size)
 menuScene.menuSceneDelegate = self

我将不胜感激任何帮助或支持.非常感谢你

解决方法

基本上解决方案是在我从开始场景变为游戏场景时设置委托,而不是在开始时.

ios – Swift Spritekit等距地图触摸位置

ios – Swift Spritekit等距地图触摸位置

我已经开始做一个小的 swift / spritekit项目来教我自己的游戏开发.
它以等距地图开始,我设法绘制.
但是我在地图的不同瓷砖上获得精确的触摸位置时遇到了麻烦.
它有效,但有点不合适,似乎不一致.

这是我的功能:

class PlayScene: SKScene {

let map = SKNode()
    override func didMovetoView(view: SKView) {

        let origin = view.frame.origin
        let mapOrigin = CGPointMake(origin.x + self.frame.width / 4,origin.y - self.frame.height / 4)


        let mapConfig: Int[][] =

       [[0,1,0],[0,[2,2,2],0]]

    drawMap(mapConfig,mapOrigin: mapOrigin)
}

用:

func drawMap(mapConfig:Int[][],mapOrigin:CGPoint)
{
    let tileHeight:CGFloat = 25.5
    let numColumns:Int = 8
    let numRows:Int = 8

    var position = mapOrigin
    var column: Int = 0
    var row: Int = 0

    for column = 0; column < numColumns; column++
    {
        for row = 0; row < numRows; row++
        {
            position.x = mapOrigin.x + CGFloat(column) * tileHeight
            position.y = mapOrigin.y + CGFloat(row) * tileHeight
            let isoPosition = twoDToIso(position)
            placeTile(isoPosition,mapConfig: mapConfig[row][column])
        }
    }
    self.addChild(map)
}

func placeTile(position:CGPoint,mapConfig:Int)
{
 switch mapConfig
    {
    case 0:
        let sprite = SKSpriteNode(imageNamed:"grasstile")
        sprite.position = position
        sprite.setScale(0.1)
        sprite.name = "\(position)"
        self.map.addChild(sprite)
    case 1:
        let sprite = SKSpriteNode(imageNamed:"roadTile")
        sprite.position = position
        sprite.setScale(0.1)
        sprite.name = "\(position)"
        self.map.addChild(sprite)
    default:
        let sprite = SKSpriteNode(imageNamed:"roadTileLTR")
        sprite.position = position
        sprite.setScale(0.1)
        sprite.name = "\(position)"
        self.map.addChild(sprite)
    }
}

然后我想隐藏我触摸的瓷砖(用于测试):

override func touchesBegan(touches: NSSet,withEvent event: UIEvent)
{
    for touch: AnyObject in touches
    {
        let locationNode = touch.locationInNode(self)
        nodeAtPoint(locationNode).hidden = true
    }
}

但它并不总是隐藏正确的瓷砖.
那我该怎么解决呢?我的代码是否根本错误(可能)?或者我需要以某种方式将位置转换为iso坐标?或者玩瓷砖位面罩?

无论如何,谢谢你的帮助!

解决方法

我在等轴测图中遇到了类似的问题.

问题是您单击的节点大于显示的节点(它具有透明部分).有关该问题的更好解释,请参阅my question here.

以下是我如何解决它(抱歉代码在Objective-C中):

1.在tile的边缘之后创建一个CGPathRef(tileSize是纹理的大小).此代码适用于常规等距切片,而不是六边形,但想法是相同的.

// ObjC
-(CGPathRef)createTextureFrame:(CGSize)tileSize
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMovetoPoint(path,NULL,-(self.tileSize.height / 2));
    CGPathAddLinetoPoint(path,(self.tileSize.width / 2),0);
    CGPathAddLinetoPoint(path,(self.tileSize.height / 2));
    CGPathAddLinetoPoint(path,-(self.tileSize.width / 2),0);
    CGPathCloseSubpath(path);
    return path;
}

// Swift
func createTextureFrame(tileSize:CGSize) -> CGPathRef {
    CGMutablePathRef path = CGPathCreateMutable()
    CGPathMovetoPoint(path,nil,-(self.tileSize.height / 2))
    CGPathAddLinetoPoint(path,0)
    CGPathAddLinetoPoint(path,(self.tileSize.height / 2))
    CGPathAddLinetoPoint(path,0)
    CGPathCloseSubpath(path)
    return path
}

2.创建一个函数,检查给定的点是否在CGPathRef(textureFrame)中.

// ObjC
-(BOOL)isPointOnNode:(CGPoint)point
{
    return CGPathContainsPoint(textureFrame,point,YES);
}

// Swift
func isPointOnNode(point:CGPoint) -> Bool {
    return CGPathContainsPoint(textureFrame,YES)
}

3.对于每个触摸的节点,检查我们所在的textureFrame.

// ObjC
UITouch *touch = [touches anyObject];
NSArray *nodes = [self nodesAtPoint:[touch locationInNode:self]];
for (SKNode *node in nodes)
{
    CGPoint locationInNode = [touch locationInNode:node];
    if ([node isPointOnNode:locationInNode])
    {
        node.hidden = YES;
    }
}

// Swift
var touch = touches.anyObject() as UITouch
var nodes = self.nodesAtPoint(touch.locationInNode(self))
for node in nodes as [SKNode] {
    var locationInNode = touch.locationInNode(node)

    if node.isPointOnNode() {
        node.hidden = true
    }
}

我不知道它是否是最好的解决方案,但效果很好.
我希望它有帮助:)

编辑:添加了Swift版本的代码

ios – Swift&SpriteKit:全屏图像

ios – Swift&SpriteKit:全屏图像

我正在快速制作SpriteKit的第一个场景.我为尺寸为640×1136的4英寸iPhone创建了一个背景图像.我将图像作为精灵放置在屏幕的中央,但图像不是全屏,缺少边缘.

接下来,我尝试在app中调整图像大小.当我做image.size.height = self.size.height时,高度在整个iPhone屏幕上正确调整大小.
但是当我用宽度image.size.width = self.size.width做同样的事情时,图片的宽度非常宽.

我打印了self.size的尺寸,结果我的iPhone 5s的尺寸是1024,768.这完全是胡说八道,因为屏幕不能比iPhone的高度宽.该应用程序是通用的,但唯一的方向设置为纵向.

编辑:这是我用来将图像放在屏幕上的代码

class GameScene: SKScene
{
    let menuImage = SKSpriteNode(imageNamed: "menuImage")

    override func didMovetoView(view: SKView)
    {
        /* Setup your scene here */

        menuImage.anchorPoint = CGPointMake(0.5,0.5)
        menuImage.size.height = self.size.height
        menuImage.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))

        self.addChild(menuImage)
    }

解决方法

你需要在gameViewController文件中的skView.presentScene(scene)之前添加scene.size = skView.bounds.size

关于Swift-SpriteKit CGPoint对齐swiftui padding的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于ios – Swift / SpriteKit:如何创建水滴效果?、ios – Swift SpriteKit委托模式、ios – Swift Spritekit等距地图触摸位置、ios – Swift&SpriteKit:全屏图像的相关信息,请在本站寻找。

本文标签: