NSString* imageURL = @"http://theurl.com/image.gif"; NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imageURL]]; UIImage* image = [[UIImage alloc] initWithData:imageData]; [imageView setImage:image]; [imageData release]; [image release]; //or nested version UIImage* myImage = [UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString: @"http://www.mydomain.com/image.png"]]]; [myImageView setImage:myImage]; [myImage release];
Archiv für den Monat: Dezember 2012
Objective-C: UIImage rounded corner examples
// UIImage+RoundedCorner.m // Created by Trevor Harmon on 9/20/09. // Free for personal or commercial use, with or without modification. // No warranty is expressed or implied. #import "UIImage+RoundedCorner.h" #import "UIImage+Alpha.h" // Private helper methods @interface UIImage () - (void)addRoundedRectToPath:(CGRect)rect context:(CGContextRef)context ovalWidth:(CGFloat)ovalWidth ovalHeight:(CGFloat)ovalHeight; @end @implementation UIImage (RoundedCorner) // Creates a copy of this image with rounded corners // If borderSize is non-zero, a transparent border of the given size will also be added // Original author: Björn Sållarp. Used with permission. See: http://blog.sallarp.com/iphone-uiimage-round-corners/ - (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize { // If the image does not have an alpha layer, add one UIImage *image = [self imageWithAlpha]; // Build a context that's the same dimensions as the new size CGContextRef context = CGBitmapContextCreate(NULL, image.size.width, image.size.height, CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage)); // Create a clipping path with rounded corners CGContextBeginPath(context); [self addRoundedRectToPath:CGRectMake(borderSize, borderSize, image.size.width - borderSize * 2, image.size.height - borderSize * 2) context:context ovalWidth:cornerSize ovalHeight:cornerSize]; CGContextClosePath(context); CGContextClip(context); // Draw the image to the context; the clipping path will make anything outside the rounded rect transparent CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); // Create a CGImage from the context CGImageRef clippedImage = CGBitmapContextCreateImage(context); CGContextRelease(context); // Create a UIImage from the CGImage UIImage *roundedImage = [UIImage imageWithCGImage:clippedImage]; CGImageRelease(clippedImage); return roundedImage; } #pragma mark - #pragma mark Private helper methods // Adds a rectangular path to the given context and rounds its corners by the given extents // Original author: Björn Sållarp. Used with permission. See: http://blog.sallarp.com/iphone-uiimage-round-corners/ - (void)addRoundedRectToPath:(CGRect)rect context:(CGContextRef)context ovalWidth:(CGFloat)ovalWidth ovalHeight:(CGFloat)ovalHeight { if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } CGContextSaveGState(context); CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect)); CGContextScaleCTM(context, ovalWidth, ovalHeight); CGFloat fw = CGRectGetWidth(rect) / ovalWidth; CGFloat fh = CGRectGetHeight(rect) / ovalHeight; CGContextMoveToPoint(context, fw, fh/2); CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); CGContextClosePath(context); CGContextRestoreGState(context); } @end
void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight); { float fw, fh; if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } CGContextSaveGState(context); CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); CGContextScaleCTM (context, ovalWidth, ovalHeight); fw = CGRectGetWidth (rect) / ovalWidth; fh = CGRectGetHeight (rect) / ovalHeight; CGContextMoveToPoint(context, fw, fh/2); CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); CGContextClosePath(context); CGContextRestoreGState(context); } - (UIImage *)roundCornersOfImage:(UIImage *)source; { int w = source.size.width; int h = source.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); CGContextBeginPath(context); CGRect rect = CGRectMake(0, 0, w, h); addRoundedRectToPath(context, rect, 5, 5); CGContextClosePath(context); CGContextClip(context); CGContextDrawImage(context, CGRectMake(0, 0, w, h), source.CGImage); CGImageRef imageMasked = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); return [UIImage imageWithCGImage:imageMasked]; }
Objective-C: crop image
// Create the image from a png file UIImage *image = [UIImage imageNamed:@"prgBinary.jpg"]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; // Get size of current image CGSize size = [image size]; // Frame location in view to show original image [imageView setFrame:CGRectMake(0, 0, size.width, size.height)]; [[self view] addSubview:imageView]; [imageView release]; // Create rectangle that represents a cropped image // from the middle of the existing image CGRect rect = CGRectMake(size.width / 4, size.height / 4, (size.width / 2), (size.height / 2)); // Create bitmap image from original image data, // using rectangle to specify desired crop area CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect); UIImage *img = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // Create and show the new image from bitmap data imageView = [[UIImageView alloc] initWithImage:img]; [imageView setFrame:CGRectMake(0, 200, (size.width / 2), (size.height / 2))]; [[self view] addSubview:imageView]; [imageView release];
Objective-C: resize and mask an image
- (UIImage*) maskImage:(UIImage *)image { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); UIImage *maskImage = [UIImage imageNamed:@"mask.png"]; CGImageRef maskImageRef = [maskImage CGImage]; // create a bitmap graphics context the size of the image CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); if (mainViewContentContext==NULL) return NULL; CGFloat ratio = 0; ratio = maskImage.size.width/ image.size.width; if(ratio * image.size.height < maskImage.size.height) { ratio = maskImage.size.height/ image.size.height; } CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; CGRect rect2 = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}}; CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); CGContextDrawImage(mainViewContentContext, rect2, image.CGImage); // Create CGImageRef of the main view bitmap content, and then // release that bitmap context CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); CGContextRelease(mainViewContentContext); UIImage *theImage = [UIImage imageWithCGImage:newImage]; CGImageRelease(newImage); // return the image return theImage; }
Objective-C: NSFileManager – Ordnerinhalt ausgeben
//show directory CFShow([[NSFileManager defaultManager] contentsOfDirectoryAtPath:[NSHomeDirectory() stringByAppendingString:@"/Documents"] error: NULL ]);
Monkey: asteroids game example
Strict Import mojo Global game:MyGame Function Main:Int() game = New MyGame Return 0 End Function Const PDM_smlparticle%=0 Const PDM_medparticle%=1 Const PDM_bigparticle%=2 Const PDM_spark%=3 Global ASTEROIDS_NUM% = 6 Global ASTEROIDS_SIZE% = 4 ' Store the device width and height Global SCREEN_WIDTH% Global SCREEN_HEIGHT% ' Half of SCREEN_WIDTH and HEIGHT Global SCREEN_WIDTH2% Global SCREEN_HEIGHT2% ' Used for delta timing movement Global dt:DeltaTimer ' Screen states Const STATE_TITLE% = 1 Const STATE_GAME% = 2 Const STATE_GAME_OVER% = 3 Class MyGame Extends App Field player:Player Field cg%, cr%, cb% Field level% = 1 Field score% = 0 Field bestScore% = 0 Field FPS% = 60 ' Current game state Global gameState:Int = STATE_TITLE Method OnCreate:Int() ' Store the device width and height SCREEN_WIDTH = DeviceWidth() SCREEN_HEIGHT = DeviceHeight() SCREEN_WIDTH2 = SCREEN_WIDTH / 2 SCREEN_HEIGHT2 = SCREEN_HEIGHT / 2 ' Set the Random seed Seed = Millisecs() ' Create the delta timer dt = New DeltaTimer(FPS) SetUpdateRate FPS reset() Return 0 End Method Method OnLoading:Int() Cls 0,0,0 DrawText("Loading", SCREEN_WIDTH2, SCREEN_HEIGHT2, 0.5, 0) Return 0 End Method Method OnUpdate:Int() FPSCounter.update() dt.UpdateDelta() Select gameState Case STATE_TITLE Asteroid.updateAll() If KeyHit(KEY_SPACE) setState(STATE_GAME) Endif Case STATE_GAME player.Update() Bullet.updateAll() Asteroid.updateAll() Particle.updateAll() checkCollisions() clscolor() Case STATE_GAME_OVER Asteroid.updateAll() Particle.updateAll() If KeyHit(KEY_SPACE) setState(STATE_TITLE) reset() Endif End Select Return 0 End Method Method OnRender:Int() Select gameState Case STATE_TITLE Cls 0, 0, 0 Asteroid.drawAll() DrawText ("ASTEROIDS - MONKEY STYLE!", SCREEN_WIDTH2, SCREEN_HEIGHT2, 0.5, 0.5) DrawText ("BEST SCORE: "+Self.bestScore, SCREEN_WIDTH2, SCREEN_HEIGHT2 + 30, 0.5, 0.5) DrawText ("PRESS <space> TO PLAY", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 60, 0.5, 0.5) Case STATE_GAME Cls cr, cg, cb player.draw() Bullet.drawAll() Asteroid.drawAll() Particle.drawAll() drawHUD() Case STATE_GAME_OVER Cls 0, 0, 0 Asteroid.drawAll() Particle.drawAll() DrawText ("GAME OVER!", SCREEN_WIDTH2, SCREEN_HEIGHT2, 0.5, 0.5) DrawText ("SCORE: "+score, SCREEN_WIDTH2, SCREEN_HEIGHT2 + 30, 0.5, 0.5) DrawText ("BEST SCORE: "+Self.bestScore, SCREEN_WIDTH2, SCREEN_HEIGHT2 + 60, 0.5, 0.5) DrawText ("PRESS <space> TO RETURN TO THE TITLE SCREEN", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 90, 0.5, 0.5) End Select Return 0 End Method Method setState:Void(state:Int) gameState = state End Method clscolor:Void() If cr > 0 cr-=2*dt.delta Else cr = 0 Endif End Method Method reset:Void() Bullet.list.Clear() Asteroid.list.Clear() Particle.list.Clear() cg = 0 cr = 0 cb = 0 level = 1 ASTEROIDS_NUM = 6 ASTEROIDS_SIZE = 4 score = 0 player = New Player(SCREEN_WIDTH2, SCREEN_HEIGHT2) fillAsteroids(ASTEROIDS_NUM, ASTEROIDS_SIZE) End Method Method checkCollisions:Void() For Local a:Asteroid = Eachin Asteroid.list If dist(player.x, player.y, a.x, a.y) <= a.avgrad If cr = 0 Then cr = Rnd(100, 155) player.shield-=2 Endif For Local b:Bullet = Eachin Bullet.list If a <> Null Then If dist(b.x, b.y, a.x, a.y) <= a.avgrad a.life = a.life - 1 b.life = 0 For Local t%=1 To 4 New Particle(a.x, a.y, Rnd(-8,8), Rnd(-8,8), 0.95, 30, PDM_spark, 255, 192, 64, 16) Next For Local t%=1 To 4 New Particle(a.x, a.y, Rnd(-4,4), Rnd(-4,4), 0.95, 60, PDM_smlparticle, 160, 160, 160, 0) Next Endif If a.life <= 0 For Local t%=1 To 8 New Particle(a.x,a.y,Rnd(-10,10),Rnd(-10,10),0.95,30,PDM_spark,255,192,64,64) Next For Local t%=1 To 6 New Particle(a.x,a.y,Rnd(-6,6),Rnd(-6,6),0.95,30,PDM_medparticle,255,192,64,128) Next For Local t%=1 To 6 New Particle(a.x,a.y,Rnd(-8,8),Rnd(-8,8),0.99,60,PDM_smlparticle,160,160,160,0) Next For Local t%=1 To 5 New Particle(a.x,a.y,Rnd(-6,6),Rnd(-6,6),0.99,60,PDM_medparticle,160,160,160,0) Next For Local t%=1 To 4 New Particle(a.x,a.y,Rnd(-4,4),Rnd(-4,4),0.99,60,PDM_bigparticle,160,160,160,0) Next If a.size > 1 For Local t% = 1 To 2 New Asteroid(a.x, a.y, Rnd(-5,5), Rnd(-5,5), a.size-1) Next Endif Asteroid.list.Remove(a) a = Null score+=5 Endif Endif Next Next If Asteroid.list.Count() = 0 level+=1 ASTEROIDS_SIZE+=1 ASTEROIDS_NUM+=1 fillAsteroids(ASTEROIDS_NUM, ASTEROIDS_SIZE) Endif End Method Method drawHUD:Void() DrawText ("LEVEL: "+level, 0, 0) DrawText("SCORE: "+score, SCREEN_WIDTH, 0, 1, 0) FPSCounter.draw(SCREEN_WIDTH,SCREEN_HEIGHT, 1, 1) End Method Method fillAsteroids:Void(num%, size%) Local tx# Local ty# For Local t% = 1 To num Repeat tx=Rnd(640) ty=Rnd(480) Until ( tx<280 or="" tx="">360 ) And ( ty<200 or="" ty="">280 ) New Asteroid(tx, ty, Rnd(-3,3), Rnd(-3,3), size+Rnd(1)) Next End Method End Class Class Sprite Field xv# ,yv# Field x#, y# Field rotation# End Class Class Player Extends Sprite Field angVel# Field velmul# Field vel# Field acc# Field drag# 'Field xv#,yv# Field xa#,ya# Field firedel# Field ship_angvel# Field ship_acc# Field ship_velmul# Field ship_firedel# Field shield#=100 Method New(x#, y#) Self.x = x Self.y = y ship_angvel = 6 ship_acc = 0.16 ship_velmul = -0.0005 ship_firedel = 4 shield = 100 End Method Method Update:Void() If KeyDown(KEY_UP) acc = ship_acc drag = vel * ship_velmul Else If KeyDown(KEY_DOWN) drag = vel * ship_velmul * 50 Else acc = 0 drag = 0 End If If KeyDown(KEY_LEFT) rotation+=ship_angvel * dt.delta End If If KeyDown(KEY_RIGHT) rotation-=ship_angvel * dt.delta End If If KeyDown(KEY_SPACE) And Self.firedel<=0 Local tang#=Rnd(-4,4) New Bullet(x - (Sin(rotation)*8), y-(Cos(rotation)*8), xv - (Sin(rotation + tang ) *12), yv-(Cos(rotation + tang ) *12), 45, 255-Rnd(4), 192+Rnd(-4,4), 64+Rnd(4,4)) firedel = ship_firedel Endif firedel-=dt.delta xa = (drag * xv) - (Sin(rotation) * acc) ya = (drag * yv) - (Cos(rotation) * acc) xv = xv + xa *dt.delta yv = yv + ya * dt.delta x = x + xv * dt.delta y = y + yv * dt.delta vel = dist(0, 0, xv, yv) ' If x < 0 x = SCREEN_WIDTH If x > SCREEN_WIDTH x = 0 If y < 0 y = SCREEN_HEIGHT If y > SCREEN_HEIGHT y = 0 If shield <= 0 For Local t%=1 To 18 New Particle( x, y,Rnd(-10,10),Rnd(-10,10),0.95,130,PDM_spark,255,192,64,64) Next For Local t%=1 To 16 New Particle( x, y,Rnd(-6,6),Rnd(-6,6),0.95,130,PDM_medparticle,255,192,64,128) Next For Local t%=1 To 16 New Particle( x, y,Rnd(-8,8),Rnd(-8,8),0.99,160,PDM_smlparticle,160,160,160,0) Next For Local t%=1 To 15 New Particle( x, y,Rnd(-6,6),Rnd(-6,6),0.99,160,PDM_medparticle,160,160,160,0) Next For Local t%=1 To 14 New Particle( x, y,Rnd(-4,4),Rnd(-4,4),0.99,160,PDM_bigparticle,160,160,160,0) Next If game.score>game.bestScore game.bestScore = game.score Endif game.setState(STATE_GAME_OVER) Endif End Method Method draw:Void() Local x1# = x-(Sin(rotation) * 10) Local y1# = y-(Cos(rotation) * 10) Local x2# = x-(Sin(rotation + 140 ) * 8) Local y2# = y-(Cos(rotation + 140 ) * 8) Local x3# = x-(Sin(rotation - 140 ) * 8) Local y3# = y-(Cos(rotation - 140 ) * 8) SetColor 255, 255, 255 DrawLine x1, y1, x2, y2 DrawLine x2, y2, x3, y3 DrawLine x3, y3, x1, y1 SetAlpha 0.5 If shield < 50 Then SetColor 255,0,0 DrawRect 10,SCREEN_HEIGHT - 15, Self.shield, 10 SetAlpha 1 SetColor 255,0,0 End Method End Class Class Bullet Extends Sprite Global list:List<bullet> = New List<bullet> Field life# Field cr%, cg%, cb% Method New(x#,y#,xv#,yv#,life#,cr%,cg%,cb%) Self.x = x Self.y = y Self.xv = xv Self.yv = yv Self.life = life Self.cr = cr Self.cg = cg Self.cb = cb list.AddLast Self End Method Function updateAll:Void() If Not list Return For Local b:Bullet = Eachin list b.update() If b.life < 0 Bullet.list.Remove(b) b = Null Endif Next End Function Method update:Void() x = x + xv * dt.delta y = y + yv * dt.delta life-=dt.delta If x < 0 x = SCREEN_WIDTH If x > SCREEN_WIDTH x = 0 If y < 0 y = SCREEN_HEIGHT If y > SCREEN_HEIGHT y = 0 End Method Function drawAll:Void() If Not list Return For Local b:Bullet = Eachin list b.draw() Next End Function Method draw:Void() Local tmul# If life <= 15.0 tmul = life / 15.0 Else tmul = 1.0 Endif SetColor cr*tmul, cg*tmul, cb*tmul DrawLine x, y, x + xv, y + yv End Method End Class Class Asteroid Extends Sprite Global list:List<asteroid> = New List<asteroid> Field ang#,angvel# Field rad#[9] Field avgrad# Field size% Field life% Field cr%, cg%, cb% Method New(x#,y#,xv#,yv#,size%) Self.x =x Self.y =y Self.xv =xv Self.yv =yv Self.ang =Rnd(360) Self.angvel =Rnd(-6,6) Self.size=size Self.life=size Local tcol% = Rnd(-48,48) Self.cr=128+tcol Self.cg=128+tcol Self.cb=128+tcol ' Create "Rockiness" Self.avgrad =0 For Local t% = 0 To 7 Self.rad [t]=size*8.0+Rnd(-size*4.0,size*4.0) Self.avgrad =Self.avgrad +Self.rad[t] Next Self.avgrad =Self.avgrad /6.0 Self.rad[8] = Self.rad[0] list.AddLast Self End Method Function drawAll:Void() If Not list Return For Local b:Asteroid = Eachin list b.draw() Next End Function Function updateAll:Void() If Not list Return For Local b:Asteroid = Eachin list b.update() Next End Function Method update:Void() Self.x =Self.x +Self.xv * dt.delta Self.y =Self.y +Self.yv * dt.delta Self.rotation =Self.rotation +Self.angvel * dt.delta If Self.x <-Self.avgrad Then Self.x =Self.x + SCREEN_WIDTH + Self.avgrad *2 If Self.x >SCREEN_WIDTH+Self.avgrad Then Self.x =Self.x - SCREEN_WIDTH - Self.avgrad *2 If Self.y <-Self.avgrad Then Self.y =Self.y + SCREEN_HEIGHT + Self.avgrad *2 If Self.y >SCREEN_HEIGHT+Self.avgrad Then Self.y =Self.y - SCREEN_HEIGHT - Self.avgrad *2 End Method Method draw:Void() Local tmul# = 360.0 / 8.0 SetColor cr, cg, cb For Local t% = 0 To 7 DrawLine x-(Sin(rotation+(t)*tmul)*rad[t]),y-(Cos(rotation+(t)*tmul)*rad[t]),x-(Sin(rotation+(t+1)*tmul)*rad[t+1]),y-(Cos(rotation+(t+1)*tmul)*rad[t+1]) Next End Method End Class Class Particle Extends Sprite Global list:List<particle> = New List<particle> Field vm# Field life#,mlife# Field drawmode% Field cr%,cg%,cb% Field cflash% Method New(x#,y#,xv#,yv#,vm#,life#,drawmode%,cr%,cg%,cb%,cflash%) Self.x=x Self.y=y Self.xv=xv Self.yv=yv Self.vm=vm Self.life=life Self.mlife=life Self.drawmode=drawmode Self.cr=cr Self.cg=cg Self.cb=cb Self.cflash=cflash list.AddLast Self End Method Function updateAll:Void() If Not list Return For Local b:Particle = Eachin list b.update() Next End Function Function drawAll:Void() If Not list Return For Local b:Particle = Eachin list b.draw() Next End Function Method update:Void() Self.x =Self.x +Self.xv *dt.delta Self.y =Self.y +Self.yv *dt.delta Self.xv =Self.xv *(1.0-(1.0-Self.vm )*dt.delta ) Self.yv =Self.yv *(1.0-(1.0-Self.vm )*dt.delta ) Self.life =Self.life -dt.delta If Self.life <0 then="" selflife="0" if="" listremoveself="" endif="" end="" method="" draw:void="" local="" tmul="Self.life" selfmlife="" tfls="Rnd(-Self.cflash,Self.cflash)" setcolor="" limit="" selfcrtmul="" tfls0255limit="" selfcgtmul="" selfcb="" tmultfls0255="" select="" selfdrawmode="" case="" pdm_smlparticle="" drawrect="" selfx="" selfy="" 1="" pdm_medparticle="" drawoval="" -1selfy="" -133="" pdm_bigparticle="" -2selfy="" -255="" pdm_spark="" drawline="" selfxv="" selfyv="" class="" fpscounter="" abstract="" global="" fpscount:int="" starttime:int="" totalfps:int="" function="" update:void="" millisecs="" -="" starttime="">= 1000 totalFPS = fpsCount fpsCount = 0 startTime = Millisecs() Else fpsCount+=1 Endif End Function Function draw:Void(x% = 0, y% = 0, ax# = 0, ay# = 0) DrawText("FPS: " + totalFPS, x, y, ax, ay) End Function End Class ' From James Boyd Class DeltaTimer Field targetfps:Float = 60 Field currentticks:Float Field lastticks:Float Field frametime:Float Field delta:Float Method New (fps:Float) targetfps = fps lastticks = Millisecs() End Method UpdateDelta:Void() currentticks = Millisecs() frametime = currentticks - lastticks delta = frametime / (1000.0 / targetfps) lastticks = currentticks End End Function dist#(x1#,y1#,x2#,y2#) Return Sqrt(Pow((x1-x2),2) + Pow((y1-y2),2)) End Function Function limit#(value#,low#,high#) If value < low Then Return low If value > high Then Return high Return value End Function </particle></particle></asteroid></asteroid></bullet></bullet></space></space>
Monkey: virtual stick
Strict Import mojo Class VirtualStickTestApp Extends App Const PLAYFIELD_WIDTH:Float = 200 Const PLAYFIELD_HEIGHT:Float = 200 Const PLAYER_SPEED:Float = 5 ' our virtual stick Field mystick:MyStick ' the "player"'s location Field playerX:Float = PLAYFIELD_WIDTH/2 Field playerY:Float = PLAYFIELD_HEIGHT/2 Field playfieldX:Float Field playfieldY:Float = 10 Method OnCreate:Int() mystick = New MyStick mystick.SetRing(100, DeviceHeight()-100, 40) mystick.SetStick(0, 0, 15) mystick.SetDeadZone(0.2) mystick.SetTriggerDistance(5) playfieldX = DeviceWidth()-PLAYFIELD_WIDTH-10 SetUpdateRate 30 Return 0 End Method OnUpdate:Int() ' update the stick usage UpdateStick() ' update the player position If mystick.GetVelocity() <> 0 Then playerX += mystick.GetDX() * PLAYER_SPEED playerY -= mystick.GetDY() * PLAYER_SPEED If playerX < 0 Then playerX = 0 Elseif playerX > PLAYFIELD_WIDTH Then playerX = PLAYFIELD_WIDTH End If playerY < 0 Then playerY = 0 Elseif playerY > PLAYFIELD_HEIGHT Then playerY = PLAYFIELD_HEIGHT End End Return 0 End Method OnRender:Int() Cls(0,0,0) mystick.DoRenderRing() mystick.DoRenderStick() DrawOutlineRect(playfieldX, playfieldY, PLAYFIELD_WIDTH, PLAYFIELD_HEIGHT) DrawCircle(playfieldX + playerX, playfieldY + playerY, 5) ' some test info DrawText("angle="+mystick.GetAngle(), 10, 10) DrawText("vel="+mystick.GetVelocity(), 10, 30) DrawText("dx="+mystick.GetDX(), 10, 50) DrawText("dy="+mystick.GetDY(), 10, 70) Return 0 End Method UpdateStick:Void() If mystick.GetTouchNumber() < 0 Then #if TARGET="android" Then For Local i:Int = 0 To 31 If TouchHit(i) And mystick.GetTouchNumber() < 0 Then mystick.StartTouch(TouchX(i), TouchY(i), i) End End #else If MouseHit(0) Then mystick.StartTouch(MouseX(), MouseY(), 0) End #endif End If mystick.GetTouchNumber() >= 0 Then #if TARGET="android" Then If TouchDown(mystick.GetTouchNumber()) Then mystick.UpdateTouch(TouchX(mystick.GetTouchNumber()), TouchY(mystick.GetTouchNumber())) Else mystick.StopTouch() End #else If MouseDown(0) Then mystick.UpdateTouch(MouseX(), MouseY()) Else mystick.StopTouch() End #endif End End End Class MyStick Extends VirtualStick Method RenderRing:Void(x:Float, y:Float) SetColor 0, 0, 255 Super.RenderRing(x, y) SetColor 255, 255, 255 End Method RenderStick:Void(x:Float, y:Float) SetColor 0, 255, 0 Super.RenderStick(x, y) SetColor 255, 255, 255 End End Class VirtualStick Private ' the coordinates and dimensions for the virtual stick's ring (where the user will first touch) Field ringX:Float Field ringY:Float Field ringRadius:Float ' the coordinates and dimensions for the stick (what the user is pushing around) ' X/Y is relative to the centre of the ring, and positive Y points up Field stickX:Float = 0 Field stickY:Float = 0 Field stickRadius:Float Field stickAngle:Float Field stickPower:Float ' where the user first touched Field firstTouchX:Float Field firstTouchY:Float ' power must always be >= this, or we return 0 Field deadZone:Float ' we need to move the stick this much before it triggers Field triggerDistance:Float = -1 Field triggered:Bool = False ' the index of the touch event that initiated the stick movement Field touchNumber:Int = -1 ' clips the stick to be within the ring, and updates angles, etc. Method UpdateStick:Void() If touchNumber>=0 Then Local length:Float = Sqrt(stickX*stickX+stickY*stickY) stickPower = length/ringRadius If stickPower > 1 Then stickPower = 1 If stickPower < deadZone Then stickPower = 0 stickAngle = 0 stickX = 0 stickY = 0 Else If stickX = 0 And stickY = 0 Then stickAngle = 0 stickPower = 0 Elseif stickX = 0 And stickY > 0 Then stickAngle = 90 Elseif stickX = 0 And stickY < 0 Then stickAngle = 270 Elseif stickY = 0 And stickX > 0 Then stickAngle = 0 Elseif stickY = 0 And stickX < 0 Then stickAngle = 180 Elseif stickX > 0 And stickY > 0 Then stickAngle = ATan(stickY/stickX) Elseif stickX < 0 Then stickAngle = 180+ATan(stickY/stickX) Else stickAngle = 360+ATan(stickY/stickX) End If length > ringRadius Then stickPower = 1 stickX = Cos(stickAngle) * ringRadius stickY = Sin(stickAngle) * ringRadius End End End End Public Method GetTouchNumber:Int() Return touchNumber End ' the angle in degrees that the user is pushing, going counter-clockwise from right Method GetAngle:Float() Return stickAngle End ' the strength of the movement (0 means dead centre, 1 means at the edge of the ring (or past it) Method GetVelocity:Float() Return stickPower End ' based on the angle and velocity, get the DX Method GetDX:Float() Return Cos(stickAngle) * stickPower End ' based on the angle and velocity, get the DY Method GetDY:Float() Return Sin(stickAngle) * stickPower End ' we just touched the screen at point (x,y), so start "controlling" if we touched inside the ring Method StartTouch:Void(x:Float, y:Float, touchnum:Int) If touchNumber < 0 Then If (x-ringX)*(x-ringX) + (y-ringY)*(y-ringY) <= ringRadius*ringRadius Then touchNumber = touchnum firstTouchX = x firstTouchY = y triggered = False If triggerDistance <= 0 Then triggered = True stickX = x-ringX stickY = ringY-y End UpdateStick() End End End ' a touch just moved, so we may need to update the stick Method UpdateTouch:Void(x:Float, y:Float) If touchNumber>=0 Then If Not triggered Then If (x-firstTouchX)*(x-firstTouchX)+(y-firstTouchY)*(y-firstTouchY) > triggerDistance*triggerDistance Then triggered = True End End If triggered Then stickX = x - ringX stickY = ringY - y UpdateStick() End End End ' we just released a touch, which may have been this one Method StopTouch:Void() If touchNumber>=0 Then touchNumber = -1 stickX = 0 stickY = 0 stickAngle = 0 stickPower = 0 triggered = False End End Method DoRenderRing:Void() RenderRing(ringX, ringY) End Method DoRenderStick:Void() RenderStick(ringX+stickX, ringY-stickY) End ' draws the stick (may be overridden to do images, etc.) Method RenderStick:Void(x:Float, y:Float) DrawCircle(x, y, stickRadius) End ' draws the outside ring (may be overridden to do images, etc.) Method RenderRing:Void(x:Float, y:Float) DrawCircle(x, y, ringRadius) End ' set the location and radius of the ring Method SetRing:Void(ringX:Float, ringY:Float, ringRadius:Float) Self.ringX = ringX Self.ringY = ringY Self.ringRadius = ringRadius End ' set the location and radius of the stick Method SetStick:Void(stickX:Float, stickY:Float, stickRadius:Float) Self.stickX = stickX Self.stickY = stickY Self.stickRadius = stickRadius End Method SetDeadZone:Void(deadZone:Float) Self.deadZone = deadZone End Method SetTriggerDistance:Void(triggerDistance:Float) Self.triggerDistance = triggerDistance End End Function Main:Int() New VirtualStickTestApp Return 0 End Function DrawOutlineRect:Void(x:Float, y:Float, width:Float, height:Float) DrawLine(x, y, x+width, y) DrawLine(x, y, x, y+height) DrawLine(x+width, y, x+width, y+height) DrawLine(x, y+height, x+width, y+height) End
Monkey: multitouch demo
Strict Import mojo Function Main:Int() New MyApp Return 0 End Class MyApp Extends App Method OnCreate:Int() SetUpdateRate(120) Return 0 End Method OnUpdate:Int() Return 0 End Method OnRender:Int() Cls(0,0,0) Local dy:Int = 30 For Local i:Int = 0 To 31 If TouchDown(i) Then If i Mod 2 = 0 Then SetColor(255,0,0) Else SetColor(0,0,255) End DrawCircle(TouchX(i),TouchY(i),50) SetColor(255,255,255) DrawText(""+i, 10, dy) DrawText(""+Int(TouchX(i)), 40, dy) DrawText(""+Int(TouchY(i)), 80, dy) dy+=20 End End DrawText("idx",10,10) DrawText("x",40,10) DrawText("y",80,10) Return 0 End End
Monkey: fantomEngine – using text object as a button
Strict #rem Script: touchTest.monkey Description: Sample Script fantomEngine to display the use of touch events Author: Michael #end Import fantomEngine Global g:game '*************************************** Class game Extends App Field eng:engine Field font1:ftFont '------------------------------------------ Method CreateObjects:Int() 'Create a box Local b:ftObject = eng.CreateBox(100,50,eng.canvasWidth/2,eng.canvasHeight/2-150) 'Set TouchMode to bounding box(2) ... 1=Circle b.SetTouchMode(2) b.SetName("Box") 'Create a circle Local c:ftObject = eng.CreateCircle(50,eng.canvasWidth/2,eng.canvasHeight/2) c.SetTouchMode(1) c.SetName("Circle") 'Create a text Local t:ftObject = eng.CreateText(font1,"This is a clickable text", eng.canvasWidth/2,eng.canvasHeight/2+150,1) t.SetTouchMode(2) t.SetName("Text") Return 0 End '------------------------------------------ Method OnCreate:Int() SetUpdateRate(60) 'Store the engine instance eng = New engine 'Load the font bitmap font1 = eng.LoadFont("bo_font") '<========== please change this to a font that you have 'Create the objects CreateObjects() Return 0 End '------------------------------------------ Method OnUpdate:Int() Local d:Float = Float(eng.CalcDeltaTime())/60.0 eng.Update(Float(d)) 'check if you have a touch hit and then do a touch check. If TouchHit(0) Then eng.TouchCheck() Return 0 End '------------------------------------------ Method OnRender:Int() Cls eng.Render() Return 0 End End '*************************************** Class engine Extends ftEngine '------------------------------------------ Method OnObjectTouch:Int(obj:ftObject, touchId:Int) Print ("Object "+obj.GetName()+" was hit!") Return 0 End End '*************************************** Function Main:Int() g = New game Return 0 End
Monkey: a base script for the fantomEngine
Strict #rem Script: baseScript.monkey Description: Base Script fantomEngine Author: Michael Hartlef Version: 1.0 #end Import fantomEngine Global g:game '*************************************** Class game Extends App Field eng:engine Field isSuspended:Bool = False '------------------------------------------ Method OnCreate:Int() SetUpdateRate(60) eng = New engine Return 0 End '------------------------------------------ Method OnUpdate:Int() Local d:Float = Float(eng.CalcDeltaTime())/60.0 If isSuspended = False Then eng.Update(Float(d)) Endif Return 0 End '------------------------------------------ Method OnRender:Int() Cls eng.Render() Return 0 End '------------------------------------------ Method OnResume:Int() isSuspended = False SetUpdateRate(60) Return 0 End '------------------------------------------ Method OnSuspend:Int() isSuspended = True SetUpdateRate(5) Return 0 End End '*************************************** Class engine Extends ftEngine '------------------------------------------ Method OnObjectCollision:Int(obj:ftObject, obj2:ftObject) Return 0 End '------------------------------------------ Method OnObjectTimer:Int(timerId:Int, obj:ftObject) Return 0 End '------------------------------------------ Method OnObjectTouch:Int(obj:ftObject, touchId:Int) Return 0 End '------------------------------------------ Method OnObjectTransition:Int(transId:Int, obj:ftObject) Return 0 End '------------------------------------------ Method OnObjectUpdate:Int(obj:ftObject) Return 0 End '------------------------------------------ Method OnLayerTransition:Int(transId:Int, layer:ftLayer) Return 0 End '------------------------------------------ Method OnLayerUpdate:Int(layer:ftLayer) Return 0 End End '*************************************** Function Main:Int() g = New game Return 0 End