2009-11-07 49 views
1

我有加速度計的Bounce類中的UIView類的子類。 此彈跳類顯示圖像並將其移動到屏幕上。當iPhone設備移動時,此圖像在屏幕上彈跳。多個UIView實例不起作用

當我創建多個實例,只有最後一個實例工作properlty:

// in the MainViewController.m 

Bounce *heart[100]; 


for(int i = 0; i < 10; i++) { 
    rx = (arc4random() % 300) + 10; 
    ry = (arc4random() % 300) + 10; 
    NSLog(@"random %d %d", rx, ry); 
    heart[i] = [[Bounce alloc] initWithPNG:@"Heart.png" 
         position:CGPointMake(rx, ry) size:CGSizeMake(64, 64)]; 
    heart[i].velocity = CGPointMake(1.0, 1.0); 
    [self.view addSubview: heart[i]]; 
} 

這是Bounce類:

// 
// Bounce.h 
// iMakeLove 
// 
// Created by Giovambattista Fazioli on 06/11/09. 
// Copyright 2009 Saidmade srl. All rights reserved. 
// 

#import <UIKit/UIKit.h> 


@interface Bounce : UIView <UIAccelerometerDelegate> { 

    CGPoint  position; 
    CGSize  size; 
    CGPoint  velocity; 
    NSTimer  *objTimer; 
    NSString *pngName; 
    CGFloat  bounce; 
    CGFloat  gravity; 
    CGPoint  acceleratedGravity; 
    CGPoint  lastTouch; 
    CGPoint  currentTouch; 
    BOOL  dragging; 

    UIAccelerometer *accelerometer; 

} 



@property CGPoint position; 
@property CGSize size; 
@property CGPoint velocity; 
@property(nonatomic,retain)NSString *pngName; 
@property(nonatomic,retain)NSTimer *objTimer; 
@property CGFloat bounce; 
@property CGFloat gravity; 
@property CGPoint acceleratedGravity; 
@property CGPoint lastTouch; 
@property CGPoint currentTouch; 
@property BOOL dragging; 

- (id)initWithPNG:(NSString*)imageName position:(CGPoint)p size:(CGSize)s; 

- (void)update; 
- (void)onTimer; 
- (void)startPrevent; 

@end 

實現:

// 
// Bounce.m 
// iMakeLove 
// 
// Created by Giovambattista Fazioli on 06/11/09. 
// Copyright 2009 Saidmade srl. All rights reserved. 
// 

#import "Bounce.h" 

@implementation Bounce 

@synthesize position, size; 
@synthesize objTimer; 
@synthesize velocity; 
@synthesize pngName; 
@synthesize bounce; 
@synthesize gravity, acceleratedGravity; 
@synthesize lastTouch, currentTouch; 
@synthesize dragging; 



- (id)initWithPNG:(NSString*)imageName position:(CGPoint)p size:(CGSize)s { 

    if (self = [super initWithFrame:CGRectMake(p.x, p.y, s.width, s.height)]) { 

     [self setPngName:imageName]; 
     [self setPosition:p]; 
     [self setSize:s]; 
     [self setBackgroundColor:[UIColor clearColor]]; 

     // Set default gravity and bounce 

     [self setBounce:-0.9f]; 
     [self setGravity:0.5f]; 
     [self setAcceleratedGravity:CGPointMake(0.0, gravity)]; 
     [self setDragging:NO]; 

     UIImageView *prezzie = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, s.width, s.height)]; 

     prezzie.image = [UIImage imageNamed:imageName]; 

     [self addSubview:prezzie]; 

     [prezzie release]; 

     self.accelerometer = [UIAccelerometer sharedAccelerometer]; 
     self.accelerometer.delegate = self; 

    } 
    return self; 
} 

- (void)startPrevent { 
    if (objTimer == nil) { 
     objTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; 
    } 
} 


