首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >横向时更改大小的切片地图

横向时更改大小的切片地图
EN

Stack Overflow用户
提问于 2014-04-01 20:04:37
回答 3查看 171关注 0票数 1

我正在开发一个小应用程序,在这个应用程序中,我将tilemap ( JSTilemap )加载到sprite工具包中。

这一切都很好,除了瓷砖地图看起来正常和良好的肖像,但当我翻转到风景,它似乎爆炸。我没有添加任何代码,只是导入了JSTilemap头,这段代码初始化了大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.map = [JSTileMap mapNamed:@"tilemap.tmx"];
[self addChild:self.map];

我还下载了一个带有磁贴地图的简单项目,当我旋转时,大小保持不变,只是如果我试图模仿代码,我的磁贴地图似乎仍然会在我旋转它时爆炸。

是否有一些设置可以限制我遗漏的内容?

EN

回答 3

Stack Overflow用户

发布于 2015-03-27 09:18:51

您应该使用-(id)initWithSize:(CGSize)size而不是-(void)didMoveToView:(SKView *)view

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -(id)initWithSize:(CGSize)size {
        if (self = [super initWithSize:size]) {
     JSTileMap* tiledMap = [JSTileMap mapNamed:@"level1.tmx"];
            if (tiledMap)
                [self addChild:tiledMap];
            self.userInteractionEnabled = YES;
        }
        return self;
    }

此外,在GameViewController中(如果使用的是默认模板类),应使用sceneWithSize更改场景初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /*
    // Create and configure the scene.
    GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    */

   // Create and configure the scene.
    SKScene * scene = [GameScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
票数 1
EN

Stack Overflow用户

发布于 2014-04-06 20:38:19

票数 0
EN

Stack Overflow用户

发布于 2015-06-12 09:15:59

只是想让你知道,当运行你的应用程序时,iPhone总是以纵向模式开始。这与Sprite Kit无关。它是关于一般的iOS生命周期和视图问题。扭曲内容或完全丢失内容就是因为这个原因。在制作游戏时,通常使用肖像或风景。同时使用它们的情况非常少见。要理解为什么您的内容被“拉伸”,请将以下代码写入到SKScene的initWithSize方法中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSLog(@"In initWithSize, at %0.f wide and %0.f high", size.width, size.height);

启动游戏并查看NSLog消息。即使我们认为我们是在横向模式下开始的(也就是说,如果你倾斜你的手机,等待游戏加载或稍晚一点),NSLog消息显示“在initWithSize中,320宽568高”(我使用的是iPhone 5S)。这意味着即使我们在Targets/Deployment Info部分选择了Landscape模式,场景也是以纵向模式渲染的。我们希望宽度大于高度(568宽,320高)!但是为什么会发生这一切呢?问题出在内部。iOS应用程序生命周期开始于纵向中的每个应用程序,只有在加载过程中才切换到横向。所以故事板加载,它加载初始的视图控制器,它仍然认为它是纵向的。该视图控制器将自动加载视图对象(对于Sprite Kit,即SKView)。我们还在做纵向定向。视图对象已加载,这将导致在视图控制器中回调viewDidLoad。我们还在做纵向定向。但在viewDidLoad方法中,这是我们创建场景(SKScene)的地方,传入当前的高度和宽度。仍然是肖像定向。所有这一切只花了不到一秒钟的时间,但只有在这之后,应用程序才意识到它应该处于Landscape中,并且View Controller切换到Landscape the the View with it。根据你的设置,场景要做的是试图通过放大来填充可用的空间来对此做出反应,我们将会松散内容,因为在内部它仍然是放大的肖像orientation...just。我们该如何解决这个问题呢?我们的场景是在viewDidLoad中创建的,但是当发生这种情况时,应用程序还不知道我们应该处于横向模式。所以我们需要创建我们的场景,但是我们只需要在这个过程的后面一点-在iOS应用程序生命周期意识到我们处于横向模式之后。有几种不同的方法可以做到这一点。我喜欢的是viewWillLayoutSubviews。它是另一个内置的View Controller方法。它会在viewDidLoad之后和转换到横向模式后自动调用。因此,如果我们将场景创建延迟几毫秒,直到我们处于viewWillLayoutSubviews方法中,那么我们就可以用正确的方向创建它。因此,复制并粘贴viewDidLoad中的所有代码(除了对超级viewDidLoad;的调用),并将其放入viewWillLayoutSubviews。现在只有一个问题了。viewWillLayoutSubviews可能会被调用几次,或者在生命周期中至少被调用一次以上。没关系。我们只是不想多次创建场景。因此,一旦我们抓取了视图,我们将创建一个if语句来检查该视图中是否有Scene对象。如果没有,我们将创建它并返回它。否则,我们不需要这样做。下面是所有这些代码在创建我们的场景的View Controller中的样子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Method can be deleted (It's called behind the scenes regardless).
-(void)viewDidLoad
{
    [super viewDidLoad];
}


//Called AFTER viewDidLoad & after the view shifts to landscape (which is what we want).
-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews]; //Don't really need to call this method (but a good habit just in case Apple ever changes that).

    //Configure the view.
    _skView = (SKView *)self.view;
    _skView.showsFPS = YES;
    _skView.showsNodeCount = YES;
    //_skView.showsPhysics = YES;

    //viewWillLayoutSubviews might get called several times & that's ok. But, we don't want several GameScenes to be created. Therefore...
    //Is there a scene object in that view? If there ISN'T, we'll create it.
    if (!_skView.scene)
    {
        //Create & configure the scene.
        SKScene *sceneGame = [MainMenuScene sceneWithSize:_skView.bounds.size];
        sceneGame.scaleMode = SKSceneScaleModeAspectFill;

        //Present the scene.
        [_skView presentScene:sceneGame transition:[SKTransition fadeWithDuration:0.5]];
    }
    //If there is, we don't need to do that.
}

