| OLD | NEW |
| (Empty) |
| 1 part of sprites; | |
| 2 | |
| 3 /// A Sprite is a [Node] that renders a bitmap image to the screen. | |
| 4 class Sprite extends NodeWithSize { | |
| 5 | |
| 6 /// The texture that the sprite will render to screen. | |
| 7 /// | |
| 8 /// If the texture is null, the sprite will be rendered as a red square | |
| 9 /// marking the bounds of the sprite. | |
| 10 /// | |
| 11 /// mySprite.texture = myTexture; | |
| 12 Texture texture; | |
| 13 | |
| 14 /// If true, constrains the proportions of the image by scaling it down, if it
s proportions doesn't match the [size]. | |
| 15 /// | |
| 16 /// mySprite.constrainProportions = true; | |
| 17 bool constrainProportions = false; | |
| 18 double _opacity = 1.0; | |
| 19 | |
| 20 /// The color to draw on top of the sprite, null if no color overlay is used. | |
| 21 /// | |
| 22 /// // Color the sprite red | |
| 23 /// mySprite.colorOverlay = new Color(0x77ff0000); | |
| 24 Color colorOverlay; | |
| 25 | |
| 26 /// The transfer mode used when drawing the sprite to screen. | |
| 27 /// | |
| 28 /// // Add the colors of the sprite with the colors of the background | |
| 29 /// mySprite.transferMode = TransferMode.plusMode; | |
| 30 TransferMode transferMode; | |
| 31 | |
| 32 /// Creates a new sprite from the provided [texture]. | |
| 33 /// | |
| 34 /// var mySprite = new Sprite(myTexture) | |
| 35 Sprite([this.texture]) { | |
| 36 if (texture != null) { | |
| 37 size = texture.size; | |
| 38 pivot = texture.pivot; | |
| 39 } else { | |
| 40 pivot = new Point(0.5, 0.5); | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 /// Creates a new sprite from the provided [image]. | |
| 45 /// | |
| 46 /// var mySprite = new Sprite.fromImage(myImage); | |
| 47 Sprite.fromImage(Image image) { | |
| 48 assert(image != null); | |
| 49 | |
| 50 texture = new Texture(image); | |
| 51 size = texture.size; | |
| 52 | |
| 53 pivot = new Point(0.5, 0.5); | |
| 54 } | |
| 55 | |
| 56 /// The opacity of the sprite in the range 0.0 to 1.0. | |
| 57 /// | |
| 58 /// mySprite.opacity = 0.5; | |
| 59 double get opacity => _opacity; | |
| 60 | |
| 61 void set opacity(double opacity) { | |
| 62 assert(opacity != null); | |
| 63 assert(opacity >= 0.0 && opacity <= 1.0); | |
| 64 _opacity = opacity; | |
| 65 } | |
| 66 | |
| 67 void paint(RenderCanvas canvas) { | |
| 68 canvas.save(); | |
| 69 | |
| 70 // Account for pivot point | |
| 71 applyTransformForPivot(canvas); | |
| 72 | |
| 73 if (texture != null) { | |
| 74 double w = texture.size.width; | |
| 75 double h = texture.size.height; | |
| 76 | |
| 77 if (w <= 0 || h <= 0) return; | |
| 78 | |
| 79 double scaleX = size.width / w; | |
| 80 double scaleY = size.height / h; | |
| 81 | |
| 82 if (constrainProportions) { | |
| 83 // Constrain proportions, using the smallest scale and by centering the
image | |
| 84 if (scaleX < scaleY) { | |
| 85 canvas.translate(0.0, (size.height - scaleX * h) / 2.0); | |
| 86 scaleY = scaleX; | |
| 87 } else { | |
| 88 canvas.translate((size.width - scaleY * w) / 2.0, 0.0); | |
| 89 scaleX = scaleY; | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 canvas.scale(scaleX, scaleY); | |
| 94 | |
| 95 // Setup paint object for opacity and transfer mode | |
| 96 Paint paint = new Paint(); | |
| 97 paint.color = new Color.fromARGB((255.0*_opacity).toInt(), 255, 255, 255); | |
| 98 if (colorOverlay != null) { | |
| 99 paint.setColorFilter(new ColorFilter.mode(colorOverlay, TransferMode.src
ATop)); | |
| 100 } | |
| 101 if (transferMode != null) { | |
| 102 paint.setTransferMode(transferMode); | |
| 103 } | |
| 104 | |
| 105 // Do actual drawing of the sprite | |
| 106 if (texture.rotated) { | |
| 107 // Calculate the rotated frame and spriteSourceSize | |
| 108 Size originalFrameSize = texture.frame.size; | |
| 109 Rect rotatedFrame = new Rect.fromPointAndSize(texture.frame.upperLeft, n
ew Size(originalFrameSize.height, originalFrameSize.width)); | |
| 110 Point rotatedSpriteSourcePoint = new Point( | |
| 111 -texture.spriteSourceSize.top - (texture.spriteSourceSize.bottom - t
exture.spriteSourceSize.top), | |
| 112 texture.spriteSourceSize.left); | |
| 113 Rect rotatedSpriteSourceSize = new Rect.fromPointAndSize(rotatedSpriteSo
urcePoint, new Size(originalFrameSize.height, originalFrameSize.width)); | |
| 114 | |
| 115 // Draw the rotated sprite | |
| 116 canvas.rotate(-Math.PI/2.0); | |
| 117 canvas.drawImageRect(texture.image, rotatedFrame, rotatedSpriteSourceSiz
e, paint); | |
| 118 } else { | |
| 119 // Draw the sprite | |
| 120 canvas.drawImageRect(texture.image, texture.frame, texture.spriteSourceS
ize, paint); | |
| 121 } | |
| 122 } else { | |
| 123 // Paint a red square for missing texture | |
| 124 canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), | |
| 125 new Paint()..color = const Color.fromARGB(255, 255, 0, 0)); | |
| 126 } | |
| 127 canvas.restore(); | |
| 128 } | |
| 129 } | |
| OLD | NEW |