- (void)update { 

    [self setNeedsDisplay]; 

    if(dragging) return; 

    velocity.x += acceleratedGravity.x; 
    velocity.y += acceleratedGravity.y; 
    position.x += velocity.x; 
    position.y += velocity.y; 

    if(position.x + size.width >= 320.0) { 
     position.x = 320.0 - size.width; 
     velocity.x *= bounce; 
    } else if(position.x <= 0.0) { 
     velocity.x *= bounce; 
    } 

    if(position.y + size.height >= 480.0) { 
     position.y = 480.0 - size.height; 
     velocity.y *= bounce; 
    } else if(position.y <= 0.0) { 
     velocity.y *= bounce; 
    } 
    self.frame = CGRectMake(position.x, position.y, size.width, size.height); 
} 



- (void)onTimer { 
    [self update]; 
} 



- (void)drawRect:(CGRect)rect { 

    // Drawing code 

} 

/* EVENTS */ 


- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    acceleratedGravity.x = acceleration.x * gravity; 
    acceleratedGravity.y = -acceleration.y * gravity; 
} 



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // First, lets check to make sure the timer has been initiated 

    if (objTimer == nil) { 
     objTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; 
    } 

    UITouch *touch = [touches anyObject]; 

    [self setCurrentTouch:[touch locationInView:self]]; 
    CGFloat dx = currentTouch.x - position.x; 
    CGFloat dy = currentTouch.y - position.y; 
    CGFloat dist = sqrt(dx * dx + dy * dy); 

    if(dist < size.width) { 
     [self setVelocity:CGPointMake(0.0, 0.0)]; 
     [self setDragging:YES]; 
    } 
    [self setLastTouch:currentTouch]; 

} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    [self setCurrentTouch:[touch locationInView:self]]; 
    [self setDragging:YES]; 
    [self setVelocity:CGPointMake(currentTouch.x - lastTouch.x, currentTouch.y - lastTouch.y)]; 
    [self setLastTouch:currentTouch]; 

} 



- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self setDragging:NO]; 
} 





- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

你能幫助我嗎?

+0

詳情...會發生什麼?出了什麼問題?什麼不行? – marcc

+0

如果您製作了10個實例,它們會在屏幕上顯示,但 只有最後一個Bounce實例可以使用Accelerometer正常工作。 – Undolog

+0

Bounce.m? iMakeLove?我可以從這裏看到應用拒絕:) –

回答

2

這是因爲self.accelerometer.delegate = self;正在更改sharedAccelerometer的代表,只有最後一項分配纔會生效。

0

我相信只有最前面的視圖纔會得到加速度信息。您可能希望將加速度計消息發送到您的viewcontroller。

+0

非常好的主意......謝謝... – Undolog

0

我可能會在這裏做什麼。 (它可能不是最好的東西,但會解決當前的問題)是這樣的:

我想讓加速引力成爲所有Bounce實例之間共享的靜態變量。這對我來說很重要,因爲在現實世界中(我們模擬的那個)加速引力對於所有反彈都是一樣的。 (我也會將Bounce重命名爲BouncingView)。我會通過幾個類方法訪問該變量。此外,我會使加速度計共享,並有其委託方法,類方法。把這些東西放在你的課堂上,它應該可以工作:(我會測試它,但是我的開發機器在蘋果商店中得到修復。)另外,你發佈的示例代碼中有幾個語法錯誤。

static CGCGPoint acceleratedGravity; 
    static UIAccelerometer *accelerometer; 

    -(void) init { 
     /* Everything Else */ 
     self.accelerometer = [UIAccelerometer sharedAccelerometer]; 
     self.accelerometer.delegate = self; 
     /*Everything Else */ 
    } 

    +(CGPoint) acceleratedGravity { 
     return acceleratedGravity; 
    } 

    +(void) setAcceleratedGravity:(CGPoint) _acceleratedGravity { 
     acceleratedGravity = _acceleratedGravity; 
    } 

+ (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    acceleratedGravity.x = acceleration.x * gravity; 
    acceleratedGravity.y = -acceleration.y * gravity; 
} 
+0

委託方法中的+會將它從實例範圍移動到類範圍。 –

+0

謝謝...語法錯誤在哪裏? – Undolog

+0

沒有主要的,rx和ry在你的主視圖控制器for循環中沒有拖延。 (至少不在代碼片段中),而在Bounce類中,您在實現中使用self.accelerometer,但在頭中沒有屬性聲明(僅變量),並且沒有@synthisize。你能夠理清你的加速度計問題嗎? –