- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 JSTileMap 来绘制关卡。我稍微改变了一下,将 SKPhysicsBody 添加到每个瓷砖,但有时当我对主角施加一些冲动并且他撞到墙壁/地面/天花板时,他表现得很奇怪。他用与物理原理相反的方式从表面反射。我认为发生这种情况是因为玩家到达了两个物理体(例如地面的两个物理体)连接的点。SKPhysicsBody 类提供了一种从不同的物理体 + (SKPhysicsBody *)bodyWithBodies:(NSArray *)bodies; 创建一个物理体的方法;我可以使用此方法从多个物理体创建一个物理体吗?
这是 JSTileMap 中的一个方法,我在其中添加物理体:
+(id) layerWithTilesetInfo:(NSArray*)tilesets layerInfo:(TMXLayerInfo*)layerInfo mapInfo:(JSTileMap*)mapInfo
{
TMXLayer* layer = [TMXLayer node];
layer.map = mapInfo;
layer.tilesByColumnRow = [NSMutableDictionary dictionary];
// basic properties from layerInfo
layer.layerInfo = layerInfo;
layer.layerInfo.layer = layer;
layer.mapTileSize = mapInfo.tileSize;
layer.alpha = layerInfo.opacity;
layer.position = layerInfo.offset;
// recalc the offset if we are isometriic
if (mapInfo.orientation == OrientationStyle_Isometric)
{
layer.position = CGPointMake((layer.mapTileSize.width / 2.0) * (layer.position.x - layer.position.y),
(layer.mapTileSize.height / 2.0) * (-layer.position.x - layer.position.y));
}
NSMutableDictionary* layerNodes = [NSMutableDictionary dictionaryWithCapacity:tilesets.count];
//MY CODE
NSMutableArray *arrayOfSprites = [[NSMutableArray alloc] init];
SKNode *theSprite;
//----||----
// loop through the tiles
for (NSInteger col = 0; col < layerInfo.layerGridSize.width; col++)
{
for (NSInteger row = 0; row < layerInfo.layerGridSize.height; row++)
{
// get the gID
NSInteger gID = layerInfo.tiles[col + (NSInteger)(row * layerInfo.layerGridSize.width)];
// mask off the flip bits and remember their result.
bool flipX = (gID & kTileHorizontalFlag) != 0;
bool flipY = (gID & kTileVerticalFlag) != 0;
bool flipDiag = (gID & kTileDiagonalFlag) != 0;
gID = gID & kFlippedMask;
// skip 0 GIDs
if (!gID)
continue;
// get the tileset for the passed gID. This will allow us to support multiple tilesets!
TMXTilesetInfo* tilesetInfo = [mapInfo tilesetInfoForGid:gID];
[layer.tileInfo addObject:tilesetInfo];
if (tilesetInfo) // should never be nil?
{
SKTexture* texture = [tilesetInfo textureForGid:gID];
SKSpriteNode* sprite = [SKSpriteNode spriteNodeWithTexture:texture];
sprite.name = [NSString stringWithFormat:@"%ld",(long)(col + row * layerInfo.layerGridSize.width)];
// make sure it's in the right position.
if (mapInfo.orientation == OrientationStyle_Isometric)
{
sprite.position = CGPointMake((layer.mapTileSize.width / 2.0) * (layerInfo.layerGridSize.width + col - row - 1),
(layer.mapTileSize.height / 2.0) * ((layerInfo.layerGridSize.height * 2 - col - row) - 2) );
}
else
{
sprite.position = CGPointMake(col * layer.mapTileSize.width + layer.mapTileSize.width/2.0,
(mapInfo.mapSize.height * (tilesetInfo.tileSize.height)) - ((row + 1) * layer.mapTileSize.height) + layer.mapTileSize.height/2.0);
}
// flip sprites if necessary
if(flipDiag)
{
if(flipX)
sprite.zRotation = -M_PI_2;
else if(flipY)
sprite.zRotation = M_PI_2;
}
else
{
if(flipY)
sprite.yScale *= -1;
if(flipX)
sprite.xScale *= -1;
}
// add sprite to correct node for this tileset
SKNode* layerNode = layerNodes[tilesetInfo.name];
if (!layerNode) {
layerNode = [[SKNode alloc] init];
layerNodes[tilesetInfo.name] = layerNode;
}
//adding physicsbody to every tile
//sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(sprite.frame.size.width, sprite.frame.size.height)];
//sprite.physicsBody.dynamic = NO;
//sprite.physicsBody.categoryBitMask = mapCategory;
//[arrayOfSprites addObject:sprite.physicsBody];
[layerNode addChild:sprite];
NSUInteger indexes[] = {col, row};
NSIndexPath *indexPath = [NSIndexPath indexPathWithIndexes:indexes length:2];
[layer.tilesByColumnRow setObject:sprite forKey:indexPath];
//MY CODE
sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.frame.size];
sprite.physicsBody.dynamic = NO;
[arrayOfSprites addObject:sprite.physicsBody];
//-----||------
#ifdef DEBUG
// CGRect textRect = [texture textureRect];
// NSLog(@"atlasNum %2d (%2d,%2d), gid (%d,%d), rect (%f, %f, %f, %f) sprite.pos (%3.2f,%3.2f) flipx%2d flipy%2d flipDiag%2d", gID+1, row, col, [tilesetInfo rowFromGid:gID], [tilesetInfo colFromGid:gID], textRect.origin.x, textRect.origin.y, textRect.size.width, textRect.size.height, sprite.position.x, sprite.position.y, flipX, flipY, flipDiag);
#endif
}
}
}
//MY CODE
NSArray *array = [arrayOfSprites copy];
theSprite = [SKNode node];
theSprite.physicsBody = [SKPhysicsBody bodyWithBodies:array];
theSprite.physicsBody.dynamic = NO;
theSprite.position = CGPointMake(layer.position.x+16, layer.position.y+16);
[layer addChild:theSprite];
//-----||------
// add nodes for any tilesets that were used in this layer
for (SKNode* layerNode in layerNodes.allValues) {
if (layerNode.children.count > 0) {
[layer addChild:layerNode];
}
}
[layer calculateAccumulatedFrame];
return layer;
}
在将物理体添加到每个图 block 并将这些物理体添加到 NSMutableArray 后,我将此 NSMutableArray 的副本分配给 NSArray 并尝试从中创建一个物理体,如下所示:
//MY CODE
NSArray *array = [arrayOfSprites copy];
theSprite = [SKNode node];
theSprite.physicsBody = [SKPhysicsBody bodyWithBodies:array];
theSprite.physicsBody.dynamic = NO;
theSprite.position = CGPointMake(layer.position.x+16, layer.position.y+16);
[layer addChild:theSprite];
//-----||------
结果,添加了一个高度和宽度为一格的物理体。
最佳答案
如果你想使用[SKPhysicsBody bodyWithBodies:array],那么你需要确保数组中的所有物体都是相对于父节点的。
sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.frame.size];
表示您的物理体位置是相对于 Sprite 节点的。您需要相对于父节点的正文。
我知道如何做到这一点的唯一方法是使用中心:
sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.frame.size center:sprite.position];
当它被添加到父节点时,这应该将 SKPhysicsBody
放置在 Sprite 的位置。
关于ios - 如何在 JSTileMap 生成的图 block 中添加PhysicsBody,并将其变成一个PhysicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40529435/
有没有人成功地使用 JSTilemap 只加载可见的图 block ?我问的原因是因为我的 map 太大而无法一次加载,我想单独加载分段或仅动态加载当前在屏幕上可见的那些图 block 。 我不想使用
我目前正在使用 JSTileMap 和 Swift。我希望我的玩家能够击中一个方 block 并将其打破。有谁知道如何做到这一点?另外,我该如何制作打破这个方 block 的动画?这是我的代码:` v
我正在尝试将我保存的 tilemap 添加到我的 swift 项目中,但不幸的是它对我来说不起作用。到目前为止,我已经做了这些事情: 1. I have imported libz.dylib fra
你能在 swift 中使用 JSTileMap 吗?如果可以,你如何使用它。如果我不能快速使用它,或者它有太多错误,那么还有什么我可以用于 .tmx map 的。请注意,我正在使用 sprite 工具
有人可以告诉我们哪个是更好的选择并列出一些优缺点吗? 对于游戏 -> .tmx? 其他原因 -> SKTileMapNode? 最佳答案 如果您看到 JSTileMap GitHub 上的 ReadM
我刚刚创建了一个在用户触摸位置创建对象的函数,但我希望它根据我的平铺 map 自动与平铺的中心对齐。 现在,我只能将对象放在我的触摸位置,而不是自动将其重定向到最近的图 block 。 http://
我使用 JSTileMap 来绘制关卡。我稍微改变了一下,将 SKPhysicsBody 添加到每个瓷砖,但有时当我对主角施加一些冲动并且他撞到墙壁/地面/天花板时,他表现得很奇怪。他用与物理原理相反
我已经使用 Tiled 创建了一个基本的 tilemap。我正在使用 JSTileMap 和 SpriteKit 来获取场景中的 map 。据我了解,JSTileMap(而不是 SKTexture)会
由于 JSTileMap 扩展了 SKNode,您可以使用 API 像任何其他节点一样移动和动画化您的 tilemap。但是,我不断收到这种奇怪的效果/故障... 代码: _tiledMap = [J
我正在尝试使用 SpriteKit 来可视化一张大 map 和 JSTileMap . map 大小为3398 x 4842 . 我通过在一层中使用 4 个大小为 1699 x 2421 的图块来定义
我的项目在 iPhone 6 上以 55-60FPS 的速度运行,但任何旧版本都完全无法播放,因为某些东西正在占用 CPU。 我认为问题与 map 上的图 block 和层数有关(64x256,4 层
我是一名优秀的程序员,十分优秀!