You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类打地鼠矩形点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:53:16