现在继续运行下面的代码。现在一切看起来都很好。NSLog消息现在应该显示“在initWithSize中,宽568,高320”。万岁!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22795821

复制
相关文章
Mybatis中判断集合的 size 不为空
Mybatis中判断集合的size, 可以用下面的方法来做。 <if test="null != staffCodeList and staffCodeList.size > 0"> and gui.USER_CODE not in <foreach collection="staffCodeList" item="staffCode" open="(" separator="," close=")"> #{staffCode} </foreach> </if>
一个会写诗的程序员
2020/04/30
4.9K0
go中interface空指针不为nil判断方法
当把一个空指针对象赋值给一个interface后,再判断!= nil就不再成立了 代码如下
雪山飞猪
2019/08/29
2.4K0
Nullable Reference Types 可空引用类型
但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。
solenovex
2019/10/15
8190
Nullable Reference Types 可空引用类型
如何检查 MySQL 中的列是否为空或 Null?
在MySQL数据库中,我们经常需要检查某个列是否为空或Null。空值表示该列没有被赋值,而Null表示该列的值是未知的或不存在的。在本文中,我们将讨论如何在MySQL中检查列是否为空或Null,并探讨不同的方法和案例。
网络技术联盟站
2023/07/14
1.4K0
如何检查 MySQL 中的列是否为空或 Null?
如何检查 MySQL 中的列是否为空或 Null?
在MySQL数据库中,我们经常需要检查某个列是否为空或Null。空值表示该列没有被赋值,而Null表示该列的值是未知的或不存在的。在本文中,我们将讨论如何在MySQL中检查列是否为空或Null,并探讨不同的方法和案例。
网络技术联盟站
2023/08/03
3.3K0
如何检查 MySQL 中的列是否为空或 Null?
bootstrap 表单验证 不为空验证
<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="css/bootstrapValidator.min.css" rel="stylesheet" type="text/css"> <script src="http://code.jquery.com/jquery.js"></script> <script src="js/bootstrap.min.js"></script> <script src="js/bootstrapValidator.min.js"></script> </head> <body>  <form role="form"> <div class="form-group"> <label>Username</label> <input type="text" class="form-control" name="username" /> </div> <div class="form-group"> <label>Email address</label> <input type="text" class="form-control" name="email" /> </div> <div class="form-group"> <button type="submit" name="submit" class="btn btn-primary">Submit</button> </div> </form> <script>
用户5760343
2019/07/07
8.7K0
在 Java 中如何优雅地判空
  作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException。
