From 87e03ac83713c88e63dc2bba3bf88c71b4c1ebe3 Mon Sep 17 00:00:00 2001 From: Mohammad_Hasan Date: Thu, 30 Oct 2025 15:03:57 +0400 Subject: [PATCH] [Add]: Levels, Ammo, Shooting upgrade --- assets/Game.fire | 8 +- assets/Prefabs/alienship3.prefab | 10 +- assets/Prefabs/alienship3.prefab.meta | 2 +- assets/Prefabs/alienship4.prefab | 10 +- assets/Prefabs/alienship4.prefab.meta | 2 +- assets/Prefabs/alienship5.prefab | 10 +- assets/Prefabs/alienship5.prefab.meta | 2 +- assets/Prefabs/health.prefab | 259 +++++++++++++++++ assets/Prefabs/health.prefab.meta | 8 + assets/Prefabs/rocket.prefab | 264 ++++++++++++++++++ assets/Prefabs/rocket.prefab.meta | 8 + assets/Scripts/Addon.ts | 39 +++ assets/Scripts/Addon.ts.meta | 9 + assets/Scripts/EnemyShip.ts | 19 +- assets/Scripts/Game.ts | 11 +- assets/Scripts/GameData.ts | 53 ++-- assets/Scripts/MoveJet.ts | 31 +- assets/addons.meta | 7 + .../addons/Powerup_Health_png_processed.png | Bin 0 -> 3231 bytes .../Powerup_Health_png_processed.png.meta | 34 +++ .../addons/Powerup_Rockets_png_processed.png | Bin 0 -> 3137 bytes .../Powerup_Rockets_png_processed.png.meta | 34 +++ settings/project.json | 16 +- 23 files changed, 782 insertions(+), 54 deletions(-) create mode 100644 assets/Prefabs/health.prefab create mode 100644 assets/Prefabs/health.prefab.meta create mode 100644 assets/Prefabs/rocket.prefab create mode 100644 assets/Prefabs/rocket.prefab.meta create mode 100644 assets/Scripts/Addon.ts create mode 100644 assets/Scripts/Addon.ts.meta create mode 100644 assets/addons.meta create mode 100644 assets/addons/Powerup_Health_png_processed.png create mode 100644 assets/addons/Powerup_Health_png_processed.png.meta create mode 100644 assets/addons/Powerup_Rockets_png_processed.png create mode 100644 assets/addons/Powerup_Rockets_png_processed.png.meta diff --git a/assets/Game.fire b/assets/Game.fire index eb04d90..65e3191 100644 --- a/assets/Game.fire +++ b/assets/Game.fire @@ -162,7 +162,7 @@ "__type__": "cc.Vec3", "x": 0, "y": 0, - "z": 539.5338265577053 + "z": 780.2888888097792 }, "_scale": { "__type__": "cc.Vec3", @@ -1320,13 +1320,13 @@ }, "_enabled": true, "alienship1": { - "__uuid__": "26432aa1-71c9-45a0-bd88-35e669d6d66b" + "__uuid__": "cc9c71b8-6dce-463b-a0a8-99baebb6aa72" }, "alienship2": { - "__uuid__": "3d6dff29-ac6e-4b8b-8506-3f1ed9083ffc" + "__uuid__": "2a44b465-8729-484a-b0d5-8028192c3600" }, "alienship3": { - "__uuid__": "02d85ab4-7c96-4a14-9cd8-5e02c91ac383" + "__uuid__": "022c2978-0c9b-442a-89ef-f4df3dd70646" }, "_id": "77Y3BgqzhPzpdYEPdwxYS3" }, diff --git a/assets/Prefabs/alienship3.prefab b/assets/Prefabs/alienship3.prefab index 30f2726..01f1974 100644 --- a/assets/Prefabs/alienship3.prefab +++ b/assets/Prefabs/alienship3.prefab @@ -18,7 +18,7 @@ "_parent": null, "_children": [], "_active": true, - "_level": 1, + "_level": 2, "_components": [ { "__id__": 2 @@ -121,6 +121,12 @@ "yellowBullet": { "__uuid__": "1e6b2ed9-fc9b-4d1a-8f2a-7773b0428ecb" }, + "rocket": { + "__uuid__": "941946c0-687a-41ee-ba1f-ff4993adeacd" + }, + "health": { + "__uuid__": "afab2f55-c2a7-4b21-9a71-f4d566ff70bc" + }, "_id": "" }, { @@ -733,7 +739,7 @@ "asset": { "__id__": 0 }, - "fileId": "93DZ+g/9FEeKshIA/tJS3m", + "fileId": "c9zFlVfU9Pr7HzSY8BJeaQ", "sync": false } ] \ No newline at end of file diff --git a/assets/Prefabs/alienship3.prefab.meta b/assets/Prefabs/alienship3.prefab.meta index e677786..fa35220 100644 --- a/assets/Prefabs/alienship3.prefab.meta +++ b/assets/Prefabs/alienship3.prefab.meta @@ -1,6 +1,6 @@ { "ver": "1.2.1", - "uuid": "26432aa1-71c9-45a0-bd88-35e669d6d66b", + "uuid": "cc9c71b8-6dce-463b-a0a8-99baebb6aa72", "optimizationPolicy": "AUTO", "asyncLoadAssets": false, "readonly": false, diff --git a/assets/Prefabs/alienship4.prefab b/assets/Prefabs/alienship4.prefab index 2d29360..07a9de6 100644 --- a/assets/Prefabs/alienship4.prefab +++ b/assets/Prefabs/alienship4.prefab @@ -18,7 +18,7 @@ "_parent": null, "_children": [], "_active": true, - "_level": 1, + "_level": 2, "_components": [ { "__id__": 2 @@ -121,6 +121,12 @@ "yellowBullet": { "__uuid__": "1e6b2ed9-fc9b-4d1a-8f2a-7773b0428ecb" }, + "rocket": { + "__uuid__": "941946c0-687a-41ee-ba1f-ff4993adeacd" + }, + "health": { + "__uuid__": "afab2f55-c2a7-4b21-9a71-f4d566ff70bc" + }, "_id": "" }, { @@ -1098,7 +1104,7 @@ "asset": { "__id__": 0 }, - "fileId": "2ek+AbmdVAUYR1SE39v44O", + "fileId": "f9f/isXgZHr78pxJAgRYe9", "sync": false } ] \ No newline at end of file diff --git a/assets/Prefabs/alienship4.prefab.meta b/assets/Prefabs/alienship4.prefab.meta index e7c9804..38131bb 100644 --- a/assets/Prefabs/alienship4.prefab.meta +++ b/assets/Prefabs/alienship4.prefab.meta @@ -1,6 +1,6 @@ { "ver": "1.2.1", - "uuid": "3d6dff29-ac6e-4b8b-8506-3f1ed9083ffc", + "uuid": "2a44b465-8729-484a-b0d5-8028192c3600", "optimizationPolicy": "AUTO", "asyncLoadAssets": false, "readonly": false, diff --git a/assets/Prefabs/alienship5.prefab b/assets/Prefabs/alienship5.prefab index be18b5b..4afbbba 100644 --- a/assets/Prefabs/alienship5.prefab +++ b/assets/Prefabs/alienship5.prefab @@ -18,7 +18,7 @@ "_parent": null, "_children": [], "_active": true, - "_level": 1, + "_level": 2, "_components": [ { "__id__": 2 @@ -121,6 +121,12 @@ "yellowBullet": { "__uuid__": "1e6b2ed9-fc9b-4d1a-8f2a-7773b0428ecb" }, + "rocket": { + "__uuid__": "941946c0-687a-41ee-ba1f-ff4993adeacd" + }, + "health": { + "__uuid__": "afab2f55-c2a7-4b21-9a71-f4d566ff70bc" + }, "_id": "" }, { @@ -1133,7 +1139,7 @@ "asset": { "__id__": 0 }, - "fileId": "6en9Mka0pKSKby4zJcoJBv", + "fileId": "53aBGR+eRGY7mE48Fc6Wgn", "sync": false } ] \ No newline at end of file diff --git a/assets/Prefabs/alienship5.prefab.meta b/assets/Prefabs/alienship5.prefab.meta index 3a17911..19d70cb 100644 --- a/assets/Prefabs/alienship5.prefab.meta +++ b/assets/Prefabs/alienship5.prefab.meta @@ -1,6 +1,6 @@ { "ver": "1.2.1", - "uuid": "02d85ab4-7c96-4a14-9cd8-5e02c91ac383", + "uuid": "022c2978-0c9b-442a-89ef-f4df3dd70646", "optimizationPolicy": "AUTO", "asyncLoadAssets": false, "readonly": false, diff --git a/assets/Prefabs/health.prefab b/assets/Prefabs/health.prefab new file mode 100644 index 0000000..a8212f9 --- /dev/null +++ b/assets/Prefabs/health.prefab @@ -0,0 +1,259 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "health", + "_objFlags": 0, + "_parent": null, + "_children": [], + "_active": true, + "_level": 2, + "_components": [ + { + "__id__": 2 + }, + { + "__id__": 3 + }, + { + "__id__": 4 + } + ], + "_prefab": { + "__id__": 5 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 48, + "height": 28 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_position": { + "__type__": "cc.Vec3", + "x": -158.356, + "y": 27.383, + "z": 0 + }, + "_scale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 0.6, + "z": 1 + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "groupIndex": 4, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "3f307ec9-399d-4075-842b-f3a3c22bee25" + }, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PolygonCollider", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "tag": 0, + "_offset": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "points": [ + { + "__type__": "cc.Vec2", + "x": -12, + "y": 14 + }, + { + "__type__": "cc.Vec2", + "x": -15, + "y": 9 + }, + { + "__type__": "cc.Vec2", + "x": -18, + "y": 9 + }, + { + "__type__": "cc.Vec2", + "x": -21, + "y": 6 + }, + { + "__type__": "cc.Vec2", + "x": -21, + "y": 4 + }, + { + "__type__": "cc.Vec2", + "x": -24, + "y": 3 + }, + { + "__type__": "cc.Vec2", + "x": -24, + "y": -3 + }, + { + "__type__": "cc.Vec2", + "x": -22, + "y": -3 + }, + { + "__type__": "cc.Vec2", + "x": -17, + "y": -9 + }, + { + "__type__": "cc.Vec2", + "x": -14, + "y": -9 + }, + { + "__type__": "cc.Vec2", + "x": -14, + "y": -12 + }, + { + "__type__": "cc.Vec2", + "x": -12, + "y": -14 + }, + { + "__type__": "cc.Vec2", + "x": 13, + "y": -14 + }, + { + "__type__": "cc.Vec2", + "x": 16, + "y": -11 + }, + { + "__type__": "cc.Vec2", + "x": 16, + "y": -9 + }, + { + "__type__": "cc.Vec2", + "x": 19, + "y": -9 + }, + { + "__type__": "cc.Vec2", + "x": 24, + "y": -4 + }, + { + "__type__": "cc.Vec2", + "x": 24, + "y": 4 + }, + { + "__type__": "cc.Vec2", + "x": 20, + "y": 8 + }, + { + "__type__": "cc.Vec2", + "x": 16, + "y": 8 + }, + { + "__type__": "cc.Vec2", + "x": 16, + "y": 11 + }, + { + "__type__": "cc.Vec2", + "x": 13, + "y": 14 + } + ], + "_id": "" + }, + { + "__type__": "4cc23PKJspLG7P/IBljP2/H", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6dVfqDhfNIdKWl08hFRkvL", + "sync": false + } +] \ No newline at end of file diff --git a/assets/Prefabs/health.prefab.meta b/assets/Prefabs/health.prefab.meta new file mode 100644 index 0000000..fe081c5 --- /dev/null +++ b/assets/Prefabs/health.prefab.meta @@ -0,0 +1,8 @@ +{ + "ver": "1.2.1", + "uuid": "afab2f55-c2a7-4b21-9a71-f4d566ff70bc", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Prefabs/rocket.prefab b/assets/Prefabs/rocket.prefab new file mode 100644 index 0000000..5e20b4d --- /dev/null +++ b/assets/Prefabs/rocket.prefab @@ -0,0 +1,264 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "rocket", + "_objFlags": 0, + "_parent": null, + "_children": [], + "_active": true, + "_level": 2, + "_components": [ + { + "__id__": 2 + }, + { + "__id__": 3 + }, + { + "__id__": 4 + } + ], + "_prefab": { + "__id__": 5 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 47, + "height": 29 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_position": { + "__type__": "cc.Vec3", + "x": 14.357, + "y": 21.601, + "z": 0 + }, + "_scale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 0.6, + "z": 1 + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "groupIndex": 5, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "4c53dcbf-af4f-4475-9922-6cfdbcfbd7e4" + }, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PolygonCollider", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "tag": 0, + "_offset": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "points": [ + { + "__type__": "cc.Vec2", + "x": -11.5, + "y": 14.5 + }, + { + "__type__": "cc.Vec2", + "x": -12.5, + "y": 12.5 + }, + { + "__type__": "cc.Vec2", + "x": -14.5, + "y": 12.5 + }, + { + "__type__": "cc.Vec2", + "x": -15.5, + "y": 7.5 + }, + { + "__type__": "cc.Vec2", + "x": -19.5, + "y": 7.5 + }, + { + "__type__": "cc.Vec2", + "x": -20.5, + "y": 4.5 + }, + { + "__type__": "cc.Vec2", + "x": -23.5, + "y": 2.5 + }, + { + "__type__": "cc.Vec2", + "x": -23.5, + "y": -3.5 + }, + { + "__type__": "cc.Vec2", + "x": -20.5, + "y": -5.5 + }, + { + "__type__": "cc.Vec2", + "x": -20.5, + "y": -7.5 + }, + { + "__type__": "cc.Vec2", + "x": -15.5, + "y": -9.5 + }, + { + "__type__": "cc.Vec2", + "x": -14.5, + "y": -13.5 + }, + { + "__type__": "cc.Vec2", + "x": 12.5, + "y": -14.5 + }, + { + "__type__": "cc.Vec2", + "x": 15.5, + "y": -11.5 + }, + { + "__type__": "cc.Vec2", + "x": 15.5, + "y": -9.5 + }, + { + "__type__": "cc.Vec2", + "x": 17.5, + "y": -9.5 + }, + { + "__type__": "cc.Vec2", + "x": 23.5, + "y": -3.5 + }, + { + "__type__": "cc.Vec2", + "x": 23.5, + "y": 2.5 + }, + { + "__type__": "cc.Vec2", + "x": 19.5, + "y": 5.5 + }, + { + "__type__": "cc.Vec2", + "x": 19.5, + "y": 7.5 + }, + { + "__type__": "cc.Vec2", + "x": 15.5, + "y": 7.5 + }, + { + "__type__": "cc.Vec2", + "x": 15.5, + "y": 10.5 + }, + { + "__type__": "cc.Vec2", + "x": 11.5, + "y": 14.5 + } + ], + "_id": "" + }, + { + "__type__": "4cc23PKJspLG7P/IBljP2/H", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "89l6vGXMxG6ZmqMkvQt1+Q", + "sync": false + } +] \ No newline at end of file diff --git a/assets/Prefabs/rocket.prefab.meta b/assets/Prefabs/rocket.prefab.meta new file mode 100644 index 0000000..3d1a9a6 --- /dev/null +++ b/assets/Prefabs/rocket.prefab.meta @@ -0,0 +1,8 @@ +{ + "ver": "1.2.1", + "uuid": "941946c0-687a-41ee-ba1f-ff4993adeacd", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Scripts/Addon.ts b/assets/Scripts/Addon.ts new file mode 100644 index 0000000..88aa6ca --- /dev/null +++ b/assets/Scripts/Addon.ts @@ -0,0 +1,39 @@ +// Learn TypeScript: +// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/typescript.html +// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html +// Learn Attribute: +// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html +// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html +// Learn life-cycle callbacks: +// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html +// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html + +const {ccclass, property} = cc._decorator; + +@ccclass +export default class NewClass extends cc.Component { + + setMovements() { + var moveDown = cc.moveBy(2, cc.v2(0, -this.node.parent.getContentSize().height * 0.95)); + + this.node.runAction(cc.repeatForever(moveDown)); + } + + setScale() { + const scaleUp = cc.scaleTo(0.5, 1.25, 1); + const scaleDown = cc.scaleTo(0.5, 1, 1); + const scalePulse = cc.sequence(scaleUp, scaleDown); + this.node.runAction(cc.repeatForever(scalePulse)); + } + + onLoad () { + this.scheduleOnce(this.setMovements, 0.1); + this.scheduleOnce(this.setScale, 0.1); + } + + update (dt) { + if(this.node.position.y <= -(this.node.parent.getContentSize().height)) { + this.node.destroy(); + } + } +} diff --git a/assets/Scripts/Addon.ts.meta b/assets/Scripts/Addon.ts.meta new file mode 100644 index 0000000..0b6e1f6 --- /dev/null +++ b/assets/Scripts/Addon.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.0.5", + "uuid": "4cc233ca-26ca-4b1b-b3ff-2019633f6fc7", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Scripts/EnemyShip.ts b/assets/Scripts/EnemyShip.ts index ea647df..bd5c57c 100644 --- a/assets/Scripts/EnemyShip.ts +++ b/assets/Scripts/EnemyShip.ts @@ -18,11 +18,18 @@ export default class NewClass extends cc.Component { moveAmountX : number = 0; RTL: boolean = false; + specialItem: string = null; + moveEnemy : cc.ActionInterval; @property(cc.Prefab) yellowBullet: cc.Prefab = null; + @property(cc.Prefab) + rocket: cc.Prefab = null; + @property(cc.Prefab) + health: cc.Prefab = null; + enemyLife: number = GameData.instance.enemyHealth; playAnimation : Boolean = true; @@ -44,7 +51,7 @@ export default class NewClass extends cc.Component { onLoad () { this.scheduleOnce(this.setMovements, 0.1); - this.schedule(this.shootBullets, GameData.instance.enemyShootingInterval, cc.macro.REPEAT_FOREVER, 0); + this.schedule(this.shootBullets, GameData.instance.playerShootingInterval * Math.max(0.25, Math.random()), cc.macro.REPEAT_FOREVER, 0); } onCollisionEnter(otherCollider, selfCollider) { if(otherCollider.name === 'greenbullet') { @@ -64,6 +71,16 @@ export default class NewClass extends cc.Component { removeExplosion() { this.node.destroy(); + if(this.specialItem === 'rocket') { + var rocket = cc.instantiate(this.rocket); + rocket.setPosition(this.node.position.x, this.node.position.y); + this.node.parent.addChild(rocket); + } + if(this.specialItem === 'health') { + var health = cc.instantiate(this.health); + health.setPosition(this.node.position.x, this.node.position.y); + this.node.parent.addChild(health); + } } start () { diff --git a/assets/Scripts/Game.ts b/assets/Scripts/Game.ts index cc14b60..90e343a 100644 --- a/assets/Scripts/Game.ts +++ b/assets/Scripts/Game.ts @@ -41,6 +41,10 @@ export default class NewClass extends cc.Component { const shipXMax = screenHalfWidth - shipMaxMove - margin; const shipX = Math.random() * (shipXMax - shipXMin) + shipXMin; + const randomNumber = Math.ceil(Math.random() * 10); + const specialItem = randomNumber%2 === 0 ? null : randomNumber%3 === 0 ? 'health' : 'rocket'; + const specialItemIndex = Math.floor(Math.random() * GameData.instance.enemySpawnInterval); + for (let i = 0; i < GameData.instance.enemySpawnInterval; i++) { this.scheduleOnce(() => { const ship = cc.instantiate(shipPrefab); @@ -50,6 +54,11 @@ export default class NewClass extends cc.Component { const shipScript = ship.getComponent('EnemyShip'); shipScript.moveAmountX = batchMoveAmountX; shipScript.RTL = RTL; + + if(i === specialItemIndex && specialItem !== null) { + shipScript.specialItem = specialItem; + } + }, i * GameData.instance.enemyMoveTime * 0.25); } } @@ -60,7 +69,7 @@ export default class NewClass extends cc.Component { } start () { - this.schedule(this.spawnShips, 5, cc.macro.REPEAT_FOREVER, 1); + this.schedule(this.spawnShips, GameData.instance.selectedLevel * 3, cc.macro.REPEAT_FOREVER, 1); } // update (dt) {} diff --git a/assets/Scripts/GameData.ts b/assets/Scripts/GameData.ts index 921f6c0..799b3fe 100644 --- a/assets/Scripts/GameData.ts +++ b/assets/Scripts/GameData.ts @@ -24,41 +24,26 @@ export default class GameData extends cc.Component { return this._instance; } - // 🔹 Shooting speed (seconds per shot) - public get enemyShootingInterval(): number { - switch (this.selectedLevel) { - case 1: return 8; - case 2: return 6; - case 3: return 4; - case 4: return 2; - default: return 8; - } - } - - // 🔹 Enemy spawn interval (seconds) - public get enemySpawnInterval(): number { - switch (this.selectedLevel) { - case 1: return 6; - case 2: return 8; - case 3: return 10; - case 4: return 12; - default: return 6; - } - } - - // 🔹 Player speed - public get enemyMoveTime(): number { - switch (this.selectedLevel) { - case 1: return 3; - case 2: return 4; - case 3: return 5; - case 4: return 6; - default: return 3; - } - } - - // 🔹 Any other level-based settings... public get enemyHealth(): number { return this.selectedLevel; } + + private levelConfig = { + 1: { shootingSpeed: 8, spawnInterval: 6, playerSpeed: 3 }, + 2: { shootingSpeed: 6, spawnInterval: 8, playerSpeed: 4 }, + 3: { shootingSpeed: 4, spawnInterval: 10, playerSpeed: 5 }, + 4: { shootingSpeed: 2, spawnInterval: 12, playerSpeed: 6 }, + }; + + public get playerShootingInterval(): number { + return this.levelConfig[this.selectedLevel].shootingSpeed; + } + + public get enemySpawnInterval(): number { + return this.levelConfig[this.selectedLevel].spawnInterval; + } + + public get enemyMoveTime(): number { + return this.levelConfig[this.selectedLevel].playerSpeed; + } } diff --git a/assets/Scripts/MoveJet.ts b/assets/Scripts/MoveJet.ts index 872e5da..c467edc 100644 --- a/assets/Scripts/MoveJet.ts +++ b/assets/Scripts/MoveJet.ts @@ -15,6 +15,7 @@ export default class NewClass extends cc.Component { private isDragging: boolean = false; private touchOffset: cc.Vec2 = cc.v2(0, 0); + private shootingInterval: number = 1; @property(cc.Prefab) greenBullet: cc.Prefab = null; @@ -30,13 +31,39 @@ export default class NewClass extends cc.Component { cc.director.loadScene('Menu'); } } + else if(otherCollider.name === 'health') { + this.playerLifes = 5; + otherCollider.node.destroy(); + } + else if(otherCollider.name === 'rocket') { + this.shootingInterval = Math.min(this.shootingInterval + 1, 3); + otherCollider.node.destroy(); + } } - shootBullets() { + + spawnBullet(offsetX: number, offsetY: number) { var bullet = cc.instantiate(this.greenBullet); - bullet.setPosition(this.node.position.x, this.node.position.y + 40); + bullet.setPosition(this.node.position.x + offsetX, this.node.position.y + offsetY); this.node.parent.addChild(bullet); } + shootBullets() { + switch (this.shootingInterval) { + case 1: + this.spawnBullet(0, 40); + break; + case 2: + this.spawnBullet(-30, 20); + this.spawnBullet(30, 20); + break; + case 3: + this.spawnBullet(0, 40); + this.spawnBullet(-30, 20); + this.spawnBullet(30, 20); + break; + } + } + onLoad() { // Enable touch on this node directly this.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this); diff --git a/assets/addons.meta b/assets/addons.meta new file mode 100644 index 0000000..1592e93 --- /dev/null +++ b/assets/addons.meta @@ -0,0 +1,7 @@ +{ + "ver": "1.0.1", + "uuid": "f2df831b-59ae-48ef-bf79-c73b646914e6", + "isSubpackage": false, + "subpackageName": "", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/addons/Powerup_Health_png_processed.png b/assets/addons/Powerup_Health_png_processed.png new file mode 100644 index 0000000000000000000000000000000000000000..578f1cabd3b19be1ba8943684d2dc857e9dfb079 GIT binary patch literal 3231 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