#actionscript-3 #flash
#actionscript-3 #вспышка
Вопрос:
Я совсем новичок в actionscript и собирал небольшую тестовую игру, чтобы как-то привыкнуть к языку, промокнуть ноги. Предпосылка игры довольно средняя, у меня есть персонаж, который может двигаться в 8 направлениях, может подобрать несколько случайно расположенных ключей и открыть дверь, когда у него есть ключ.
Проблема заключается в том, чтобы поиграть с пулевой стрельбой. Я не очень разбираюсь в тригонометрии, поэтому при нажатии клавиши я просто использую свойство .rotate для поворота проигрывателя. Я передаю целое число .rotate в свой класс bullet и использую его, чтобы указать, в каком направлении должна двигаться пуля. Он отлично работает для движений вверх, вниз и вправо, но когда персонаж смотрит влево, пуля создается, но не имеет никакой скорости, и, хоть убей, я не могу понять, где ошибка в коде.
Если бы кто-нибудь мог просмотреть мой код и помочь мне, я был бы очень признателен. Я уверен, что это что-то простое, чего мне просто не хватает. Я знаю, что это немного неаккуратно, поэтому, если есть какие-либо другие советы, которые вы хотите передать новичку, пожалуйста, не стесняйтесь!!
Большое вам спасибо, ребята.
Основной класс
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.text.TextField;
public class Main extends MovieClip
{
var player:Player;
var inventory:Inventory;
var invArray:Array = new Array();
var key:_Key;
var vx:int;
var maxSpeed:int;
var key_Up:Boolean;
var key_Down:Boolean;
var key_Left:Boolean;
var key_Right:Boolean;
var maxKey:int;
var keyCount:TextField;
var keysUp:int;
var door:Door;
var doorOpen:Boolean;
var wall1:Wall;
var wall2:Wall;
var wallCollide:Boolean;
var bulletTime:int;
var bulletLimit:int;
var bulletShoot:Boolean;
static var playerRotation:int;
public function Main()
{
init();
}
public function init():void
{
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
initPlayer();
initVariables();
initInventory();
initItems();
}
public function gameLoop(e:Event):void
{
movePlayer();
collisionDetection();
bullet();
}
public function keyDownHandler(e:KeyboardEvent):void
{
switch (e.keyCode)
{
case 37 :
key_Left = true;
break;
case 38 :
key_Up = true;
break;
case 39 :
key_Right = true;
break;
case 40 :
key_Down = true;
break;
case 32:
if(bulletShoot)
{
bulletShoot = false;
var newBullet:Bullet = new Bullet(player.rotation);
newBullet.x = player.x;
newBullet.y = player.y;
addChild(newBullet);
}
}
}
public function keyUpHandler(e:KeyboardEvent):void
{
switch (e.keyCode)
{
case 37 :
key_Left = false;
break;
case 38 :
key_Up = false;
break;
case 39 :
key_Right = false;
break;
case 40 :
key_Down = false;
break;
}
}
public function movePlayer():void
{
if (key_Left amp;amp; !key_Right)
{
player.x -= maxSpeed;
player.rotation = 270;
}
if (key_Right amp;amp; !key_Left)
{
player.x = maxSpeed;
player.rotation = 90;
}
if (key_Up amp;amp; !key_Down)
{
player.y -= maxSpeed;
player.rotation = 0;
}
if (key_Down amp;amp; !key_Up)
{
player.y = maxSpeed;
player.rotation = 180;
}
/*if ( key_Left amp;amp; key_Up amp;amp; !key_Right amp;amp; !key_Down )
{
player.rotation = 315;
}
if ( key_Right amp;amp; key_Up amp;amp; !key_Left amp;amp; !key_Down )
{
player.rotation = 45;
}
if ( key_Left amp;amp; key_Down amp;amp; !key_Right amp;amp; !key_Up )
{
player.rotation = 225;
}
if ( key_Right amp;amp; key_Down amp;amp; !key_Left amp;amp; !key_Up )
{
player.rotation = 135;
}*/
}
public function initPlayer():void
{
player = new Player();
player.x = stage.stageWidth * .5;
player.y = stage.stageHeight * .5;
stage.addChild(player);
}
public function initVariables():void
{
vx = 0;
maxSpeed = 4;
key_Up = false;
key_Down = false;
key_Left = false;
key_Right = false;
maxKey = 3;
keysUp = 0;
doorOpen = false;
wallCollide = false;
bulletTime = 0;
bulletLimit = 12;
bulletShoot = true ;
}
public function collisionDetection():void
{
for (var i:int=0; i < invArray.length; i )
{
key = invArray[i];
if (player.hitTestObject(key))
{
stage.removeChild(key);
invArray.splice(i, 1);
keysUp ;
//trace(keysUp);
i--;
keyCount.text = String(keysUp);
break;
}
}
if (player.hitTestPoint(door.x,door.y 25,true) amp;amp; (keysUp > 0) amp;amp; ! doorOpen)
{
door.gotoAndStop(2);
keysUp--;
invArray.pop();
trace(keysUp);
keyCount.text = String(keysUp);
doorOpen = true;
}
if (player.hitTestObject(door) amp;amp; (keysUp == 0) amp;amp; ! doorOpen)
{
wallCollide = true;
}
if (player.hitTestObject(wall1))
{
wallCollide = true;
}
if (player.hitTestObject(wall2))
{
wallCollide = true;
}
if (wallCollide == true)
{
player.y = 4;
wallCollide = false;
}
}
public function initInventory():void
{
inventory = new Inventory();
inventory.x = stage.stageWidth * .15;
inventory.y = stage.stageHeight * .90;
stage.addChild(inventory);
keyCount = new TextField();
stage.addChild(keyCount);
keyCount.x = inventory.x - 8;
keyCount.y = inventory.y 3;
keyCount.text = String(keysUp);
//keyCount.border = true;
keyCount.width = 20;
keyCount.height = 20;
}
public function initItems():void
{
while (invArray.length < maxKey)
{
key = new _Key ;
key.x = Math.random() * 550;
key.y = Math.random() * 300;
stage.addChild(key);
invArray.push(key);
}
door = new Door();
door.x = 250;
door.y = 25;
wall1 = new Wall();
stage.addChild(wall1);
wall1.x = door.x - 175;
wall1.y = door.y;
wall2 = new Wall();
stage.addChild(wall2);
wall2.x = door.x 175;
wall2.y = door.y;
stage.addChild(door);
}
public function bullet():void
{
if (bulletTime < bulletLimit)
{
bulletTime ;
} else
{
bulletShoot = true;
bulletTime = 0;
}
}
}
}
Класс пули
package {
import flash.display.MovieClip;
import flash.events.Event;
public class Bullet extends MovieClip {
public var _root:Object;
public var speed:int = 10;
public var bulletRotation:int;
public function Bullet(pRotation:int) {
addEventListener(Event.ADDED, beginClass);
addEventListener(Event.ENTER_FRAME, eFrame);
bulletRotation = pRotation;
}
private function beginClass(e:Event):void
{
_root = MovieClip(root);
}
private function eFrame(e:Event):void
{
if (bulletRotation == 0)
{
this.y -= speed;
}
else if (bulletRotation == 90)
{
this.x = speed;
}
else if(bulletRotation == 270)
{
this.x -= speed;
}
else if(bulletRotation == 180)
{
this.y = speed;
}
if(this.y < -1 * this.height)
{
removeEventListener(Event.ENTER_FRAME, eFrame);
_root.removeChild(this);
}
if(this.x < -1 * this.width)
{
removeEventListener(Event.ENTER_FRAME, eFrame);
_root.removeChild(this);
}
}
}
}
Комментарии:
1. Для решения подобных проблем я настоятельно рекомендую вам поставить точку останова на строке, в которой вы добавляете маркер в сцену, и изучить переменные.
Ответ №1:
В классе Bullet измените 270 на -90 в строке 38:
else if(bulletRotation == -90)
{
this.x -= speed;
}
Комментарии:
1. Большое вам спасибо за ответ, я не выдержал, посмотрел несколько тригонометрических задач и решил их таким образом, но здорово иметь такое понимание на будущее, спасибо, ребята!!