我想建立一个游戏来学习cocos2d.Lunar lander是我脑海中的第一个练习.任何指针/源代码/所需的物理计算教程将不胜感激.谢谢!
我对cocos2D非常熟悉(已经使用它超过1年了)我遇到了一个问题multitouch- 我的游戏 - multitouch.
我拥有的:
[glView setMultipleTouchEnabled:YES] 在我的代表中.一个playscene不实现触摸的.
添加到playcene的许多对象(我自己的,继承CCLayer).
这些对象实现了触摸并且是目标协议的委托.
[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
在cocos2D的触摸测试中使用了相同的架构并且它正在工作.唯一的区别是它们使用CCSprite而不是CCLayer作为对象的父类.
有没有人有任何想法?
我无法通过更改来更改SKSpriteNode的位置
self.position = newPosition;
Run Code Online (Sandbox Code Playgroud)
如果它有物理实体,它就不再起作用了.
我得到的解决方法是:
self.myStar.physicsBody = nil;
[self.myStar changePosition];
self.myStar.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.myStar.size.width/2];
Run Code Online (Sandbox Code Playgroud)
要么
[self runAction:[SKAction moveTo:newPosiion duration:0.0]];
Run Code Online (Sandbox Code Playgroud)
但#2并不顺利.它需要在没有移动动作的情况下弹出另一个位置.
好了,所以我正在用棍子数字游戏,在目标C的cocos2d ......不同的事情需要这么动画请,给我的是什么将去完成这些事物运动的最佳方法建议:
主角 - 他是左下角的弓箭手,不会四处移动,除非他会移动他的上身,因为你需要改变射击角度的角度......
敌人 - 成群结队的棍子数字会发生碰撞检测并在被箭头精灵射击时死亡.
我该怎么做1和2移动?我应该掌握锚点并使用它们吗?(我真的很讨厌笨anchorpoints他们是如此难以得到工作...但我会使用这些,如果他们是更好的),或者使吨动画,或者是有其他许多精灵合并成一个单一的运动更简单的方法?
我使用C++作为应用主干和Objective-C用于GUI,这很好.
但是当谈到在Objective-C++(.mm文件)中将这些代码混合在一起时,我有一些问题:
例如,在Objective-C标题中,我可以执行以下操作吗?
#include <vector>
#include <boost\shared_ptr.hpp>
@interface MyClass : NSObject {
std::vector<boost::shared_ptr<CCSprite> > m_spriteList;
}
Run Code Online (Sandbox Code Playgroud)
然后在.mm文件中,我想做
CCSprite* newSprite = [/* cocos2d stuff here... */];
m_spriteList.push_back(newSprite);
Run Code Online (Sandbox Code Playgroud)
以上代码有效吗?它肯定是在C++中,但我不确定混合C++和Objective-C和Cocos2D.
当我尝试在Objective-C中使用C++代码时,我想在Objective-C头文件中将C++对象声明为成员变量.
假设我在test.h标头中声明了一个C++类:
Test{
};
Run Code Online (Sandbox Code Playgroud)
在Objective-C头文件中,我想做
#include "test.h"
#incude <boost/scoped_ptr.hpp>
#include <vector>
@interface MyClass : NSObject {
Test* m_testObjectPtr; // (1)
boost::scoped_ptr<Test> m_testOjbSmartPtr; // (2)
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,是(2)好吗?我可以像在C++代码中一样在Objective-C中使用智能指针吗?我可以假设在Test销毁MyClass对象时会调用类析构函数吗?
或者如果(2)在Objective-C++中不合适,(1)好吗?我需要手动调用
delete m_testObjectPtr的dealloc?
A有一些NSValue(通过KVC获得valueForKey)我需要附加到一个NSData对象,以便使用Game Center通过网络发送它.显然,我还需要将NSValue背面转换NSData为更多的KVC(setValue:forKey:).
我不知道每一个确切的类型NSValue,所以我仅限于使用所提供的接口NSValue和NSData.我应该提一下,NSValue它们永远不是指针类型.
我很惊讶没有[NSData dataWithValue:value],也没有[value dataWithEncoding:]类似的东西.但也许我是盲目的,没有看到明显的选择.我考虑过使用getValue:将值复制到void*缓冲区中,但除了使用objCType并将其与所有可能的类型进行比较之外,我应该如何确定缓冲区长度?
我该怎么办呢?
注意:
NSKeyedArchiver这是不可能的,因为它非常低效.4字节浮点数归档为142字节NSData,8字节CGPoint归档时使用260字节NSData.将发送的数据量保持在最低限度对我正在做的事情至关重要.
出于好奇,我开始想知道是否有可能有三元表达式,如果它的计算结果为假,则在假分支中不执行任何操作.
也就是有办法写这样的东西:
variable = (someBool) ? i : <do nothing>;
Run Code Online (Sandbox Code Playgroud)
相反:
if (someBool) {
variable = i;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过((void)0)或while(false){};作为无操作但编译器需要一个表达式.
更新:
我意识到问题失去了一些意义,因为我试图让代码更容易.我最初的想法是使用三元数初始化静态变量 - 使用静态变量本身作为条件:
static int var = (var != 0) ? var = 1 : (var already initialized, do nothing);
Run Code Online (Sandbox Code Playgroud)
这假设未初始化的变量初始化为0,这并不总是正确的(或者永远不会在发布版本中,不太确定).所以也许这是一个假设的问题.
我正在尝试制作一个具有非常思考笔画的SKShapeNode(如0.25像素).似乎lineWidth为1是我可以去的最小值,至少在屏幕上看起来是这样的,无论是什么值设置为小于1.
SKShapeNode *buttonOutline;
buttonOutline = [[SKShapeNode alloc] init];
CGMutablePathRef myPath = CGPathCreateMutable();
CGPathAddRoundedRect(myPath, NULL, CGRectMake(0, 0, 100, 30), 10, 10);
buttonOutline.path = myPath;
buttonOutline.strokeColor=[SKColor grayColor];
buttonOutline.lineWidth= 0.25;
buttonOutline.name = [NSString stringWithFormat:@"%@-buttonOutline", thisButtonName];
buttonOutline.position = CGPointMake(thisXPos,thisYPod);
buttonOutline.alpha = 1;
Run Code Online (Sandbox Code Playgroud) 我有这个功能,我在第一个场景中生活:
func ThemeSound() {
if let path = NSBundle.mainBundle().pathForResource("InfinityThemeMain", ofType: "wav") {
let enemy1sound = NSURL(fileURLWithPath:path)
println(enemy1sound)
var error:NSError?
ThemePlayer = AVAudioPlayer(contentsOfURL: enemy1sound, error: &error)
ThemePlayer.prepareToPlay()
ThemePlayer.play()
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是,它只播放一次主题.我需要它重复播放.我以为我知道如何实现这一目标.
runAction(SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock(ThemePlayer), SKAction.waitForDuration(2.55)]))
Run Code Online (Sandbox Code Playgroud)
但是我不能粘贴在ViewController中,因为runAction需要一个子连接它.我能用其他任何方式吗?
我正试图操纵一个物体.当它接近另一个物体时,让我们说一个地球仪,我希望地球对原始物体有一个引力.我知道我应该使用CCBezierTo,所以这不是一个编程问题,因为它是一个数学问题.
在数学上,我怎么能找出贝塞尔曲线的三个点(1,2和结束)并根据它的距离赋予它一个权重(更远的距离=更少的拉力).我已经在变量中绘制了距离.
想象一下在月球周围弹射的宇宙飞船.
码:
ccBezierConfig bezier;
bezier.controlPoint_1 = ccp(projectile.position.x + 10, projectile.position.y + 20);
bezier.controlPoint_2 = ccp(projectile.position.x + 20, projectile.position.y + 40);
bezier.endPosition = ccp(projectile.position.x + 30, projectile.position.y+60);
id bezierAction = [CCBezierTo actionWithDuration:1 bezier:bezier];
[projectile stopAllActions];
[projectile runAction: bezierAction];
Run Code Online (Sandbox Code Playgroud) objective-c ×7
ios ×3
iphone ×3
sprite-kit ×3
c++ ×2
physics ×2
bezier ×1
boost ×1
c ×1
ccnode ×1
gravity ×1
multi-touch ×1
nscoding ×1
nsdata ×1
skshapenode ×1
swift ×1