Как реализовать водную рябь? - PullRequest
9 голосов
/ 20 марта 2009

Я работаю над игрой для iPhone. В этом я должен был произвести водную рябь. Я не знаю, как это получить. Я слышал, что это можно сделать с помощью openGL. Я очень новичок в этой концепции. Кто-нибудь может направить меня?

Ответы [ 3 ]

14 голосов
/ 20 марта 2009

Вот некоторые ресурсы, которые я нашел:

Алгоритм двухсторонней водной пульсации языка
alt text
(источник: virgin.net ) alt text
(источник: virgin.net )

Проект OpenGL с водными пульсациями (Источник)
alt text
(источник: sulaco.co.za )

Возможно, вы захотите воспользоваться FAQ по GameDev . Прокрутите вниз до раздела «Рендеринг воды».

2 голосов
/ 20 марта 2009

JK:

z=sin(x)+cos(y)

А если серьезно, разве Quartz Composer не создает для вас рябь как один из слоев эффектов? Или это было объявлено только для iPhone 3.0 SDK?

0 голосов
/ 23 октября 2012

Я нашел исходный код эффекта водной ряби, поэтому следующий код внедряется в ваш проект и также решает вашу проблему.

импорт "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

Также вы можете скачать исходный код из Git

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...