IOS 2D游戏开发框架 SpriteKit-->续(postion,锚点,游戏滚动场景)

一、 Postion

这里的postion和app开发中的layer.postion是一样的,postion的值代表该视图在父节点中的相对位置, 比如一个试图的父节点是self.view, 这里我们想让这个试图在self.view中居中显示,那么layer.postion=CGPointMake(self.view.frame.size.widht/2,self.view.frame.size.height/2)...坐标就是标准的二维坐标系,x减少,位置像左移,x增加像右移, y增加像上移,y减少像下移,中心点是坐标原点。app开发中这个属性一般在使用动画时才会使用到。

一、 锚点

锚点的取值范围是(0,0.5,1)试图的默认锚点是:(0.5,0.5),锚点我把它理解为试图在一个范围内重复执行一个相同动作行为的支撑点,下面我截图说东西。

这里就是一个视图上可以取的锚点值,本来想传一个录制的视频,形象的说明下这东西,但是tmd发现不能传视频,来个详细地址,要深入理解自己去看。

http://jingyan.baidu.com/album/9f63fb918fa9ddc8400f0ec5.html?picindex=4

三、滚动场景背景图

关于实现滚动场景的背景图滚动的方法很多,这里只是我自己的方式,你也许会有更好的,首先滚动的背景图要想无缝连接上,那必须要美工把图做好了,这里我是用的三个精灵节点作为背景,当每个精灵节点的postion y超出顶部屏幕时,就将最后增加的那个背景节点的postion赋值给它,下面贴代码。

  1 #import "GameScene.h"
  2 @implementation GameScene
  3
  4 {
  5    //场景背景节点精灵存放数组
  6     NSMutableArray *NearbyArray;
  7
  8 }
  9
 10 /*初始化场景的方法,在uiviwecontroller 初始化场景时调用的方法*/
 11 - (instancetype)initWithSize:(CGSize)size
 12 {
 13      if (self = [super initWithSize:size]) {
 14
 15         NearbyArray=[[NSMutableArray alloc]init];
 16           /*第一个场景背景节点*/
 17         UIImage  *farTextureImage=[UIImage imageNamed:@"planeBack"];
 18         SKTexture *farTexture = [SKTexture  textureWithImage:farTextureImage];
 19
 20         SKSpriteNode  *farTextureSpriteOne = [SKSpriteNode spriteNodeWithTexture:farTexture size:self.size];
 21         // farTextureSpriteOne.anchorPoint=CGPointMake(DEVICE_Width/2, DEVICE_Height/2);
 22         farTextureSpriteOne.zPosition=0;
 23          farTextureSpriteOne.position=CGPointMake(self.frame.size.width/2, self.frame.size.height/2 );
 24
 25
 26
 27
 28             /*第二个场景背景节点*/
 29          UIImage  *farTextureImageTwo=[UIImage imageNamed:@"planeBack"];
 30          SKTexture *farTextureTwo = [SKTexture  textureWithImage:farTextureImageTwo];
 31             SKSpriteNode  *farTextureSpriteTwo = [SKSpriteNode spriteNodeWithTexture:farTextureTwo size:self.size];
 32         //farTextureSpriteTwo.anchorPoint=CGPointMake(0, 0);
 33         farTextureSpriteTwo.zPosition=0;
 34         farTextureSpriteTwo.position=CGPointMake(farTextureSpriteOne.position.x, -(self.frame.size.height/2-10));
 35
 36
 37
 38         /*第三个场景背景节点*/
 39          UIImage  *farTextureImageThree=[UIImage imageNamed:@"planeBack"];
 40         SKTexture *farTextureThree = [SKTexture  textureWithImage:farTextureImageThree];
 41
 42         SKSpriteNode  *farTextureSpriteThree =[SKSpriteNode spriteNodeWithTexture:farTextureThree size:self.size];
 43
 44          farTextureSpriteThree.zPosition=0;
 45         farTextureSpriteThree.position=CGPointMake(farTextureSpriteOne.position.x, -(self.frame.size.height/2+self.frame.size.height-20));
 46
 47
 48
 49
 50         [self addChild:farTextureSpriteOne];
 51         [self addChild:farTextureSpriteTwo];
 52           [self addChild:farTextureSpriteThree];
 53
 54         /*把三个场景背景节点加到一个数组中去,等会滚动之后,才好快速获取每个节点,重置postion*/
 55         [NearbyArray addObject:farTextureSpriteOne];
 56          [NearbyArray addObject:farTextureSpriteTwo];
 57         [NearbyArray addObject:farTextureSpriteThree];
 58
 59
 60     }
 61     return self;
 62
 63 }
 64
 65 /*设置背景图片滚动的方法*/
 66 -(void)BackMove:(CGFloat)moveSpeed
 67 {
 68
 69     for (int i=0; i<NearbyArray.count; i++) {
 70         SKSpriteNode *TempSprite=[NearbyArray objectAtIndex:i];
 71
 72
 73         [TempSprite setPosition:CGPointMake(TempSprite.position.x,TempSprite.position.y+moveSpeed)];
 74     }
 75
 76     //循环滚动算法
 77     SKSpriteNode *RollOneSprite=[NearbyArray objectAtIndex:0];
 78     SKSpriteNode *RollTwoSprite=[NearbyArray objectAtIndex:1];
 79      SKSpriteNode *ThreeBackSprit=[NearbyArray objectAtIndex:2];
 80
 81     if (RollOneSprite.position.y>(self.frame.size.height/2+self.frame.size.height))
 82        {
 83          RollOneSprite.position=CGPointMake(RollOneSprite.position.x, -(self.frame.size.height/2+self.frame.size.height-30));
 84
 85     }
 86       if (RollTwoSprite.position.y>(self.frame.size.height/2+self.frame.size.height)) {
 87             RollTwoSprite.position=CGPointMake(RollOneSprite.position.x, -(self.frame.size.height/2+self.frame.size.height-30));
 88
 89     }
 90     if (ThreeBackSprit.position.y>(self.frame.size.height/2+self.frame.size.height)) {
 91           ThreeBackSprit.position=CGPointMake(RollOneSprite.position.x, -(self.frame.size.height/2+self.frame.size.height-30));
 92
 93     }
 94 }
 95
 96 /*这个方法是spritekit 的场景自带的,每过一秒就会被调用*/
 97 -(void)update:(CFTimeInterval)currentTime {
 98     [self BackMove:2];
 99
100
101 }
102
103 @end

