Actionscript 3 AS3新手,无法让玩家正确移动
正如标题所说,我是AS3/Flash新手,正在努力学习如何制作游戏。 我一直在关注加里·罗森茨威格(Gary Rosenzweig)的《Flash游戏大学》(Flash Game University)的教程(包括这本书和iTunes播客)。 作为免责声明,我使用的所有代码都来自上面提到的教程,我并没有创建它们。我只是将它们拼接在一起,以尝试使某些工作方式有所不同 在我发布代码之前,让我简单地解释一下我的问题以及我试图解决它的方法。基本上,当我完全使用教程代码(它使用“catcher.x=mouseX”表示移动)时,我让游戏运行得很好,但我想试着让玩家(“catcher”)用左右箭头键而不是鼠标移动。然而,当我把它放进去时,移动变得不稳定,玩家不是平稳地左右移动,而是不断地左右跳跃,不断地提高速度,直到它从屏幕上跳出。不用说,我不知道它为什么会这样做 起初,我认为我基于箭头的动作的代码是错误的,所以我将其复制并粘贴到一个单独的文件中进行测试,它工作得很好,因此我认为出于某种原因,使游戏其余部分正常工作的代码以某种方式破坏了它 我尝试将代码移动到不同的地方,但这并没有解决问题(事实上,这常常使问题变得更糟) 我觉得我在格式化代码方面遗漏了一些东西(不幸的是,我发现的教程中没有一个涵盖AS3的正确样式,而且我以前没有任何编码经验,所以我的代码可能非常混乱/杂乱无章) 最后,我为我的代码的混乱提前道歉。我对这件事还不太熟悉,只是想把事情弄清楚 非常感谢您的帮助,感谢您抽出时间阅读此文Actionscript 3 AS3新手,无法让玩家正确移动,actionscript-3,game-physics,Actionscript 3,Game Physics,正如标题所说,我是AS3/Flash新手,正在努力学习如何制作游戏。 我一直在关注加里·罗森茨威格(Gary Rosenzweig)的《Flash游戏大学》(Flash Game University)的教程(包括这本书和iTunes播客)。 作为免责声明,我使用的所有代码都来自上面提到的教程,我并没有创建它们。我只是将它们拼接在一起,以尝试使某些工作方式有所不同 在我发布代码之前,让我简单地解释一下我的问题以及我试图解决它的方法。基本上,当我完全使用教程代码(它使用“catcher.x=mou
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.utils.getDefinitionByName;
public class CatchingGame1 extends MovieClip {
var catcher:Catcher;
var nextObject:Timer;
var objects:Array = new Array;
const speed:Number = 7.0;
var score:int = 0;
var leftArrow:Boolean = false;
var rightArrow:Boolean = false;
public function CatchingGame1() {
catcher = new Catcher();
catcher.y = 350;
addChild(catcher);
setNextObject();
addEventListener(Event.ENTER_FRAME,moveObjects);
}
public function setNextObject() {
nextObject = new Timer(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);
}
}
//this is where it starts to have problems
//make arrow booleans true
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
stage.addEventListener(Event.ENTER_FRAME, moveCatcher);
function keyPressedDown(Event:KeyboardEvent){
if (Event.keyCode == 37){
leftArrow = true;
} else if (Event.keyCode == 39){
rightArrow = true;
}
}
function keyPressedUp(event:KeyboardEvent) {
if(event.keyCode == 37){
leftArrow = false;
} else if(event.keyCode == 39){
rightArrow = false;
}
}
function moveCatcher(event:Event) {
var catcherSpeed:Number = 1;
if(leftArrow){
catcher.x -= catcherSpeed;
}
if(rightArrow){
catcher.x += catcherSpeed;
}
}
}
}
}
包{
导入flash.display.*;
导入flash.events.*;
导入flash.utils.Timer;
导入flash.utils.getDefinitionByName;
公共类CatchingGame1扩展了MovieClip{
var-catcher:catcher;
var-nextObject:定时器;
变量对象:数组=新数组;
恒速:数字=7.0;
变量得分:int=0;
var leftArrow:Boolean=false;
var rightArrow:Boolean=false;
公共功能捕获游戏1(){
捕手=新捕手();
捕手y=350;
addChild(catcher);
setNextObject();
addEventListener(事件。输入帧,移动对象);
}
公共函数setNextObject(){
nextObject=新计时器(Math.random()*1000,1);
nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject);
nextObject.start();
}
公共函数newObject(e:事件){
var goodObjects:Array=[“Circle1”、“Circle2”];
变量badObjects:Array=[“Square1”,“Square2”];
if(Math.random()<.5){
var r:int=Math.floor(Math.random()*goodObjects.length);
var classRef:Class=getDefinitionByName(goodObjects[r])作为类;
var newObject:MovieClip=newclassref();
newObject.typestr=“好”;
}否则{
r=Math.floor(Math.random()*badObjects.length);
classRef=getDefinitionByName(badObjects[r])作为类;
newObject=newclassref();
newObject.typestr=“坏”;
}
newObject.x=Math.random()*500;
addChild(newObject);
objects.push(newObject);
setNextObject();
}
公共函数移动对象(e:事件){
对于(变量i:int=objects.length-1;i>=0;i--){
对象[i].y+=速度;
如果(对象[i].y>400){
removeChild(对象[i]);
对象.拼接(i,1);
}
if(objects[i].hitTestObject(catcher)){
if(objects[i].typestr==“good”){
分数+=5分;
}否则{
分数-=1;
}
如果(得分<0)得分=0;
scoresplay.text=“分数:”+分数;
removeChild(对象[i]);
对象.拼接(i,1);
}
}
//这就是它开始出现问题的地方
//使箭头布尔值为真
stage.addEventListener(KeyboardEvent.KEY_向下,按键向下);
stage.addEventListener(KeyboardEvent.KEY\u UP,keyPressedUp);
stage.addEventListener(Event.ENTER_FRAME,moveCatcher);
功能键按下向下(事件:键盘事件){
如果(Event.keyCode==37){
leftArrow=true;
}else if(Event.keyCode==39){
右箭头=真;
}
}
功能按键按下(事件:键盘事件){
如果(event.keyCode==37){
leftArrow=false;
}else if(event.keyCode==39){
右箭头=假;
}
}
函数moveCatcher(事件:事件){
var捕捉器速度:数字=1;
如果(左箭头){
catcher.x-=catchers速度;
}
如果(向右箭头){
catcher.x+=catchers速度;
}
}
}
}
}
将keyUp和keyDown事件处理程序添加到构造函数中
不要使用多个ENTER\u FRAME事件处理程序,只需在moveObjects中调用moveCatcher即可
功能
您的moveObjects方法末尾似乎缺少一个},我对其进行了编辑。看看这是否有帮助
package {
import flash.display.*;
import flash.events.*;
import flash.utils.Timer;
import flash.utils.getDefinitionByName;
public class CatchingGame1 extends MovieClip {
var catcher:Catcher;
var nextObject:Timer;
var objects:Array = new Array;
const speed:Number = 7.0;
var score:int = 0;
var leftArrow:Boolean = false;
var rightArrow:Boolean = false;
public function CatchingGame1() {
catcher = new Catcher();
catcher.y = 350;
addChild(catcher);
setNextObject();
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
addEventListener(Event.ENTER_FRAME,moveObjects);
}
public function setNextObject() {
nextObject = new Timer(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)
{
moveCatcher(null);
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);
}
}
}
function keyPressedDown(Event:KeyboardEvent){
if (Event.keyCode == 37){
leftArrow = true;
} else if (Event.keyCode == 39){
rightArrow = true;
}
}
function keyPressedUp(event:KeyboardEvent) {
if(event.keyCode == 37){
leftArrow = false;
} else if(event.keyCode == 39){
rightArrow = false;
}
}
function moveCatcher(event:Event) {
var catcherSpeed:Number = 1;
if(leftArrow){
catcher.x -= catcherSpeed;
}
if(rightArrow){
catcher.x += catcherSpeed;
}
}
}
}
}
包{
导入flash.display.*;
导入flash.events.*;
导入flash.utils.Timer;
导入flash.utils.getDefinitionByName;