How to implement water ripples?

后端 未结 3 1657
挽巷
挽巷 2020-12-13 03:00

I\'m working on an iphone game. In that i had to produce water ripples. I dont know how to get that. I heard thatit can be done with openGL. I am very new to this concept. C

相关标签:
3条回答
  • 2020-12-13 03:29

    Here are some resources I found:

    Language Agnostic 2d Water Ripple Algorithm

    (source: virgin.net)
    (source: virgin.net)

    OpenGL Project with Water Ripples (Source)

    (source: sulaco.co.za)

    You also might want to swing by GameDev's FAQ. Scroll down to the "Water Rendering" section.

    0 讨论(0)
  • 2020-12-13 03:35

    jk:

    z=sin(x)+cos(y)
    

    More seriously, doesn't the Quartz Composer basically do ripples for you as one of the effects layers? Or was that announced only for the iPhone 3.0 SDK?

    0 讨论(0)
  • 2020-12-13 03:51

    I found the source code of the water ripple effect so following code to implement into your project and solove your problem also.

    import "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

    0 讨论(0)
提交回复
热议问题