我很难理解JSTileMap如何与SpriteKit和平铺一起工作。
该问题与像素和点有关,也与使用基于屏幕比例因子的JSTileMap加载分集有关。
项目中的文件结构
在我的项目中,有一些文件具有以下结构,这表示了我的低分辨率映射(1024x768px和32x32px瓷砖):
在这种情况下,当我加载电平-1.tmx在非视网膜模拟器,一切都是正确的定位。当我在视网膜模拟器上运行相同的配置时,同样,一切都很好,但是瓷砖被缩放了。因为这种品质受到了损害。那么,在需要的时候如何加载高分辨率的呢?
另一个解决方案
我还试图通过对每个级别使用两个版本的地图(低分辨率和高分辨率)来解决这个问题。这实际上是我想避免的,但仍然是可以接受的:
对于这种情况,我有这样的文件结构(map是2048x1536和64x64px瓷砖):
我想那张尺寸为2048x1536的双倍的地图适合我的地图的高分辨率版本吗?另外,正如您所看到的,在我的项目中根本没有@2xtilesets(我猜我们不能使用带有平铺编辑器和JSTileMap?)的@2x后缀。
这种配置的问题是所有的东西都被改变了(位置和平铺是加倍的)。JSTileMap可能与点一起工作,用像素平铺,最重要的是有一个已知的与纹理地图集相关的iPad模拟错误,这让我很难理解是什么导致了高分辨率地图的问题。
有人能澄清这些关于使用JSTileMap,SpriteKit和平铺的事情吗?谢谢!
发布于 2015-01-18 11:01:38
我拿到你的味精了。
首先,您需要瓷砖的@1x和@2x版本(精灵)。因此,如果您有一本名为myTiles的地图集,您将需要: myTiles.png & myTiles@2x.png。
我用纹理封隔器制作了我的雪碧薄片。我添加了@2x图像,然后在导出时让它创建一个@1x版本。
在平铺中,只使用@1x版本,这样您就可以使用myTiles.png
如果您的地图是32x32,您的@1x版本将是32x32,您的@2x版本将是64x64。
忘记SD & HD文件夹,只需使用一个名为“假设级别”的文件夹。
在这里你需要:
级别-1.tmx,tmx-级别-sd.1.png,tmx-级别-sd.1@2x.png
您可以在主级别文件夹下有子文件夹。取决于您,但是您必须同时拥有png的@1x版本和@2x版本,您不能只复制@1x或@2x版本。@1x版本必须是基于32x32的瓷砖,而@2x版本必须是该版本的两倍(64x64)。在tmx文件本身中,您不会加载@2x版本,因为这会使您的级别变得一团糟。
**所以你的游戏将在32x32分号上进行。雪碧工具包将做的是双倍的像素在视网膜显示,为此,您需要有@2x版本,否则它将升级您的@1x版本,瓷砖将看起来很大,像素化。所以,尽量不要混淆整个像素点的东西。
代码示例:
GameViewController (装载场景):
- (void)viewDidLoad
{
[super viewDidLoad];
self.currentLevel = 1;
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
// Create and configure the scene.
LevelScene *scene = [[LevelScene alloc]initWithSize:skView.bounds.size level:self.currentLevel];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
LevelScene (Loads ):
#import "LevelScene.h"
#import "SKTAudio.h"
#import "JSTileMap"
#import "Player.h"
@interface LevelScene()
@property (nonatomic, assign) NSUInteger currentLevel;
@property (nonatomic, strong) SKNode *gameNode;
@property (nonatomic, strong) JSTileMap *map;
@property (nonatomic, strong) Player *player;
@property (nonatomic, assign) NSTimeInterval previousUpdateTime;
@implementation LevelScene
-(id)initWithSize:(CGSize)size level:(NSUInteger)currentLevel {
if ((self = [super initWithSize:size])) {
self.currentLevel = currentLevel;
self.gameNode = [SKNode node];
[self addChild:self.gameNode];
NSString *levelName = [levelDict objectForKey:@"level"];
self.map = [JSTileMap mapNamed:levelName];
[self.gameNode addChild:self.map];
return self;
}
https://stackoverflow.com/questions/27921999
复制相似问题