home link download back number special issue

HMDT - Special Issue / How to make a screen saver / ソースコードを書く


+ ソースコードを書く

さて、次はソースコードを書くんだ。たいした量はないよ。Objective-C が分からない人でも、魔法の呪文だと思って書き写してくれ。

ここでは 2 つのファイルを作る。ヘッダファイルである 'SSTest.h' と、実装側の 'SSTest.m' だ。'File' メニューの 'New File...' を選んでファイルを作ってくれ。タイプは 'Empty File' でオッケーだ。

- SSTest.h

まずはヘッダファイル。これは、スクリーンセイバーモジュールクラスの定義を行うんだ。スクリーンセイバーモジュールは ScreenSaverView を継承することになる。

SSTest/SSTest.h (created by mkino)
#import <AppKit/AppKit.h>
#import <ScreenSaver/ScreenSaver.h>

@interface SSTest : ScreenSaverView
{
}

@end

これだけだ。これで、ScreenSaverView を継承した、SSTest っていうクラスを用意したことになる。特にメソッドやフィールドは今回は使わない。

- SSTest.m

次は実装側だ。さっきの ScreenSaverView のクラスを実装することになる。

SSTest/SSTest.m (created by mkino)
#import "SSTest.h"

@implementation SSTest
- (void)animateOneFrame
{
    // Choose a random point
    int width = [self frame].size.width;
    int height = [self frame].size.height;
    NSPoint pt = NSMakePoint(
        SSRandomFloatBetween(-width, width), 
        SSRandomFloatBetween(0.0, height * 2));
    float strSize = SSRandomFloatBetween(12.0, 1024.0);

    // Make a screen color & rect
    NSColor* back = 
        [NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:0.05];
    NSRect rect = NSMakeRect(0, 0, width, height);

    // Make a random color
    float red = SSRandomFloatBetween(0.0, 1.0);
    float blue = SSRandomFloatBetween(0.0, 1.0);
    float green = SSRandomFloatBetween(0.0, 1.0);
    float alpha = SSRandomFloatBetween(0.0, 1.0);
    NSColor* color = 
        [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:alpha];

    // Make a string
    NSMutableAttributedString* str = 
        [[NSMutableAttributedString alloc] 
        initWithString:@"Say Hello to Mac OS X!"];
    [str addAttribute:NSFontAttributeName 
        value:[NSFont fontWithName:@"Times" size:strSize] 
        range:NSMakeRange(0, 22)];
    [str addAttribute:NSForegroundColorAttributeName 
        value:color 
        range:NSMakeRange(0, 22)];

    // Draw string
    [back set];
    [NSBezierPath fillRect:rect];
    [str drawAtPoint:pt];
}
@end

ここでは animateOneFrame っていうメソッドを実装している。このメソッドは、スクリーンセイバーのアニメーションが行われている間、定期的に呼び出されるんだ。この中に、実際に画面に表示させる処理を書けばいい。

この中でやっていることは非常に簡単で、ランダムにポジションを決めて、ランダムに色を決めて、文字を書く、ってことだ。ちなみに乱数を発生させてる SSRandomFloatBetween() は、ScreenSaver.framework で用意している関数だ。スクリーンセイバー作るのに必須の機能が用意されてるんだ。うーん、分かってらっしゃる。


Home | Link | Download | Back Number | Speciall Issue

mailto: mkino@xd5.so-net.ne.jp

HMDT