日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS:quartz2D绘图 (动画)

發(fā)布時(shí)間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS:quartz2D绘图 (动画) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

quartz2D可以用來繪制自己需要的圖形,它們繪制出來的是一個(gè)靜態(tài)的圖形,那么如何繪制一個(gè)動(dòng)態(tài)的圖形呢?動(dòng)態(tài)的圖形就是動(dòng)畫,所謂動(dòng)畫,其實(shí)就是很多張圖片在短時(shí)間內(nèi)不停的切換所產(chǎn)生的一種視覺效果。quartz2D可以繪制圖形,想一想,那么如果我們?cè)O(shè)置一個(gè)定時(shí)器,在很短的時(shí)間內(nèi)不停的繪制多張圖片,這不就是動(dòng)畫效果嗎?好了,思路已有,接下來就是實(shí)踐了。

?

代碼之前的一些準(zhǔn)備:首先需要一份連續(xù)的圖片素材,接著自定義一個(gè)視圖類,并將控制器中的視圖與它關(guān)聯(lián)在一起。

??

?

我準(zhǔn)備的素材是一個(gè)游戲的英雄人物,它有站著、攻擊(招式有三種)、奔跑的幾種狀態(tài),導(dǎo)入的素材文件為hero

???????

?

下面開始代碼的實(shí)現(xiàn)了:

1、在ViewController.m文件中初始化自定義的視圖,即設(shè)置視圖大小,并添加一個(gè)英雄圖片

- (void)viewDidLoad {[super viewDidLoad];//添加英雄視圖 HeroView *heroView = [[HeroView alloc]initWithFrame:self.view.bounds];[self.view addSubview:heroView]; }

?

2、現(xiàn)在余下所有的代碼都是自定義類ViewDemo.m文件中進(jìn)行的,即

//枚舉所有的英雄狀態(tài)

typedef enum{Hero_Stand,Hero_Run,Hero_Attack,Hero_AttackJ,Hero_AttackT }HeroState;

//聲明屬性?

@interface HeroView() @property (strong,nonatomic)NSTimer *timer; @property (assign,nonatomic)NSInteger index; @property (assign,nonatomic)HeroState state; @property (assign,nonatomic)CGPoint point; @end

//初始化視圖

-(instancetype)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self){//初始化一個(gè)開始索引_index = 1;//初始化一個(gè)英雄狀態(tài)_state = Hero_Stand;//定時(shí)器_timer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(updateIndex) userInfo:nil repeats:YES];self.backgroundColor = [UIColor whiteColor];}return self; }

//不使用時(shí)停止定時(shí)器

-(void)dealloc {//停止定時(shí)器if (_timer){[_timer invalidate];} }

//定時(shí)器刷新方法

-(void)updateIndex {//更新圖片額索引NSInteger maxIndex = 1;switch (_state){case Hero_Stand:maxIndex = 3;break;case Hero_Run:maxIndex = 11;break;case Hero_Attack:maxIndex = 5;break;case Hero_AttackJ:maxIndex = 8;break;case Hero_AttackT:maxIndex = 3;break;}//如果沒有到最后一張圖片,就累加if (_index < maxIndex){_index++;}//換成首張圖片else{_index = 1;}//讓視圖重繪 [self setNeedsDisplay]; }

//重寫drawRect方法,根據(jù)英雄狀態(tài)和索引繪制相應(yīng)的圖片

- (void)drawRect:(CGRect)rect {//畫不同狀態(tài)下的英雄UIImage *image;switch (_state){case Hero_Stand:image = [UIImage imageNamed:[NSString stringWithFormat:@"Hero%ld.png",_index]];break;case Hero_Run:image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroRun%ld.png",_index]];break;case Hero_Attack:image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttack%ld.png",_index]];break;case Hero_AttackJ:image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttackJ%ld.png",_index]];break;case Hero_AttackT:image = [UIImage imageNamed:[NSString stringWithFormat:@"HeroAttackT%ld.png",_index]];break;}//一張張繪制不同狀態(tài)的所有圖片 [image drawAtPoint:self.point]; }

//觸摸開始時(shí)的事件,每次點(diǎn)擊就會(huì)切換英雄的狀態(tài)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {//切換狀態(tài)if (_state < Hero_AttackT){_state ++;}else{_state = Hero_Stand;}_index = 1; }

//觸摸移動(dòng)事件,可以手動(dòng)移動(dòng)英雄的位置

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {//計(jì)算移動(dòng)的位置UITouch *touch = [touches anyObject];CGPoint location = [touch locationInView:self];CGPoint preLocation = [touch previousLocationInView:self];CGFloat xOffset = location.x - preLocation.x;CGFloat yOffset = location.y - preLocation.y;_point = CGPointMake(_point.x+xOffset, _point.y+yOffset);//讓視圖重繪 [self setNeedsDisplay]; }

好了所有的代碼都已寫完,下面就是演示了,由于無法插入視頻,就給出截圖了。

站著時(shí)繪制的英雄動(dòng)畫: ? ?

攻擊時(shí)繪制的英雄動(dòng)畫:三種攻擊方式

?

?

奔跑時(shí)繪制的英雄動(dòng)畫:

?

移動(dòng)英雄的位置到中間:

?

程序猿神奇的手,每時(shí)每刻,這雙手都在改變著世界的交互方式! 分類:?iOS高級(jí)
本文轉(zhuǎn)自當(dāng)天真遇到現(xiàn)實(shí)博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/4875411.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的iOS:quartz2D绘图 (动画)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。