![]() |
|
||||||||||
|
|||||
|
Регистрация: Jan 2011
Сообщений: 247
|
Решил попробовать сделать игру с фильма "Трон".
Кто не смотрел или не понял о чем именно речь: 1.На поле игры существует постоянно движущий объект который оставляет за собой след. 2.Суть игры заключается в том чтоб не пересечь свой\чужой след ,также границы игры. вот код программы что я написал: package { import flash.display.*; import flash.events.*; import flash.ui.Keyboard; public class Main extends Sprite { private const m:Number = 200; private const fv:Number = 0.1; private const dv:Number = fv / 0.1; private var dr:Number = 0; private var ft:Number = 0; private var game:Boolean; private var fl:Boolean = false; private var fr:Boolean = false; private var f:Shape; public function Main() { graphics.beginFill(0x0000ff, 0.1); graphics.drawRect(0, 0, 400,400); graphics.endFill(); f = new Shape(); f.graphics.beginFill(0x805000); f.graphics.drawCircle(0, 0, 1.5); f.graphics.endFill(); f.x = m; f.y = m; addChild(f); stage.addEventListener(Event.ACTIVATE, start); } private function start(e:Event):void { stage.removeEventListener(Event.ACTIVATE, start); graphics.lineStyle(1, 0x000000, 0.5); graphics.moveTo(f.x, f.y);//начальная точка stage.addEventListener(KeyboardEvent.KEY_DOWN, kd); stage.addEventListener(KeyboardEvent.KEY_UP, ku); stage.addEventListener(Event.ENTER_FRAME, tick); } private function kd(e:KeyboardEvent):void { switch (e.keyCode) { case Keyboard.LEFT: case 'A': fl = true; break; case Keyboard.RIGHT: case 'D': fr = true; break; } } private function ku(e:KeyboardEvent):void { switch (e.keyCode) { case Keyboard.LEFT: case 'A': fl = false; break; case Keyboard.RIGHT: case 'D': fr = false; break; } } private function tick(e:Event):void { player1(); f.x = m - dr * ft ; f.y = m - dr ; //<-- что мне сюда добавить чтоб по y крутился ? dr += dv; graphics.lineTo(f.x, f.y);//"след" if (game = false) { stage.removeEventListener(Event.ENTER_FRAME, tick); stage.removeEventListener(KeyboardEvent.KEY_DOWN, kd); stage.removeEventListener(KeyboardEvent.KEY_UP, ku); fl = fr = false; } } private function player1():void { if (fl && !fr)//если влево ft += fv; else if (fr && !fl)//если вправо ft -= fv; } } } 1.Как по Y заставить крутится точку. 2.Как сделать проверку на "след" от точки. |
|
|||||
|
Игру не видел и не играл.
1) Но что вы подразумеваете под "крутился по Y" ? Поворачивался? Если да, то есть свойство - rotation. 2) Если след будет таким тонким, то придётся наверное через векторы просчитывать. А если бы был, по толще, то можно и через hitTest, hitTestPoint попробовать. |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 247
|
Переделал весь код:
package { import flash.display.*; import flash.events.*; import flash.geom.*; public class Main extends Sprite { private var player:Player; private var inputArray:Array; private var drawing_area:Bitmap; private var trail_image:Shape; private var game:Boolean; private var checkA:Bitmap; public function Main() { initInput(); initGame(); } private function initInput() : void { inputArray = new Array(); for(var i:uint =0;i < 256; i++) { inputArray.push(false); } stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp); this.addEventListener(Event.ENTER_FRAME, updateGame); } public function onKeyDown(e:KeyboardEvent) : void { inputArray[e.keyCode] = true; } public function onKeyUp(e:KeyboardEvent) : void { inputArray[e.keyCode] = false; } public function updateGame(e:Event) : void { if(inputArray[37]) { player.rotation -= 3; } if(inputArray[39]) { player.rotation += 3; } if( game = true ) { player.move(); player.speed = Math.abs(player.speed); trail_image.x = player.x; trail_image.y = player.y; drawing_area.bitmapData.draw(trail_image, trail_image.transform.matrix); } if (checkHit() == true){ trace('Готово'); } } private function initGame() : void { player = new Player(); player.speed = 2; drawing_area = new Bitmap(new BitmapData(400, 400, false)); checkA = new Bitmap(); addChild(drawing_area); trail_image = new Shape(); trail_image.graphics.beginFill(0x00FF00); trail_image.graphics.drawCircle(0, 0, 2); trail_image.graphics.endFill(); player.x = 400/2; player.y = 400/2; } private function checkHit():Boolean { var check:Boolean; check = trail_image.hitTestPoint(player.x, player.y, true); if (check == true) { trace(check); return true; } return false; } } } Посмотрите на мой hitTestPoint в конце исходника, не могу понять почему не реагирует на "след"... |
|
|||||
|
Не могу понять в вашем коде некоторые вещи, вы проверяете на столкновения ни след, а какой-то кружочек. Покажите класс Player, что бы можно было запустить всё это дело, и увидеть воочию.
И некоторые замечания и советы: вы делаете присваивание, а не проверку на true/false так можно не писать, то же самое будет и так Последний раз редактировалось samana; 05.02.2011 в 00:28. |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 247
|
Цитата:
![]() А вот класс Player: package { import flash.display.*; public class Player extends Sprite { public var vx:Number=0; public var vy:Number=0; public var speed:Number = 1; public function Player() {} public function updateVelocities():void{ vx = Math.sin(Math.PI -this.rotation*0.0174532925); vy = Math.cos(Math.PI -this.rotation*0.0174532925); } public function move():void{ updateVelocities(); x -= (vx*speed); y -= (vy*speed); } } } в противном случае двигается вся сцена ,знаю что можно сделать легче ну пока что "как-то так" =)За советы спасибо, действительно недоглядел... |
|
|||||
|
Вы ведь отрисовываете битмапу, а проверяете столкновения со спрайтом. Тогда вам нужно либо рисовать путь с помощью graphics, либо проверять пиксел бимтапдаты, и если он не белого цвета, то столкновение произошло.
|
|
|||||
|
Регистрация: Jan 2011
Сообщений: 247
|
Да это один из минусов создания класса Player(
Если вы имеете ввиду : то я так делал в прошлом примере,и просто не представляю как на это сделать проверку... Цитата:
Но по примерам я понял что он мне не подходит т.к. размер следа через битмап я вовсе не задаю... P.S.Не когда раньше с графикой так не сталкивался,и решил попробовать, но что-то не как не выходит... |
|
|||||
|
По поводу первого способа с помощью graphics. Я набросал быстрый пример. Тут игрок просто двигается к курсору мышки, рисует за собой путь, и если сталкивается со своим путем то игрок становится красным. Посмотрите, может это поможет вам.
Класс Main: package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.GlowFilter; /** * ... * @author Samana */ public class Main extends Sprite { private var player:Player; private var path:Sprite; public function Main():void { player = new Player(); addChild(player); //..................... path = new Sprite(); path.graphics.lineStyle(3, 0x008000); path.graphics.moveTo(player.x, player.y); addChild(path); //..................... stage.addEventListener(Event.ENTER_FRAME,enter_frame) } private function enter_frame(e:Event):void { player.move(mouseX, mouseY); if (path.hitTestPoint(player.x, player.y, true)) { player.filters = [new GlowFilter(0xFF0000,1,10,10,50,3)] } else { player.filters = [] } drawPath(); } private function drawPath():void { path.graphics.lineTo(player.x, player.y); } } } package { import flash.display.Sprite; /** * ... * @author Samana */ public class Player extends Sprite { public function Player() { drawPlayer() } private function drawPlayer():void { graphics.beginFill(0xFF8000); graphics.drawCircle(0, 0, 2); graphics.endFill() } public function move(targetX:Number,targetY:Number):void { var dx:Number = targetX - x; var dy:Number = targetY - y; var ang:Number = Math.atan2(dy, dx); x += Math.cos(ang) * 3; y += Math.sin(ang) * 3; } } } |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 247
|
Цитата:
![]() P.S.Уже практически доделал игру на несколько игроков ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|