Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: sky/examples/game/lib/game_demo_world.dart

Issue 1179333002: Playable demo game and bug fixes in sprites (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 part of game;
2
3 // Random generator
4 Math.Random _rand = new Math.Random();
5
6 const double _gameSizeWidth = 1024.0;
7 const double _gameSizeHeight = 1024.0;
8
9 const double _shipRadius = 30.0;
10 const double _lrgAsteroidRadius = 40.0;
11 const double _medAsteroidRadius = 20.0;
12 const double _smlAsteroidRadius = 10.0;
13 const double _maxAsteroidSpeed = 1.0;
14
15 const int _lifeTimeLaser = 50;
16
17 class GameDemoWorld extends NodeWithSize {
18
19 // Images
20 Image _imgBg;
21 Image _imgAsteroid;
22 Image _imgShip;
23 Image _imgLaser;
24
25 // Inputs
26 double _joystickX = 0.0;
27 double _joystickY = 0.0;
28 bool _fire;
29
30 Ship _ship;
31 List<Asteroid> _asteroids = [];
32 List<Laser> _lasers = [];
33
34 GameDemoWorld(ImageMap images) : super.withSize(new Size(_gameSizeWidth, _game SizeHeight)) {
35
36 // Fetch images
37 _imgBg = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian .spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/resources-auto/Burn Texture.png"];
38 _imgAsteroid = images["https://raw.githubusercontent.com/slembcke/GalacticGu ardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resou rces-auto/asteroid_big_002.png"];
39 _imgShip = images["https://raw.githubusercontent.com/slembcke/GalacticGuardi an.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources -auto/GG_blueship_Lv3.png"];
40 _imgLaser = images["https://raw.githubusercontent.com/slembcke/GalacticGuard ian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resource s-auto/laserBlue.png"];
41
42 // Add some asteroids to the game world
43 for (int i = 0; i < 5; i++) {
44 addAsteroid(AsteroidSize.large);
45 }
46 for (int i = 0; i < 5; i++) {
47 addAsteroid(AsteroidSize.medium);
48 }
49
50 // Add ship
51 addShip();
52 }
53
54 // Methods for adding game objects
55
56 void addBackground() {
57 Sprite sprtBg = new Sprite.withImage(_imgBg);
58 sprtBg.size = new Size(_gameSizeWidth, _gameSizeHeight);
59 sprtBg.pivot = Point.origin;
60 this.addChild(sprtBg);
61 }
62
63 void addAsteroid(AsteroidSize size, [Point pos]) {
64 Asteroid asteroid = new Asteroid.withImage(_imgAsteroid, size);
65 asteroid.zPosition = 1.0;
66 if (pos != null) asteroid.position = pos;
67 this.addChild(asteroid);
68 _asteroids.add(asteroid);
69 }
70
71 void addShip() {
72 Ship ship = new Ship.withImage(_imgShip);
73 ship.zPosition = 10.0;
74 this.addChild(ship);
75 _ship = ship;
76 }
77
78 void addLaser() {
79 Laser laser = new Laser.withImage(_imgLaser, _ship);
80 laser.zPosition = 8.0;
81 _lasers.add(laser);
82 this.addChild(laser);
83 }
84
85 void update(double dt) {
86 // Move asteroids
87 for (Asteroid asteroid in _asteroids) {
88 asteroid.position = pointAdd(asteroid.position, asteroid._movementVector);
89 }
90
91 // Move lasers and remove expired lasers
92 for (int i = _lasers.length - 1; i >= 0; i--) {
93 Laser laser = _lasers[i];
94 laser.move();
95 if (laser._frameCount > _lifeTimeLaser) {
96 laser.removeFromParent();
97 _lasers.removeAt(i);
98 }
99 }
100
101 // Apply thrust to ship
102 if (_joystickX != 0.0 || _joystickY != 0.0) {
103 _ship.thrust(_joystickX, _joystickY);
104 }
105
106 // Move ship
107 _ship.move();
108
109 // Check collisions between asteroids and lasers
110 for (int i = _lasers.length -1; i >= 0; i--) {
111 // Iterate over all the lasers
112 Laser laser = _lasers[i];
113
114 for (int j = _asteroids.length - 1; j >= 0; j--) {
115 // Iterate over all the asteroids
116 Asteroid asteroid = _asteroids[j];
117
118 // Check for collision
119 if (pointQuickDist(laser.position, asteroid.position) < laser.radius + a steroid.radius) {
120 // Remove laser
121 laser.removeFromParent();
122 _lasers.removeAt(i);
123
124 // Add asteroids
125 if (asteroid._asteroidSize == AsteroidSize.large) {
126 for (int a = 0; a < 3; a++) addAsteroid(AsteroidSize.medium, asteroi d.position);
127 }
128 else if (asteroid._asteroidSize == AsteroidSize.medium) {
129 for (int a = 0; a < 5; a++) addAsteroid(AsteroidSize.small, asteroid .position);
130 }
131
132 // Remove asteroid
133 asteroid.removeFromParent();
134 _asteroids.removeAt(j);
135 break;
136 }
137 }
138 }
139
140 // Move objects to center camera and warp objects around the edges
141 centerCamera();
142 warpObjects();
143 }
144
145 void centerCamera() {
146 const cameraDampening = 0.1;
147 Point delta = new Point(_gameSizeWidth/2 - _ship.position.x, _gameSizeHeight /2 - _ship.position.y);
148 delta = pointMult(delta, cameraDampening);
149
150 for (Node child in children) {
151 child.position = pointAdd(child.position, delta);
152 }
153 }
154
155 void warpObjects() {
156 for (Node child in children) {
157 if (child.position.x < 0) child.position = pointAdd(child.position, new Po int(_gameSizeWidth, 0.0));
158 if (child.position.x >= _gameSizeWidth) child.position = pointAdd(child.po sition, new Point(-_gameSizeWidth, 0.0));
159 if (child.position.y < 0) child.position = pointAdd(child.position, new Po int(0.0, _gameSizeHeight));
160 if (child.position.y >= _gameSizeHeight) child.position = pointAdd(child.p osition, new Point(0.0, -_gameSizeHeight));
161 }
162 }
163
164 // Handling controls
165
166 void controlSteering(double x, double y) {
167 _joystickX = x;
168 _joystickY = y;
169 }
170
171 void controlFire() {
172 addLaser();
173 }
174 }
175
176 // Game objects
177
178 enum AsteroidSize {
179 small,
180 medium,
181 large,
182 }
183
184 class Asteroid extends Sprite {
185 Point _movementVector;
186 AsteroidSize _asteroidSize;
187 double _radius;
188
189 double get radius {
190 if (_radius != null) return _radius;
191 if (_asteroidSize == AsteroidSize.small) _radius = _smlAsteroidRadius;
192 else if (_asteroidSize == AsteroidSize.medium) _radius = _medAsteroidRadius;
193 else if (_asteroidSize == AsteroidSize.large) _radius = _lrgAsteroidRadius;
194 return _radius;
195 }
196
197 Asteroid.withImage(Image img, AsteroidSize this._asteroidSize) : super.withIma ge(img) {
198 size = new Size(radius * 2.0, radius * 2.0);
199 position = new Point(_gameSizeWidth * _rand.nextDouble(), _gameSizeHeight * _rand.nextDouble());
200 rotation = 360.0 * _rand.nextDouble();
201
202 _movementVector = new Point(_rand.nextDouble() * _maxAsteroidSpeed * 2 - _ma xAsteroidSpeed,
203 _rand.nextDouble() * _maxAsteroidSpeed * 2 - _ma xAsteroidSpeed);
204 }
205 }
206
207 class Ship extends Sprite {
208 Vector2 _movementVector;
209 double _rotationTarget;
210
211 Ship.withImage(Image img) : super.withImage(img) {
212 _movementVector = new Vector2.zero();
213 rotation = _rotationTarget = 270.0;
214
215 // Create sprite
216 size = new Size(_shipRadius * 2.0, _shipRadius * 2.0);
217 position = new Point(_gameSizeWidth/2.0, _gameSizeHeight/2.0);
218 }
219
220 void thrust(double x, double y) {
221 _rotationTarget = convertRadians2Degrees(Math.atan2(y, x));
222 Vector2 directionVector = new Vector2(x, y).normalize();
223 _movementVector.addScaled(directionVector, 1.0);
224 }
225
226 void move() {
227 position = new Point(position.x + _movementVector[0], position.y + _movement Vector[1]);
228 _movementVector.scale(0.9);
229
230 rotation = dampenRotation(rotation, _rotationTarget, 0.1);
231 }
232 }
233
234 class Laser extends Sprite {
235 int _frameCount = 0;
236 Point _movementVector;
237 double radius = 10.0;
238
239 Laser.withImage(Image img, Ship ship) : super.withImage(img) {
240 size = new Size(20.0, 20.0);
241 position = ship.position;
242 rotation = ship.rotation + 90.0;
243 transferMode = TransferMode.plusMode;
244 double rotRadians = convertDegrees2Radians(rotation);
245 _movementVector = pointMult(new Point(Math.sin(rotRadians), -Math.cos(rotRad ians)), 10.0);
246 _movementVector = new Point(_movementVector.x + ship._movementVector[0], _mo vementVector.y + ship._movementVector[1]);
247 }
248
249 bool move() {
250 position = pointAdd(position, _movementVector);
251 _frameCount++;
252 }
253 }
254
255 // Convenience methods
256
257 Point pointAdd(Point a, Point b) {
258 return new Point(a.x+ b.x, a.y + b.y);
259 }
abarth-chromium 2015/06/13 00:03:20 We have an operator+ for Point and Size. I wonder
260
261 Point pointMult(Point a, double multiplier) {
262 return new Point(a.x * multiplier, a.y * multiplier);
263 }
abarth-chromium 2015/06/13 00:03:20 We should just add this to Point.dart
264
265 double dampenRotation(double src, double dst, double dampening) {
266 double delta = dst - src;
267 while (delta > 180.0) delta -= 360;
268 while (delta < -180) delta += 360;
269 delta *= dampening;
270
271 return src + delta;
272 }
273
274 double pointQuickDist(Point a, Point b) {
275 double dx = a.x - b.x;
276 double dy = a.y - b.y;
277 if (dx < 0.0) dx = -dx;
278 if (dy < 0.0) dy = -dy;
279 if (dx > dy) {
280 return dx + dy/2.0;
281 }
282 else {
283 return dy + dx/2.0;
284 }
285 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698