AGSScriptModuleKhrisStarField GeneratorStarField0.1È // new module script #define MAX_STARS 10000 #define DO_WARP eKeySpace star_str s[MAX_STARS]; float center_x, center_y; int stars, speed; bool do_stars; static void StarField::SetCenter(int x, int y) { center_x = IntToFloat(x); center_y = IntToFloat(y); } void game_start() { center_x = IntToFloat(System.ViewportWidth/2) - 0.5; center_y = IntToFloat(System.ViewportHeight/2) -0.5; } DynamicSprite*backup; void on_event(EventType event, int data) { if (event != eEventEnterRoomBeforeFadein) return; do_stars = false; backup = DynamicSprite.CreateFromBackground(); } void reset() { int i; while (i < MAX_STARS) { s[i].used = false; i++; } } void init_star(int i) { s[i].used = true; int dist1 = 20000; int dist2 = 1500000; float a = (IntToFloat(Random(1000))*Maths.Pi)/500.0; float r = IntToFloat((dist1 + Random(dist2-dist1))); s[i].x = Maths.Sin(a)*r; s[i].y = Maths.Cos(a)*r; s[i].z = 1000.0 + IntToFloat(Random(5000)); s[i].r = r; } static void StarField::Do(int number_of_stars, int speed_of_stars) { reset(); speed = speed_of_stars; stars = number_of_stars; do_stars = true; int i; while (i < number_of_stars) { init_star(i); i++; } } float[] Get2D(int i) { float r[] = new float[2]; if (s[i].z == 0.0) { r[0] = 10000.0; r[1] = 10000.0; return r; } r[0] = center_x + s[i].x/s[i].z; r[1] = center_y - s[i].y/s[i].z; return r; } void draw_stars() { DrawingSurface*ds = Room.GetDrawingSurfaceForBackground(); if (!IsKeyPressed(DO_WARP)) ds.DrawImage(0, 0, backup.Graphic); ds.DrawingColor = 15; int i, x, y, z, w; float c[] = new float[2]; while (i < stars) { if (s[i].used) { c = Get2D(i); x = FloatToInt(c[0]); y = FloatToInt(c[1]); // calculate distance from camera float d = Maths.Sqrt(s[i].r*s[i].r + s[i].z*s[i].z); z = 255-(255*FloatToInt(s[i].z))/2000; z = z-(FloatToInt(s[i].r)/1500); if (z < 0) z = 0; else if (z > 255) z = 255; ds.DrawingColor = Game.GetColorFromRGB(z, z, z); w = 200/FloatToInt(s[i].z); ds.DrawCircle(x, y, w); } i++; } ds.Release(); } void repeatedly_execute() { if (!do_stars) return; int i; while (i < stars) { s[i].z -= IntToFloat(speed); if (s[i].z <= 0.0) { init_star(i); } i++; } draw_stars(); }ç// new module header struct star_str { bool used; float x, y, z, r; }; struct StarField { import static void Do(int number_of_stars = 500, int speed_of_stars = 10); import static void SetCenter(int x, int y); };ZÛ‘|ej÷´