UIViewController调用

 1 - (void)viewDidLoad
 2 {
 3     [super viewDidLoad];
 4
 5     // Configure the view.
 6     SKView * skView = (SKView *)self.view;
 7     skView.showsFPS = YES;
 8     skView.showsNodeCount = YES;
 9     /* Sprite Kit applies additional optimizations to improve rendering performance */
10     skView.ignoresSiblingOrder = YES;
11
12
13    GameScene *scene = [[GameScene alloc]initWithSize:skView.bounds.size];
14
15     scene.scaleMode = SKSceneScaleModeAspectFill;
16
17     [skView presentScene:scene];
18
19 }
时间: 2024-10-13 14:12:36

IOS 2D游戏开发框架 SpriteKit-->续(postion,锚点,游戏滚动场景)的相关文章

IOS 2D游戏开发框架 SpriteKit

最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵.....,查了下其实人家早有人这样做了........发现这功能我当然很开了,所以下了两个案例准备学学.以前业余时间也学过一下cocos2d-x这样的跨平台游戏框架,也做过小案例,所以感觉这个框架并不麻烦,而且比cocos2d-x简单.并且这框架我不应该像C2D-X那样学了就扔哪里不管了,因为IOS开发正是我

使用Swift和SpriteKit写一个忍者游戏

这篇文章的游戏使用SpriteKit和Swift语言来完毕. SpriteKit是苹果自己的游戏引擎,更能贴合iOS系统底层的API,只是架构和实现上都是模仿了Cocos2D.所以使用上事实上区别不大,只是SpriteKit更轻量级一些. 程序入口 main函数跟OC一样,将入口指向了appdelegate,而cocoa touch框架差点儿跟OC一样,仅仅只是用Swift重写了一遍. 这些模板自带的方法跟OC项目并无差异... 開始编写游戏 假设你了解CCNode,CCSprite,CCSce

