Last active
August 29, 2015 14:14
-
-
Save AGulev/6dc8bc7d90f9ebf8999d to your computer and use it in GitHub Desktop.
HaxeFlixel state в котором реализовано простое рисование с физикой. Русские комментарии. http://agulev.com/risovanie-s-fizikoj-na-haxeflixel/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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