2013-06-14 4 views
0

Я разрабатываю простую флеш-игру, в которой мой игрок выталкивает бочки с лодки, чтобы выиграть игру. Я кодировал для движения и определял большинство объектов, но когда я добавляю свойства столкновения, я теряю способность перемещать плеер с помощью клавиатуры. Вот код:Как нажимать объект в Actionscript3

package 
{ 
import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 
import flash.ui.Keyboard; 
import flash.events.Event; 

public class Main_Character extends MovieClip 
{ 
    var vx:int; 
    var vy:int; 

    public function Main_Character() 
    { 
     init(); 
    } 
    function init():void{ 
     vx = 0; 
     vy = 0; 

     stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 
     addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    } 
    function onKeyDown(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT) 
     { 
      vx = -5; 
     } 
     else if (event.keyCode == Keyboard.RIGHT) 
     { 
      vx = 5; 
     } 
     else if (event.keyCode == Keyboard.UP) 
     { 
      vy = -5; 
     } 
     else if (event.keyCode == Keyboard.DOWN) 
     { 
      vy = 5; 
     } 
    } 
    function onKeyUp(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT || 
      event.keyCode == Keyboard.RIGHT) 
      { 
       vx = 0; 
      } 
      if (event.keyCode == Keyboard.DOWN || 
       event.keyCode == Keyboard.UP) 
      { 
       vy = 0; 
      } 
    } 
    function onEnterFrame(event:Event):void 
    { 
     player1.x += vx; 
     player1.y += vy; 

     if (player1.x > 530) 
     { 
      player1.x = 530; 
     } 
     else if (player1.x < 0) 
     { 
      player1.x = 0; 
     } 
     else if (player1.y < 0) 
     { 
      player1.y = 0; 
     } 
     else if (player1.y > 515) 
     { 
      player1.y = 515; 
     } 
     else if (player1.hitTestObject(water1)) 
     { 
      player1.x -= vx; 
      player1.y -= vy; 
     } 
      Collision.block(barrel1, player1); 
    } 
} 

}

+0

Вам необходимо опубликовать код вашего класса 'Collision' или, по крайней мере, функции' block'. –

+0

Вот моя ошибка: C: \ Users \ Carl \ Desktop \ proejct \ Main_Character.as, Строка 83 \t 1061: Позвоните в возможно неопределенный блок метода через ссылку со статическим типом класса. Как это исправлено? Как создать класс столкновений? Я думаю, что это может быть проблемой. –

ответ

1

Так что причина, вы получаете ошибку possibly undefined method потому, что ваш Collision класс, скорее всего, не существует. Я думаю, что нашел сайт, на котором вы скопировали код, и они не включили свой код класса Collision, поэтому вам придется сделать свой собственный.

Но для базового понимания того, как это сделать, вы можете сначала добавить простые функции коллизии в свой класс player. Вы можете сделать это, изменив обработчики ключевых событий и функцию onEnterFrame, создав другую переменную в вашем классе player, скажем, var speed:int = 5 и измените обработчик onKeyDown, чтобы использовать это вместо 5 для вашей скорости движения.

Затем в вашем onEnterFrame обработчике вам нужно заменить строку Collision.block(barrel1, player1); следующим:

// see if player hit a barrel. If so, decrease movement speed slightly. 
else if (player.hitTestObject(barrel1)) { 
    speed = 3; 
} 
else { 
    speed = 5; 
} 

Но это само по себе не вполне достаточно. После этого вам нужно будет убедиться, что ваш класс barrel может быть перемещен игроком. Вероятно, вы должны сделать переменную public в своем классе, такую ​​как public var barrelSpeed:int = 0, а также public var barrelDirection:int = 1 (для управления направлением движения ствола).

Таким образом, вы можете изменить переменные barrelSpeed и barrelDirection всякий раз, когда игрок попадает в бочку.




Итак, подведем итог, ваш player.as должен иметь следующий раз перед его конструктор:

var speed:int = 5; 

И ваш barrel.as должен иметь следующие до его конструктора :

public var barrelSpeed:int = 0; 
public var barrelDirection:int = 1; 

Изменить 'onEnterFrame функцию s следующим образом:

this.x += (barrelSpeed * barrelDirection); 
// for realism, you can also tween barrel's y value to simulate a slight bounce. 

Тогда ваши player.as должны иметь следующее в конце своей onEnterFrame функции:

// see if player hit a barrel. If so, decrease movement speed slightly. 
else if (player.hitTestObject(barrel1)) { 
    speed = 3; 
    barrel1.barrelSpeed = 3; 

    // if vx is positive, barrelDirection is positive; otherwise it's negative. 
    barrel1.barrelDirection = (this.vx > 0) ? 1 : -1; 
} 
else { 
    speed = 5; 
    barrel1.barrelSpeed = 0; 
} 

И ваш player' The barrel s onKeyDown Функция должна выглядеть так:

function onKeyDown(event:KeyboardEvent):void 
{ 
    if (event.keyCode == Keyboard.LEFT) 
    { 
     vx = -(speed); 
    } 
    else if (event.keyCode == Keyboard.RIGHT) 
    { 
     vx = (speed); 
    } 
    else if (event.keyCode == Keyboard.UP) 
    { 
     vy = -5; 
    } 
    else if (event.keyCode == Keyboard.DOWN) 
    { 
     vy = 5; 
    } 
} 

Теперь вам нужно будет изменить несколько вещей, чтобы работать с несколькими баррелями.Для большой учебник по этому поводу, вот код, который показывает в основном то же самое, за исключением башен, атакующих врагов:

http://www.flashgametuts.com/tutorials/as3/how-to-create-a-tower-defense-game-in-as3-part-4/

По сути, вы хотите создать массив в вашем main.fla, содержащий все бочки и проведите через них, чтобы увидеть, столкнулись ли вы с ними. Я рекомендую начать с того, чтобы получить один бочонок и работать оттуда.

Удачи, и дайте мне знать, если это сработает.