Skip to content

Instantly share code, notes, and snippets.

@AGulev
Last active August 29, 2015 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AGulev/6dc8bc7d90f9ebf8999d to your computer and use it in GitHub Desktop.
Save AGulev/6dc8bc7d90f9ebf8999d to your computer and use it in GitHub Desktop.
HaxeFlixel state в котором реализовано простое рисование с физикой. Русские комментарии. http://agulev.com/risovanie-s-fizikoj-na-haxeflixel/
import flixel.addons.nape.FlxNapeSprite;
import flixel.addons.nape.FlxNapeState;
import flixel.FlxCamera;
import flixel.FlxG;
import flixel.ui.FlxButton;
import flixel.util.FlxColor;
import flixel.util.FlxMath;
import flixel.util.FlxPoint;
import flixel.util.FlxSpriteUtil;
import Math;
import nape.constraint.MotorJoint;
import nape.constraint.PivotJoint;
import nape.geom.Vec2;
import nape.phys.Body;
import nape.phys.BodyType;
import nape.phys.Material;
import nape.shape.Polygon;
class DrawState extends FlxNapeState
{
var _canvas:FlxNapeSprite;
var _distance:Float;
var _angle:Float;
var _startPoint:FlxPoint;
var _circles:Array<FlxNapeSprite>;
static var MINIMUM_LINE_LENGHT:Float = 10;
override public function create():Void
{
super.create();
//Создаем спрайт, в котором будем рисовать
_canvas = new FlxNapeSprite();
// Задаем ему размеры равные размеру экрана
_canvas.makeGraphic(FlxG.width, FlxG.height, FlxColor.TRANSPARENT);
// выставляем точку привязки в 0,0
_canvas.origin.set(0, 0);
//добавляем на сцену
add(_canvas);
//создаем физическое тело
var body = new Body(BodyType.KINEMATIC);
//Добавляем физическое тело к нашему спрайту
_canvas.addPremadeBody(body);
_circles = new Array<FlxNapeSprite>();
_startPoint = new FlxPoint();
FlxG.mouse.useSystemCursor = true;
createUI();
}
function rainOfCircles()
{
if (FlxNapeState.space.gravity.y != 500)
FlxNapeState.space.gravity.setxy(0, 500);
var circle:FlxNapeSprite;
var RADIUS:Float = 10;
for (i in 0...30)
{
circle = new FlxNapeSprite(i * RADIUS*2 + RADIUS, 0);
circle.createCircularBody(RADIUS);
add(circle);
_circles.push(circle);
}
}
override public function update():Void
{
super.update();
//если кнопка была только что нажата то...
if (FlxG.mouse.justPressed)
{
//копируем координаты нажатия
_startPoint.copyFrom(FlxG.mouse);
return;
}
//проверяем нажата ли кнопка мыши
if (FlxG.mouse.pressed)
{
// считаем растояние от места нажатия
_distance = FlxMath.getDistance(_startPoint, FlxG.mouse);
//отсекаем незначительные движения мыши проверяя растояния от точки нажатия
if(_distance > MINIMUM_LINE_LENGHT)
{
//рисуем линию
FlxSpriteUtil.drawLine(_canvas, _startPoint.x, _startPoint.y, FlxG.mouse.x, FlxG.mouse.y, { thickness: 4, color: FlxColor.RED });
//создаем физический прямоугольник
var shape:Polygon = new Polygon(Polygon.rect(0, 0, _distance, 1 ));
//высчитываем угол поворота прямоугольника
_angle = Math.atan2(FlxG.mouse.y - _startPoint.y, FlxG.mouse.x - _startPoint.x);
shape.rotate( _angle);
//устанавливаем необходимые координаты
shape.translate(Vec2.weak(_startPoint.x, _startPoint.y));
//добавляем наш прямоугольник к физическому телу в котором мы рисуем
_canvas.body.shapes.add(shape);
// запоминаем последние координаты отрисовки, что бы следующий прямоугольник рисовать уже в нужном месте
_startPoint.copyFrom(FlxG.mouse);
}
}
for (circle in _circles)
{
if (!circle.isOnScreen(FlxG.camera))
{
//удаляем круги вылетевшие за экран
_circles.remove(circle);
circle.destroy();
}
}
}
private function reset():Void
{
FlxG.resetState();
}
function napeDebug()
{
napeDebugEnabled = !napeDebugEnabled;
}
function createUI()
{
var btn:FlxButton = new FlxButton(0, 0, "Reset", reset);
add(btn);
var btn:FlxButton = new FlxButton(btn.x + btn.width + 10, 0, "Nape Debug", napeDebug);
add(btn);
btn = new FlxButton(btn.x + btn.width + 10, 0, "Create Circles", rainOfCircles);
add(btn);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment