diff options
author | Fbenas <philbeansburton@gmail.com> | 2020-09-20 22:08:03 +0100 |
---|---|---|
committer | Fbenas <philbeansburton@gmail.com> | 2020-09-20 22:08:03 +0100 |
commit | 9be73c2d0f21a539bc46974139e8c36c12845ca0 (patch) | |
tree | 3442d2254797983e7e0294c9aee00e90aa643109 /resources |
Initial commit
Diffstat (limited to 'resources')
-rw-r--r-- | resources/js/app.js | 13 | ||||
-rw-r--r-- | resources/js/bootstrap.js | 28 | ||||
-rw-r--r-- | resources/js/component.js | 80 | ||||
-rw-r--r-- | resources/js/gameArea.js | 20 | ||||
-rw-r--r-- | resources/js/scene.js | 70 | ||||
-rw-r--r-- | resources/lang/en/auth.php | 19 | ||||
-rw-r--r-- | resources/lang/en/pagination.php | 19 | ||||
-rw-r--r-- | resources/lang/en/passwords.php | 22 | ||||
-rw-r--r-- | resources/lang/en/validation.php | 151 | ||||
-rw-r--r-- | resources/sass/app.scss | 9 | ||||
-rw-r--r-- | resources/views/welcome.blade.php | 19 |
11 files changed, 450 insertions, 0 deletions
diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..103a32f --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1,13 @@ +let scene = new Scene(2, 500); + +function stop() { + scene.stop(); +} + +function start() { + scene.start(); +} + +function reset() { + scene.reset(); +} diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..6922577 --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,28 @@ +window._ = require('lodash'); + +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +window.axios = require('axios'); + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// window.Pusher = require('pusher-js'); + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: process.env.MIX_PUSHER_APP_KEY, +// cluster: process.env.MIX_PUSHER_APP_CLUSTER, +// forceTLS: true +// }); diff --git a/resources/js/component.js b/resources/js/component.js new file mode 100644 index 0000000..6d74e93 --- /dev/null +++ b/resources/js/component.js @@ -0,0 +1,80 @@ +class Component { + + constructor(radius, color, x, y, direction) { + this.perceptionDistance = 20; + this.turnStepAmount = 5; + this.collisionTurnStepAmount = 20; + this.stepAmount = 1; + this.radius = radius; + this.x = x; + this.y = y; + this.direction = direction; + this.color = color; + } + + move(context) { + this.direction += Math.random() * (2 * this.turnStepAmount) - this.turnStepAmount + var localDirection = this.direction; + // first we need to work out if we detect any walls + var perceptionVector = this.detectionPoint(this.x, this.y, this.perceptionDistance, localDirection); + + while (perceptionVector.x < 0 || perceptionVector.y < 0 || perceptionVector.x > context.canvas.width || perceptionVector.y > context.canvas.height) { + localDirection += Math.random() * (2 * this.collisionTurnStepAmount) - this.collisionTurnStepAmount + perceptionVector = this.detectionPoint(this.x, this.y, this.perceptionDistance, localDirection); + } + + // Here we should now have a new vector that's not clipping + this.direction = localDirection; + var vector = this.detectionPoint(this.x, this.y, this.stepAmount, this.direction); + + + this.x = vector.x; + this.y = vector.y; + this.update(context); + } + + update(context) { + context.beginPath(); + context.fillStyle = "blue"; + context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI); + context.stroke(); + + context.restore(); + context.beginPath(); + this.lineToAngle(context, this.x, this.y, this.perceptionDistance, this.direction); + context.lineWidth = 1; + // context.stroke(); + + context.restore(); + } + + lineToAngle(context, x1, y1, length, angle) { + + angle *= Math.PI / 180; + + var x2 = x1 + length * Math.cos(angle), + y2 = y1 + length * Math.sin(angle); + + context.moveTo(x1, y1); + context.lineTo(x2, y2); + + return { + x: x2, + y: y2 + }; + } + + detectionPoint(x1, y1, length, angle) { + + angle *= Math.PI / 180; + + var x2 = x1 + length * Math.cos(angle), + y2 = y1 + length * Math.sin(angle); + + return { + x: x2, + y: y2 + }; + } + +} diff --git a/resources/js/gameArea.js b/resources/js/gameArea.js new file mode 100644 index 0000000..a39b0e8 --- /dev/null +++ b/resources/js/gameArea.js @@ -0,0 +1,20 @@ +class GameArea { + + constructor(canvas_width, canvas_height) { + this.canvas = document.createElement("canvas"); + this.canvas_width = canvas_width; + this.canvas_height = canvas_height; + } + + init() { + this.canvas.width = this.canvas_width; + this.canvas.height = this.canvas_height; + this.context = this.canvas.getContext("2d"); + document.getElementById('container').appendChild(this.canvas); + } + + clear() { + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + } + +} diff --git a/resources/js/scene.js b/resources/js/scene.js new file mode 100644 index 0000000..194a77b --- /dev/null +++ b/resources/js/scene.js @@ -0,0 +1,70 @@ +class Scene { + + constructor(component_size, no_of_components) { + this.component_size = component_size; + this.no_of_components = no_of_components; + this.components = new Array; + this.gameArea = {}; + this.initGameArea(); + this.initComponents(); + this.started = false; + } + + initComponents() { + for (let i = 0; i < this.no_of_components; i++) { + let new_component = new Component( + this.component_size, + "black", + Math.random() * this.gameArea.canvas.width, + Math.random() * this.gameArea.canvas.height, + Math.random() * 360 + ); + this.components.push(new_component); + } + } + + initGameArea() { + this.gameArea = new GameArea(600, 600); + this.gameArea.init() + } + + start() { + if (this.started) { + return; + } + + // Kinda annoying, setInterval is a piece of shite and is always run from global scope + // Therefore "this.update" will be undefined unless we bind it + const updateMe = this.update.bind(this); + this.interval = setInterval(updateMe, 5); + this.started = true; + } + + update() { + this.gameArea.clear(); + for (let i = 0; i < this.no_of_components; i++) { + this.components[i].move(this.gameArea.context); + } + } + + stop() { + if (!this.started) { + return; + } + + clearInterval(this.interval); + this.interval = null; + this.started = false; + } + + reset() { + if (this.started) { + this.stop(); + } + this.components = new Array; + this.initComponents(); + this.gameArea.clear(); + this.started = false; + } + +} diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php new file mode 100644 index 0000000..e5506df --- /dev/null +++ b/resources/lang/en/auth.php @@ -0,0 +1,19 @@ +<?php + +return [ + + /* + |-------------------------------------------------------------------------- + | Authentication Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used during authentication for various + | messages that we need to display to the user. You are free to modify + | these language lines according to your application's requirements. + | + */ + + 'failed' => 'These credentials do not match our records.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/resources/lang/en/pagination.php @@ -0,0 +1,19 @@ +<?php + +return [ + + /* + |-------------------------------------------------------------------------- + | Pagination Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are used by the paginator library to build + | the simple pagination links. You are free to change them to anything + | you want to customize your views to better match your application. + | + */ + + 'previous' => '« Previous', + 'next' => 'Next »', + +]; diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php new file mode 100644 index 0000000..2345a56 --- /dev/null +++ b/resources/lang/en/passwords.php @@ -0,0 +1,22 @@ +<?php + +return [ + + /* + |-------------------------------------------------------------------------- + | Password Reset Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines are the default lines which match reasons + | that are given by the password broker for a password update attempt + | has failed, such as for an invalid token or invalid new password. + | + */ + + 'reset' => 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php new file mode 100644 index 0000000..a65914f --- /dev/null +++ b/resources/lang/en/validation.php @@ -0,0 +1,151 @@ +<?php + +return [ + + /* + |-------------------------------------------------------------------------- + | Validation Language Lines + |-------------------------------------------------------------------------- + | + | The following language lines contain the default error messages used by + | the validator class. Some of these rules have multiple versions such + | as the size rules. Feel free to tweak each of these messages here. + | + */ + + 'accepted' => 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/sass/app.scss b/resources/sass/app.scss new file mode 100644 index 0000000..accadab --- /dev/null +++ b/resources/sass/app.scss @@ -0,0 +1,9 @@ +.container { + display: flex; + justify-content: center; +} + +canvas { + border:1px solid #d3d3d3; + background-color: #f1f1f1; +} diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php new file mode 100644 index 0000000..36ea65c --- /dev/null +++ b/resources/views/welcome.blade.php @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> + +<head> + <title>Laravel</title> + <link href="../css/app.css" rel="stylesheet"> +</head> + +<body> + <div class="cotnainer" id="container"> + + </div> + <script src="../js/app.js"></script> + <button type="button" onClick="start()">start</button> + <button type="button" onClick="stop()">stop</button> + <button type="button" onClick="reset()">reset</button> +</body> + +</html>
\ No newline at end of file |