如何实现水波纹?

时间:2009-03-20 05:25:37

标签: iphone opengl-es

我正在开发一款iphone游戏。因为我不得不产生水波纹。我不知道该怎么做。我听说可以用openGL完成。我对这个概念很陌生。任何人都可以指导我吗?

3 个答案:

答案 0 :(得分:14)

以下是我找到的一些资源:

Language Agnostic 2d Water Ripple Algorithm
alt text
(来源:virgin.net alt text
(来源:virgin.net

OpenGL Project with Water Ripples (Source)
alt text
(来源:sulaco.co.za

你也可能希望摆动GameDev's FAQ。向下滚动到“水渲染”部分。

答案 1 :(得分:2)

JK:

z=sin(x)+cos(y)

更严重的是,Quartz Composer基本上不会为您作为效果层之一做涟漪吗?还是只宣布了iPhone 3.0 SDK?

答案 2 :(得分:0)

我找到了水波纹效果的源代码,因此遵循代码实现到您的项目中并解决您的问题。

导入“HelloWorldLayer.h”

// HelloWorldLayer implementation
@implementation HelloWorldLayer

+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    HelloWorldLayer *layer = [HelloWorldLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
-(id) init
{

    if( (self=[super init])) {

        rippleImage = [ pgeRippleSprite ripplespriteWithFile:@"image_old.png" ];
        [ self addChild:rippleImage ];
        CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello Cocos2D Forum" fontName:@"Marker Felt" fontSize:16];
        label.position = ccp( 80 , 300 );
        [self addChild: label];
        [ [ CCTouchDispatcher sharedDispatcher ] addTargetedDelegate:self priority:0 swallowsTouches:YES ]; 

        // schedule update
        [ self schedule:@selector( update: ) ];    

    }
    return self;
}

float runtime = 0;

-( BOOL )ccTouchBegan:( UITouch* )touch withEvent:( UIEvent* )event {
    runtime = 0.1f;
    [ self ccTouchMoved:touch withEvent:event ];
    return( YES );
}

-( void )ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint pos;

    if ( runtime >= 0.1f ) {

        runtime -= 0.1f;

        // get touch position and convert to screen coordinates
        pos = [ touch locationInView: [ touch view ] ];
        pos = [ [ CCDirector sharedDirector ] convertToGL:pos ];

        // [ rippleImage addRipple:pos type:RIPPLE_TYPE_RUBBER strength:1.0f ];    
        [ rippleImage addRipple:pos type:RIPPLE_TYPE_WATER strength:2.0f ];  


    }
}

-( void )update:( ccTime )dt {

    runtime += dt;

    [ rippleImage update:dt ];
}

// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
    // in case you have something to dealloc, do it in this method
    // in this particular example nothing needs to be released.
    // cocos2d will automatically release all the children (Label)

    // don't forget to call "super dealloc"
    [super dealloc];
}
@end

Also you can download the source code from the Git