From 7f1140f997040e5ca213d8731e0d886ea294d51b Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Mon, 28 Mar 2022 21:04:17 +0300 Subject: [PATCH] new life 2.0 --- .editorconfig | 23 + LICENSE | 21 +- README.md | 11 +- game.js | 21 - index.html | 17 - requirements-dev.txt | 1 + screenshot.png | Bin 160889 -> 0 bytes src/game.js | 21 + {img => src/img}/brick.png | Bin {img => src/img}/ground.png | Bin {img => src/img}/sky.png | Bin src/index.html | 18 + keyhandler.js => src/keyhandler.js | 20 +- raycast.js => src/raycast.js | 698 ++++++++++++++--------------- texture.js => src/texture.js | 126 +++--- 15 files changed, 507 insertions(+), 470 deletions(-) create mode 100644 .editorconfig delete mode 100644 game.js delete mode 100644 index.html create mode 100644 requirements-dev.txt delete mode 100644 screenshot.png create mode 100644 src/game.js rename {img => src/img}/brick.png (100%) rename {img => src/img}/ground.png (100%) rename {img => src/img}/sky.png (100%) create mode 100644 src/index.html rename keyhandler.js => src/keyhandler.js (78%) rename raycast.js => src/raycast.js (91%) rename texture.js => src/texture.js (90%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6d40c2c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.py] +indent_style = space +indent_size = 4 + +[{*.html,*.css,*.json}] +indent_style = tab +indent_size = 4 + +[humans.txt] +indent_style = tab +indent_size = 2 + +[*.js] +indent_style = space +indent_size = 2 diff --git a/LICENSE b/LICENSE index d072510..e347384 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,22 @@ +MIT License + Copyright 2022 Paul Saikko +Copyright 2022 Alexander Popov -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/README.md b/README.md index 034a8f9..2a97d50 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ -# raycast -A small raycaster graphics engine in javascript with html 5 canvas. +# JSRay +A Small Raycaster Graphics Engine in JavaScript with HTML5 ``. -Code mostly follows [this C++ raycaster tutorial](http://lodev.org/cgtutor/raycasting.html) - -Live at [github.io](http://psaikko.github.io/raycast/) - -![screenshot](https://raw.githubusercontent.com/psaikko/raycast/master/screenshot.png) +## Original author +Paul Saikko - [Github](https://github.com/psaikko/raycast) diff --git a/game.js b/game.js deleted file mode 100644 index d6f5160..0000000 --- a/game.js +++ /dev/null @@ -1,21 +0,0 @@ -var raycast = raycast || {}; - -window.requestAnimFrame = (function(){ - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback, element){ - window.setTimeout(callback, 1000 / 60); - }; -})(); - -function start() { - document.onkeyup = raycast.keyhandler.onKeyup; - document.onkeydown = raycast.keyhandler.onKeydown; - var textureFiles = ["img/brick.png", "img/ground.png", "img/sky.png"]; - raycast.texture.initiateLoad(textureFiles, raycast.engine.start); -}; - -window.onload = start; \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 9881628..0000000 --- a/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -
- -
- - - - - - - diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..70f0a51 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1 @@ +editorconfig-checker==2.4.0 diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index 790900d13fc5e7b3eeddfe3d7cdbaf21bf23bdd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160889 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