android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动

http://www.cnblogs.com/htynkn/archive/2012/01/13/libgdx_13.html 本文紧跟上文,地址:android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用 地图我们创建好了接下来就是主角的出现.其实上文介绍了如何TiledMap和Stage的结合,角色的处理就简单了. 可以继承Actor类创建主角类,我就偷个懒,用Image代替. 编辑我们的TMX文件,添加一个对象层. 在主角要出现的地方加个形状 取名为play1 我们的

iOS原生地图开发指南续——大头针与自定义标注

iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/2340880/blog/415360系统总结了iOS原生地图框架MapKit中主体地图的设置与应用.这篇是上一篇的一个后续,总结了系统的大头针视图以及自定义标注视图的方法. 一.先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议.所以可以了解,标注这个概念在逻辑属

Unity 2D游戏开发教程之使用脚本实现游戏逻辑

Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态.但是这其中还有一些问题.例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精灵也只是在原地播放动画而已.但我们希望精灵在进入到PlayerWalkingAnimation状态时,位置应该发生改变. 要解决这些问题,就需要编写脚本.也就是说,要使用脚本来实现动画的播放控制,以及其它一些游戏的逻辑

iOS Sprite Kit教程之滚动场景

iOS Sprite Kit教程之滚动场景 滚动场景 在很多的游戏中,场景都不是静止的,而是滚动的,如在植物大战僵尸的游戏中,它的场景如图2.26所示. 图2.26  植物大战僵尸 在图2.26中,用黑色框框住的部分是在屏幕上显示的,即玩家是可以看到的.右边的这些内容玩家就看不到了,为了让玩家可以熟悉场景中的内容,此游戏在开始时,首先对屏幕中的场景进行滚动.本节将为开发者实现场景滚动的功能. Sprite Kit中让场景进行滚动 以下是如何让一个场景进行滚动的具体实现方法. 1.创建项目以及添加

2048游戏回顾一:使用SurfaceView创建游戏启动动画

SurfaceView有个很大的好处,就是可以在子线程中绘制UI,其他的View只能在主线程中更新UI,这或多或少给编程增加了些不便.而SurfaceVIew在子线程中可以绘制UI的特性,再加上其可以直接从内存或者DMA等硬件接口取得图像数据,这使得它适合2d游戏的开发. SurfaceView使用步骤 SurfaceView的使用比较简单,可以总结为如下几个步骤: 1.继承SurfaceView并实现 SurfaceHolder.Callback方法 譬如: public class Star

【读书笔记《Android游戏编程之从零开始》】13.游戏开发基础(Paint 画笔)

1.Paint画笔 Panit(画笔)是绘图额辅助类,其类中包含文字和位图额样式.颜色等属性信息.Paint 的常用方法如下: setAntiAlias(boolean aa) 作用:设置画笔是否无锯齿 参数:true 表示无锯齿,false 表示有锯齿,默认为 false . setAlpha(int a) 作用:设置画笔的透明度 参数:透明值 setTextAlign(Paint.Align align) 作用:设置绘制文本的锚点 参数:Paint.Align 类中的常量 measureTe

【Unity3D游戏开发】—— 太空大战打飞机游戏详解

大家好我是Kaven,今天给大家带来的是一个Unity3D的打飞机的小项目.俗话说"眼看千变,不如手过一边",学了差不多两星期Unity3D了,是时候找个小项目练练手了.于是就翻出了cocos2d-x的一个例子,模仿着写了一个飞机大战的游戏,虽然有一些功能没有实现,但总体上是完成了.闲话少说,下面开始吧. 由于这个用的是Unity3d自带的原生的2D插件native 2d,所以创建项目时左下角选择2d. 这个小游戏我分了三个场景,菜单场景,游戏场景,结束场景.由于菜单场景与结束场景都比