我有一个项目在几周内到期,我差不多完成了。我还有一个问题需要解决,我很难过。
我将粘贴到目前为止的代码。
如果您还可以解释代码正在做什么,那么我知道它做了什么,如果它不是太麻烦,代码是从课堂活动中获取的,我更改了标识符以匹配我的图形被称为什么。 我试图在我的drop中实现一个计时器并且每15秒捕捉一次游戏,它会增加掉落物体的速度。计时器将从60秒开始,当它达到0秒时,它应该进入单独的页面。
有人可以解释我会怎么做?我不太擅长理解flash中的代码,所以如果你能尽可能简单地保持它,我将非常感激。
我的代码如下。它工作得很好,我只需要将一个部分更改为计时器:
package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.Timer;
import flash.utils.getDefinitionByName;
public class CatchingGame extends MovieClip {
var catcher:Catcher;
var nextObject:Timer;
var objects:Array = new Array();
var score:int = 0;
const speed:Number = 7.0;
public function CatchingGame() {
catcher = new Catcher();
catcher.y = 350;
addChild(catcher);
setNextObject();
addEventListener(Event.ENTER_FRAME, moveObjects);
}
public function setNextObject() {
nextObject = new Timer(1000+Math.random()*1000,1);
nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject);
nextObject.start();
}
public function newObject(e:Event) {
var goodObjects:Array = ["Circle1","Circle2"];
var badObjects:Array = ["Square1","Square2"];
if (Math.random() < .5) {
var r:int = Math.floor(Math.random()*goodObjects.length);
var classRef:Class = getDefinitionByName(goodObjects[r]) as Class;
var newObject:MovieClip = new classRef();
newObject.typestr = "good";
} else {
r = Math.floor(Math.random()*badObjects.length);
classRef = getDefinitionByName(badObjects[r]) as Class;
newObject = new classRef();
newObject.typestr = "bad";
}
newObject.x = Math.random()*500;
addChild(newObject);
objects.push(newObject);
setNextObject();
}
public function moveObjects(e:Event) {
for(var i:int=objects.length-1;i>=0;i--) {
objects[i].y += speed;
if (objects[i].y > 400) {
removeChild(objects[i]);
objects.splice(i,1);
}
if (objects[i].hitTestObject(catcher)) {
if (objects[i].typestr == "good") {
score += 5;
} else {
score -= 1;
}
if (score < 0) score = 0;
scoreDisplay.text = "Score: "+score;
removeChild(objects[i]);
objects.splice(i,1);
}
}
catcher.x = mouseX;
}
}
}
感谢您抽出宝贵时间阅读我的问题和给予的任何帮助
答案 0 :(得分:3)
所以你想要一个每15秒钟滴答60秒的计时器。这意味着它必须勾选4次(60 / 15
)。我们称之为speedTimer
;
你必须实例化它:
speedTimer = new Timer(60 * 1000, 4);
然后您需要添加两个不同的事件侦听器。每次计时器滴答时都会调用一个,并且当它停止时将调用一个。
speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer);
speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete);
在第一个事件处理程序中,您增加speed
的值。为此,您需要将其从常量更改为变量。
在第二个处理程序中,您将代码转到另一个页面。
有几点值得提及:
当您声明变量时,您应该以与函数相同的方式指定范围(即私有,公共等):
private var catcher:Catcher;
声明函数时,应指定返回值,但类的构造函数除外。如果函数不返回任何内容,则可以使用void:
public function setNextObject():void {
[...]
}
命名非常重要,尤其是在以后阅读时要理解您的代码。如果您使用Timer
,最好将其命名为myTimer
,而不是nextObject
。
功能名称相同:setNextObject()
创建一个新的Timer
并启动它,因此我将其命名为startTimer()
。
当您创建这样的新计时器时:
new Timer(1000 + Math.random() * 1000, 1);
您指定重复计数为1.这意味着您的计时器将在满足延迟后停止。因为您希望它反复运行,所以您应该指定一个0
(无限)的repeatCount。
为了保持计时器以随机间隔打勾的功能,您需要在事件处理程序中设置新的delai值
myTimer.delay = 1000 + Math.random() * 1000;
goodObjects
和nadObjects
永远不会被修改,所以你应该用常量提取它们:
private const GOOD_OBJECTS:Array = ["Circle1","Circle2"];
private const BAD_OBJECTS:Array = ["Square1","Square2"];
通过所有这些更改,现在应该更容易理解您的代码正在做什么。这是更新的代码:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.Timer;
import flash.utils.getDefinitionByName;
public class CatchingGame extends MovieClip
{
private const GOOD_OBJECTS:Array = ["Circle1","Circle2"];
private const BAD_OBJECTS:Array = ["Square1","Square2"];
private var catcher:Catcher;
private var myTimer:Timer;
private var speedTimer:Timer;
private var objects:Array = new Array();
private var score:int = 0;
private var speed:Number;
public function CatchingGame()
{
speed = 7.0;
catcher = new Catcher();
catcher.y = 350;
addChild(catcher);
startTimer();
startSpeedTimer();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function startTimer():void
{
myTimer = new Timer(1000 + Math.random() * 1000, 0);
myTimer.addEventListener(TimerEvent.TIMER, onTimer);
myTimer.start();
}
public function startSpeedTimer():void
{
speedTimer = new Timer(60 * 1000, 4);
speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer);
speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete);
speedTimer.start();
}
public function onTimer(e:Event):void
{
myTimer.delay = 1000 + Math.random() * 1000;
if (Math.random() < .5)
{
var r:int = Math.floor(Math.random() * GOOD_OBJECTS.length);
var classRef:Class = getDefinitionByName(GOOD_OBJECTS[r]) as Class;
var newObject:MovieClip = new classRef();
newObject.typestr = "good";
}
else
{
r = Math.floor(Math.random() * BAD_OBJECTS.length);
classRef = getDefinitionByName(BAD_OBJECTS[r]) as Class;
newObject = new classRef();
newObject.typestr = "bad";
}
newObject.x = Math.random() * 500;
addChild(newObject);
objects.push(newObject);
startTimer();
}
private function onSpeedTimer(e:Event):void
{
speed++;
}
private function onSpeedTimerComplete(e:Event):void
{
// Go to some page...
}
public function onEnterFrame(e:Event):void
{
moveObjects2();
}
public function moveObjects2():void {
for(var i:int = objects.length - 1; i >= 0; i--)
{
objects[i].y += speed;
if (objects[i].y > 400)
{
removeChild(objects[i]);
objects.splice(i, 1);
}
if (objects[i].hitTestObject(catcher))
{
if (objects[i].typestr == "good")
{
score += 5;
}
else
{
score -= 1;
}
if (score < 0)
{
score = 0;
}
scoreDisplay.text = "Score: "+score;
removeChild(objects[i]);
objects.splice(i,1);
}
}
catcher.x = mouseX;
}
}
}
如果还有一部分你不理解,请随时在评论中提及
答案 1 :(得分:0)
将speed
声明为变量而不是const
,否则您的代码无法更改其值。您可以初始化变量,因此var speed:Number=7.0
有效。
var speed:Number=7.0;
var gameTimer:Timer=new Timer(15000,4);
var speedCounter:int=0;
gameTimer.addEventListener(TimerEvent.TIMER,gameTicks);
function gameTicks(e:TimerEvent):void {
if (speedCounter==3) {
gameTimer.removeEventListener(TimerEvent.TIMER,gameTicks);
gameOver(); // implement this
return;
}
speedCounter++;
speed+=2.0; // balance this yourself
}