我想得到我在SKSpriteNode上使用的图像的名称.
这是我创建节点的方式:
SKSpriteNode *button = [SKSpriteNode spriteNodeWithImageNamed:@"img.png"];
Run Code Online (Sandbox Code Playgroud)
通过触摸屏幕,我想在NSLog上获得此图像的名称.
UITouch *touch = [touches anyObject];
CGPoint loc = [touch locationInNode:self];
SKSpriteNode *node = (SKSpriteNode *)[self nodeAtPoint:loc];
Run Code Online (Sandbox Code Playgroud)
通过触摸节点,我想得到NSLog信息,这个SKSpriteNode使用名为img.png的图像.
我该如何解决这个问题?
提前致谢.
我有一个球在屏幕上反弹.根据用户所达到的水平,我让球更快.所以,我做了以下事情:
[ball.physicsBody applyImpulse:[self vectorForLevel:self.level]];
Run Code Online (Sandbox Code Playgroud)
构建的方法CGVector.
- (CGVector)vectorForLevel:(int)level {
CGFloat thrust = level+3;
return CGVectorMake(thrust*cosf(4), thrust*sinf(-4));
}
Run Code Online (Sandbox Code Playgroud)
虽然这个效果非常好并且可以像我想的那样加速每个级别,但我还想随机化球的起始角度,但我不知道该怎么做.
我不太了解CGVector如何真正知道如何改变角度.我扔在那里的角度是4和-4吗?
有谁知道如何随机化方向?
我是objectif-c和sprite-kit开发的新手(但不是编程).所以我开始使用Apple的Spri.该应用程序完美无缺,但是当岩石落入场景底部时,表示岩石的节点会自动从其父节点移除.这个,没有实现 - (void)didSimulatedPhysics方法:
- (void)didSimulatedPhysics
{
[self enumerateChildNodesWithName:@"rock" usingBlock:^(SKNode *node, BOOL *stop) {
if (node.position.y < 0)
[node removeFromParent];
}];
}
Run Code Online (Sandbox Code Playgroud)
我可以看到屏幕上显示的节点计数器:它不会随着岩石的数量而增加.所以我的问题是:Xcode是否为我的程序管理removeFromParent方法?如果是,你能告诉我禁用的选项.我尝试将ARC设置为NO,但它没有任何改变.
我希望我的信息很清楚.如果没有,请告诉我.提前感谢您的回答.
拉斐尔
假设我想创建一堆不同类型的太空飞船.我想设置一个基础宇宙飞船类,我可以用它来创建其他具有微小差异的宇宙飞船.
我的基类看起来像这样.
// BaseSpaceship.h
@interface SpaceshipNode : SKSpriteNode
@property NSColor color;
@property CGFloat engineThrust;
+ (id)baseSpaceshipWithImageNamed:(NSString *)name;
@end
// BaseSpaceship.m
@implementation BaseSpaceship
+ (id)baseSpaceshipWithImageNamed:(NSString *)name {
BaseSpaceship *ship = [BaseSpaceship spriteNodeWithImageNamed:name];
ship.color = [NSColor redColor];
ship.engineThrust = 2.0;
return ship;
}
@end
Run Code Online (Sandbox Code Playgroud)
我可以在MyScene.m中创建一艘这样的船就好了.
BaseSpaceship *baseClass = [BaseSpaceship baseSpaceshipWithImageNamed:@"BaseShip"];
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何创建一个子类BaseSpaceship,例如DestroyerSpaceship.我不确定我是否应该使用静态方法.我在网上看到的例子使用静态方法来实例化SKSpriteNodes.这就是我提出的,但这是错误的.
// DestroyerSpaceship.h
@interface DestroyerSpaceship : BaseSpaceship
@property CGFloat missileThrust;
- (id)makeDestroyerSpaceship;
@end
// DestroyerSpaceship.m
@implementation DestroyerSpaceship
- (id)makeDestroyerSpaceship{
DestroyerSpaceship *ship = [DestroyerSpaceship baseSpaceshipWithImageNamed:@"DestroyerShip"];
ship.engineThrust = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用介于0和屏幕大小之间的值.所以我这样做了:
let sizeX = Int(CGRectGetMaxX(self.frame))
let sizeY = Int(CGRectGetMaxY(self.frame))
var randomX = CGFloat(arc4random()) % sizeX
var randomY = CGFloat(arc4random()) % sizeY
self.touchButton.position = CGPointMake(randomX, randomY)
Run Code Online (Sandbox Code Playgroud)
我有这个错误:找不到接受提供的参数的'%'的重载
我需要这个随机化一个SkSpriteNode的位置,也许有更好的解决方案?
谢谢
当我更改 spritenode 的纹理时,大小会自动更改为纹理图像(png)的原始大小。
我怎样才能避免这种情况?
我的代码:
var bomba = SKSpriteNode(imageNamed: "bomba2")
var actionbomba = SKAction()
bomba.size = CGSizeMake(frame2.size.width/18, frame2.size.width/18)
let bomba3 = SKTexture(imageNamed: "bomba3.png")
actionbomba.addObject(SKAction.moveBy(CGVectorMake(0, frame.size.height/2.65), duration: 2))
actionbomba.addObject(SKAction.setTexture(bomba3,resize: false))
addChild(bomba)
bomba.runAction(SKAction.repeatAction(SKAction.sequence(actionbomba), count: -1))
Run Code Online (Sandbox Code Playgroud) 我正在使用SpriteKit进行游戏,我在屏幕顶部产生节点并且下降.但是,我希望这些节点以0.1到3秒之间的随机时间间隔生成.例如,第一个节点在1.3秒内产生,下一个在1.8中产生,然后是2.5,然后是0.8,依此类推.我不知道如何利用waitForDuration函数来做到这一点.我目前拥有的代码是:
let wait = SKAction.waitForDuration(3, withRange: 2)
let spawn = SKAction.runBlock { addTears()
}
let sequence = SKAction.sequence([wait, spawn])
self.runAction(SKAction.repeatActionForever(spawn))
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,此代码会冻结我的游戏.我删除了addTears()并放了一个日志,日志上有一个无限循环.我需要知道如何摆脱这个.
我的addTears()函数的代码是:
func addTears() {
let Tears = SKSpriteNode (imageNamed: "Tear")
Tears.position = CGPointMake(Drake1.position.x, Drake1.position.y - 2)
Tears.zPosition = 3
addChild(Tears)
//gravity
Tears.physicsBody = SKPhysicsBody (circleOfRadius: 150)
Tears.physicsBody?.affectedByGravity = true
//contact
Tears.physicsBody = SKPhysicsBody (circleOfRadius: Tears.size.width/150)
Tears.physicsBody!.categoryBitMask = contactType.Tear.rawValue
Tears.physicsBody!.contactTestBitMask = contactType.Bucket.rawValue
}
Run Code Online (Sandbox Code Playgroud) 我对 spritekit 坐标系很困惑。我需要澄清两个案例。
情况1:
当一个精灵节点作为子节点添加到场景中时:
SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.position=point; //I am varying this point
[self addChild:blueBall];
Run Code Online (Sandbox Code Playgroud)
我每次都在不同的点添加节点。这些是我在以下位置添加节点的点: (100x100)(200x200)(300x300)(400x400)(900,600)
在我的 iphone 5 设备中,它们看起来像这样:
如果您查看 100x100,当我在设备上的 (100,100) 点添加精灵时,当我记录节点位置时,它向我显示 (99.9,138.17),这与点 (100,100) 相比存在巨大差异。
即使其他点也有变化,我忽略了它们,因为对于其他点来说差异太小了。
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
[self bounceTheBlueBallAtPoint:CGPointMake(100, 100)];
}
-(void)bounceTheBlueBallAtPoint:(CGPoint)point{
SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"];
blueBall.name=@"blueball";
blueBall.size=CGSizeMake(75, 75);
blueBall.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:blueBall.frame.size.width/2];
blueBall.physicsBody.categoryBitMask=blueBallHitCategory;
blueBall.physicsBody.collisionBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
blueBall.physicsBody.contactTestBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory;
blueBall.physicsBody.dynamic=YES;
blueBall.physicsBody.affectedByGravity=NO;
blueBall.physicsBody.restitution=1.0;
blueBall.physicsBody.friction=0.0;
blueBall.physicsBody.linearDamping=0.0;
blueBall.physicsBody.angularDamping=0.0;
blueBall.position=point;
[self addChild:blueBall];
//applying impulse to bounce off
// CGVector …Run Code Online (Sandbox Code Playgroud) 是否可以更新/更改图像SKSpriteNode?
以下代码不起作用:
var boss1 = SKSpriteNode(imageNamed: "boss1.png")
boss1 = SKSpriteNode(imageNamed: "boss2.png")
Run Code Online (Sandbox Code Playgroud) 我在下面有一个名为"Floor"的单独课程.
class Floor: SKNode {
override init() {
super.init()
//let edgeFrame = CGRect(origin: CGPoint(x: 1,y: 1), size: CGSize(width: 1078, height: 1950))
//self.physicsBody = SKPhysicsBody(edgeLoopFrom: edgeFrame)
let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
// Apply a physics body to the node
// self.physicsBody?.isDynamic = false
// Set the bit mask properties
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
Run Code Online (Sandbox Code Playgroud)
我基本上已经下降了SKSpriteNode,它从屏幕顶部开始,然后到达触及"Floor"的底部并移除自身,然后再次从顶部重新开始.我遇到的问题是我的所有SKSpriteNode一直卡在最顶层而不是掉落在屏幕边框周围.如何告诉我的应用程序忽略这些特定节点并让它们进入?感谢任何帮助!
这是在屏幕上左右移动的对象,但它只是在没有edgeLoop的情况下从屏幕的一侧掉落
if let …Run Code Online (Sandbox Code Playgroud) skspritenode ×10
sprite-kit ×9
ios ×5
swift ×5
objective-c ×3
xcode ×2
arc4random ×1
game-physics ×1
inheritance ×1
ios7 ×1
skaction ×1
sktexture ×1
textures ×1
uiimage ×1