Я уже несколько дней пытаюсь добавить простой хит-тест между моим классом игрока и некоторыми «зданиями», но безуспешно.
Я попытался добавить hitTest к классу игрока, а когда не получилось, классу здания. Я попробовал варианты кода на обоих также без удачи. Я читаю учебные пособия в течение нескольких дней, и что бы я ни пытался, кажется, ничего не работает - поэтому я должен делать что-то настолько просто, что здравый смысл просто ускользает от меня.
У меня есть три класса, которые могут / должны быть затронуты hitTest: класс игрока, класс здания и / или класс objectPlacer.
Для этого вопроса я оставил класс игрока без изменений, думая, что позже я добавлю к его движению логическое значение, основанное на hitTest из строительного класса. Класс ObjectPlacer создается при запуске. Его функция - создавать экземпляры зданий, флоры, фауны и т. Д. Я оставляю это нетронутым, а также думаю, что класс «здания» - это то место, где я хочу применить hitTest.
Вот мой строительный код:
package com.gamecherry.gunslinger
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;
public class BuildingsLeft03 extends MovieClip
{
private var speed:Number = 1;
private var startX:Number;
private var startY:Number;
private var stageRef:Stage;
private var target:Cowboy;
public function BuildingsLeft03(stageRef:Stage, startX:Number, startY:Number, target:Cowboy)
{
this.stageRef = stageRef;
this.target = target;
x = startX;
y = startY;
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
public function loop(e:Event) : void
{
y+= speed;
if (y > 544)
removeSelf();
if (hitTestObject(target.hit))
{
trace("hitTestObject");
}
}
private function removeSelf() : void
{
removeEventListener(Event.ENTER_FRAME, loop);
if (stageRef.contains(this))
stageRef.removeChild(this);
}
}
}
Все это приводит к следующей ошибке вывода:
Ошибка типа: ошибка № 1009: невозможно получить доступ к свойству или методу пустой ссылки на объект.
на com.gamecherry.gunslinger :: BuildingsLeft03 / loop ()
Что именно я делаю не так? Я перепробовал все, что мог придумать (я новичок в кодировании), и если я не получаю эту ошибку, то я получаю другую ошибку.
Я хотел с уважением относиться к помощи, которую я прошу, не публикуя весь мой код (достаточно хорошо, чтобы вы все попробовали и помогли, не читая три страницы моего по общему признанию любительского кода), но, возможно, блестящий больше света в моей неумелости поможет сузить проблему.
Вот мой код класса игрока:
package com.gamecherry.gunslinger
{
import flash.display.MovieClip;
import flash.display.Stage;
import com.senocular.utils.KeyObject;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class Cowboy extends MovieClip
{
private var stageRef:Stage;
private var key:KeyObject;
private var speed:Number = 0.5;
private var vx:Number = 0;
private var vy:Number = 0;
private var friction:Number = 0.93;
private var maxSpeed:Number = 2;
private var fireTimer:Timer;
private var canFire:Boolean = true;
public function Cowboy(stageRef:Stage)
{
this.stageRef = stageRef;
key = new KeyObject(stageRef);
fireTimer = new Timer(300, 1);
fireTimer.addEventListener(TimerEvent.TIMER, fireTimerHandler, false, 0, true);
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
}
public function loop(e:Event) : void
{
if (key.isDown(Keyboard.SPACE))
fireBullet();
if (key.isDown(Keyboard.LEFT))
vx -= speed;
else if (key.isDown(Keyboard.RIGHT))
vx += speed;
else
vx *= friction;
if (key.isDown(Keyboard.UP))
vy -= speed;
else if (key.isDown(Keyboard.DOWN))
vy += speed;
else
vy *= friction;
if (key.isDown(Keyboard.SPACE) && key.isDown(Keyboard.LEFT))
fireBullet();
x += vx;
y += vy;
//rotation = vx * 12;
if (vx > maxSpeed)
vx = maxSpeed;
else if (vx < -maxSpeed)
vx = -maxSpeed;
if (vy > maxSpeed)
vy = maxSpeed;
else if (vy < -maxSpeed)
vy = -maxSpeed;
//scaleX = (maxSpeed - Math.abs(vx)) / (maxSpeed * 4) + 0.75;
//If Cowboy touches edge of screen - he bounces back
if (x > stageRef.stageWidth)
{
x = stageRef.stageWidth;
vx = -vx;
}
else if (x < 0)
{
x = 0;
vx = -vx
}
if (y > stageRef.stageHeight)
{
x = stageRef.stageHeight;
vy = -vy;
}
else if (y < 0)
{
y = 0;
vy = -vy
}
}
private function fireBullet() : void
{
if (canFire)
{
stageRef.addChild(new PlayerBullet(stageRef, x - 10 + vx, y - 10, vx, vy));
canFire = false;
fireTimer.start();
}
}
private function fireTimerHandler(e: TimerEvent) : void
{
canFire = true;
}
}
}
Вот мой код ObjectPlacer:
package com.gamecherry.gunslinger
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class ObjectPlacer extends MovieClip
{
private var Build01Timer:Timer;
private var Build02Timer:Timer;
private var CactiSet01Timer:Timer;
private var build01Place:Boolean = false;// if true - addChild starts at first frame
private var build02Place:Boolean = false;
private var cactiSet01Place:Boolean = false;
private var stageRef:Stage;
private var target:Cowboy;
public function ObjectPlacer(stageRef:Stage)
{
this.stageRef = stageRef;
var Build01Timer = new Timer(1000, 1);
var Build02Timer = new Timer(25000, 1);
var CactiSet01Timer = new Timer(0, 1);
Build01Timer.addEventListener(TimerEvent.TIMER, build01TimerHandler, false, 0, true);
Build02Timer.addEventListener(TimerEvent.TIMER, build02TimerHandler, false, 0, true);
CactiSet01Timer.addEventListener(TimerEvent.TIMER, cactiSet01TimerHandler, false, 0, true);
addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
Build01Timer.start();
Build02Timer.start();
CactiSet01Timer.start();
}
public function loop(e:Event): void
{
BuildSet01();
BuildSet02();
CactiSet01();
}
private function BuildSet01(): void
{
if (build01Place)
{
var Buildings01Right:BuildingsLeft = new BuildingsLeft(stage, 720, -624);
Buildings01Right.scaleX = -1;
stageRef.addChildAt((Buildings01Right), 2);
var target:Cowboy = new Cowboy(stage);
var Buildings03Left:BuildingsLeft03 = new BuildingsLeft03(stage, 0, -720, target);
stageRef.addChildAt((Buildings03Left), 2);
build01Place = false;
}
}
private function BuildSet02(): void
{
if (build02Place)
{
var Buildings04Left:BuildingsLeft04 = new BuildingsLeft04(stage, 0, -800);
stageRef.addChildAt((Buildings04Left), 2);
build02Place = false;
}
}
private function CactiSet01(): void
{
if (cactiSet01Place)
{
var cactus01:GScactus01 = new GScactus01(stage, 0, 300);
stageRef.addChildAt((cactus01), 2);
var cactus01b:GScactus01 = new GScactus01(stage, 190, 50);
stageRef.addChildAt((cactus01b), 2);
var cactus01c:GScactus01 = new GScactus01(stage, 660, -40);
stageRef.addChildAt((cactus01c), 2);
cactus01c.scaleX = -1;
var cactus01d:GScactus01 = new GScactus01(stage, 710, 340);
stageRef.addChildAt((cactus01d), 2);
cactus01d.scaleX = -1;
var cactus02:GScactus02 = new GScactus02(stage, 420, -50);
stageRef.addChildAt((cactus02), 2);
var cactus02b:GScactus02 = new GScactus02(stage, 600, 180);
stageRef.addChildAt((cactus02b), 2);
var cactus02c:GScactus02 = new GScactus02(stage, 300, 240);
stageRef.addChildAt((cactus02c), 2);
var cactus03:GScactus03 = new GScactus03(stage, 540, 100);
stageRef.addChildAt((cactus03), 2);
var cactus03b:GScactus03 = new GScactus03(stage, 30, 5);
stageRef.addChildAt((cactus03b), 2);
cactus03b.scaleX = -1;
var cactus03c:GScactus03 = new GScactus03(stage, 520, 420);
stageRef.addChildAt((cactus03c), 2);
cactiSet01Place = false;
}
}
private function build01TimerHandler(e: TimerEvent) : void
{
build01Place = true;
}
private function build02TimerHandler(e: TimerEvent) : void
{
build02Place = true;
}
private function cactiSet01TimerHandler(e: TimerEvent) : void
{
cactiSet01Place = true;
}
private function removeSelf() : void
{
removeEventListener(Event.ENTER_FRAME, loop);
if (stageRef.contains(this))
stageRef.removeChild(this);
}
}
}
Очевидно, что есть больше файлов ActionScript, которые взаимодействуют с этими файлами, но они должны быть единственными, на которые повлиял "hitTest"