芋道源码
2019/11/21
2.4K0
在Java中如何优雅地判空
作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPointerException。
JAVA葵花宝典
2019/11/15
1.4K0
怎么判断map不为空「建议收藏」
这里是用isEmpty()方法来做判断,其实和map.size()也没差,可以看下isEmpty()方法的源码:
全栈程序员站长
2022/09/07
2.4K0
c#中的可空类型和空合并操作符(Nullable Types 和 Null Coalescing Operator)
在本文中,我们将讨论可空类型和空合并操作符以及如何在基于c#的代码中使用它们。 这是c#编程中的一个基本概念。在这里,我将解释可空类型,c#中的空合并操作符,以及如何在LINQ中使用该操作符。 c#中
程序你好
2018/07/20
4.1K0
在Oracle中,如何获取ASH报告?
(2)使用OEM,可以在性能页,单击“运行ASH报告”按钮生成ASH报告,由于OEM生产用的相对比较少,这里就不讨论了。
AiDBA宝典
2023/08/10
1.3K0
在Oracle中,如何获取ASH报告?
在DragonOS中,使蜂鸣器发声
很简单,代码如下: void beep(uint64_t times) { io_out8(0x43, 182&0xff); io_out8(0x42, 2280&0xff); io_out8(0x42, (2280>>8)&0xff); uint32_t x = io_in8(0x61)&0xff; x |= 3; io_out8(0x61, x&0xff); times *= 10000; for(uint64_t i=0;i<times
灯珑LoGin
2022/10/31
4110
Java判断不为空的工具类总结
1、Java判断是否为空的工具类,可以直接使用。包含,String字符串,数组,集合等等。
别先生
2018/08/09
5K0
【DB笔试面试692】在Oracle中,V$SYSSTAT中的CLASS列分别代表什么?
V$SYSSTAT列代表统计类别,其值为1代表事例活动;值为2代表Redo buffer活动;值为4代表锁;值为8代表数据缓冲活动;值为16代表OS活动;值为32代表并行活动;值为64代表表访问;值为128代表调试信息。
AiDBA宝典
2019/11/25
1.5K0
验证多个class相同的input框不为空
要求,页面有多个class相同的input输入框,在提交数据的时候,进行验证,验证input框不能为空,如果哪个为空,则弹出提示:
王小婷
2020/05/26
1.8K0
验证多个class相同的input框不为空
如何使程序在Linux后台运行
这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:
阿凡亮
2020/04/14
8.8K0
xml 里面判断int类型,String类型不为空
目录 1 int类型 2 String类型 1 int类型 <if test="status != null"> and c.status = #{status} </if> 则0和1都可以 所以数字判断的时候,应该是只要判断非空就可以。 2 String类型 <if test="status != null and status != ''"> and c.status = #{status} </if>
一写代码就开心
2022/08/14
1.9K0
在Oracle中,如何定时删除归档日志文件?
1、在Oracle用户下,创建归档日志删除文件del_OCPLHR1_arch.sh
AiDBA宝典
2018/11/29
3.4K0
在Oracle中,如何定时删除归档日志文件?
在Oracle中,如何定时删除归档日志文件?
1、在Oracle用户下,创建归档日志删除文件del_OCPLHR1_arch.sh
AiDBA宝典
2022/11/07
2.1K0
点击加载更多

相似问题

卡片布局动作按钮

12

使用卡片布局,卡片不能互换?

14

如何在卡片列表(角)中翻转一张卡片

11

从卡片阵列中调用一张卡片

21

使用卡片切换按钮动态创建布局

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文