如何实现类打地鼠矩形点击Flash游戏:随机位置与随时间加速显隐
嘿,这个类打地鼠的Flash游戏想法挺有意思的!针对你遇到的两个核心问题——让矩形在随机位置出现消失,以及随剩余时间加快这个频率,我给你整理了具体的实现思路和ActionScript 3代码示例,都是Flash里常用的做法:
1. 实现矩形的随机位置生成
要让矩形出现在屏幕随机位置,核心是用Math.random()计算合法的坐标,关键是要保证矩形不会超出舞台边界(不然玩家点不到)。假设你的矩形宽为rectWidth,高为rectHeight,可以写一个专门生成随机位置的函数:
private function getRandomPosition():Point { // 计算x范围:从0到舞台宽度减去矩形宽度,避免超出右侧 var randomX:Number = Math.random() * (stage.stageWidth - rectWidth); // 计算y范围:从0到舞台高度减去矩形高度,避免超出底部 var randomY:Number = Math.random() * (stage.stageHeight - rectHeight); return new Point(randomX, randomY); }
每次要生成新矩形时,调用这个函数就能拿到合法的随机坐标啦。
2. 随剩余时间动态调整出现消失速度
咱们可以用Timer来控制矩形的出现消失频率,核心思路是随着剩余时间减少,不断缩小Timer的延迟时间:
- 先定义总游戏时间(比如60秒)和初始延迟(比如1000毫秒,也就是1秒出现一次)
- 每过一段时间(比如每100毫秒)更新剩余时间,然后根据剩余时间占总时间的比例,动态调整Timer的延迟
- 记得设置一个最小延迟值(比如200毫秒),不然后期速度太快玩家根本反应不过来
举个具体的逻辑示例:
var totalGameTime:Number = 60; // 总游戏时间,单位:秒 var remainingTime:Number = totalGameTime; var initialDelay:Number = 1000; // 初始出现间隔,单位:毫秒 var minDelay:Number = 200; // 最小间隔,避免速度过快 var spawnTimer:Timer; // 初始化计时器 private function initTimer():void { spawnTimer = new Timer(initialDelay); spawnTimer.addEventListener(TimerEvent.TIMER, spawnRect); spawnTimer.start(); // 启动一个定时器更新剩余时间和速度 var timeUpdateTimer:Timer = new Timer(100); timeUpdateTimer.addEventListener(TimerEvent.TIMER, updateTimeAndSpeed); timeUpdateTimer.start(); } // 更新剩余时间和生成速度 private function updateTimeAndSpeed(e:TimerEvent):void { remainingTime -= 0.1; // 每次减0.1秒(因为定时器是100毫秒触发一次) if (remainingTime <= 0) { // 游戏结束逻辑 e.target.stop(); spawnTimer.stop(); return; } // 计算当前延迟:剩余时间占比 * 初始延迟,且不低于最小延迟 var currentDelay:Number = initialDelay * (remainingTime / totalGameTime); currentDelay = Math.max(currentDelay, minDelay); // 更新计时器的延迟 spawnTimer.delay = currentDelay; }
3. 整合出现消失与点击得分逻辑
最后把随机位置、速度调整和点击得分整合起来,完整的核心代码大概是这样:
package { import flash.display.Sprite; import flash.display.Stage; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; import flash.geom.Point; public class RectWhackGame extends Sprite { private var rectWidth:Number = 50; private var rectHeight:Number = 50; private var score:Number = 0; private var currentRect:Sprite; private var totalGameTime:Number = 60; private var remainingTime:Number = totalGameTime; private var initialDelay:Number = 1000; private var minDelay:Number = 200; private var spawnTimer:Timer; public function RectWhackGame() { initGame(); } private function initGame():void { // 设置舞台相关属性 stage.scaleMode = "noScale"; stage.align = "topLeft"; // 初始化计时器 initTimer(); } private function initTimer():void { spawnTimer = new Timer(initialDelay); spawnTimer.addEventListener(TimerEvent.TIMER, spawnRect); spawnTimer.start(); var timeUpdateTimer:Timer = new Timer(100); timeUpdateTimer.addEventListener(TimerEvent.TIMER, updateTimeAndSpeed); timeUpdateTimer.start(); } private function spawnRect(e:TimerEvent):void { // 移除之前的矩形(如果存在) if (currentRect) { removeChild(currentRect); currentRect.removeEventListener(MouseEvent.CLICK, onRectClick); currentRect = null; } // 创建新矩形 currentRect = new Sprite(); currentRect.graphics.beginFill(0xFF0000); currentRect.graphics.drawRect(0, 0, rectWidth, rectHeight); currentRect.graphics.endFill(); // 设置随机位置 var pos:Point = getRandomPosition(); currentRect.x = pos.x; currentRect.y = pos.y; // 添加点击事件 currentRect.addEventListener(MouseEvent.CLICK, onRectClick); addChild(currentRect); } private function onRectClick(e:MouseEvent):void { score++; trace("当前得分:" + score); // 可以替换成舞台上的文本显示得分 // 点击后立即移除当前矩形 removeChild(currentRect); currentRect.removeEventListener(MouseEvent.CLICK, onRectClick); currentRect = null; } private function getRandomPosition():Point { var randomX:Number = Math.random() * (stage.stageWidth - rectWidth); var randomY:Number = Math.random() * (stage.stageHeight - rectHeight); return new Point(randomX, randomY); } private function updateTimeAndSpeed(e:TimerEvent):void { remainingTime -= 0.1; if (remainingTime <= 0) { e.target.stop(); spawnTimer.stop(); trace("游戏结束!最终得分:" + score); return; } var currentDelay:Number = initialDelay * (remainingTime / totalGameTime); currentDelay = Math.max(currentDelay, minDelay); spawnTimer.delay = currentDelay; } } }
这个代码里,每次计时器触发就会生成一个新的红色矩形,玩家点击后得分并移除矩形,同时随着剩余时间减少,矩形的出现间隔会越来越短,直到达到最小间隔或者游戏结束。你可以根据自己的需求调整矩形大小、颜色、总时间、初始延迟这些参数~
内容的提问来源于stack exchange,提问作者Ajitesh Shukla
相关产品推荐
相关产品推荐

