diff --git a/.luxe/.luxe.versions/.luxe/entry.settings.lx.version.lx b/.luxe/.luxe.versions/.luxe/entry.settings.lx.version.lx index 82f404f..b076c10 100644 --- a/.luxe/.luxe.versions/.luxe/entry.settings.lx.version.lx +++ b/.luxe/.luxe.versions/.luxe/entry.settings.lx.version.lx @@ -1,2 +1,2 @@ -time = 1601052740 +time = 1601163648 version = 2 diff --git a/.luxe/.luxe.versions/game.wren.version.lx b/.luxe/.luxe.versions/game.wren.version.lx index a8853b8..235f402 100644 --- a/.luxe/.luxe.versions/game.wren.version.lx +++ b/.luxe/.luxe.versions/game.wren.version.lx @@ -18,21 +18,29 @@ methods = { } //game Game = { create_starfield2 = true + create_asteroids = true tick = true destroy = true + if = true lerp = true tick_camera = true app = true + tick_starfield_old = true + star = true create_starfield = true + Draw = true ready = true create_ui_text = true create_startracker = true tick_starfield = true get_axis = true + _cam_offset_y = true tick_ship = true create_ship = true + - = true + tick_startracker = true tick_starfield2 = true } //Game } //methods -time = 1601052740 +time = 1601163648 version = 1 diff --git a/.luxe/.luxe.versions/image/reticule.image.lx.version.lx b/.luxe/.luxe.versions/image/reticule.image.lx.version.lx new file mode 100644 index 0000000..846455d --- /dev/null +++ b/.luxe/.luxe.versions/image/reticule.image.lx.version.lx @@ -0,0 +1,2 @@ +time = 1601079411 +version = 8 diff --git a/.luxe/.luxe.versions/image/reticule.png.version.lx b/.luxe/.luxe.versions/image/reticule.png.version.lx new file mode 100644 index 0000000..d1d59e5 --- /dev/null +++ b/.luxe/.luxe.versions/image/reticule.png.version.lx @@ -0,0 +1,2 @@ +time = 1601079384 +version = 8 diff --git a/.luxe/.luxe.versions/material/reticule.material.lx.version.lx b/.luxe/.luxe.versions/material/reticule.material.lx.version.lx new file mode 100644 index 0000000..ce82903 --- /dev/null +++ b/.luxe/.luxe.versions/material/reticule.material.lx.version.lx @@ -0,0 +1,2 @@ +time = 1601079405 +version = 11 diff --git a/.luxe/entry.parcel.lx b/.luxe/entry.parcel.lx index 8db33ce..ae9d076 100644 --- a/.luxe/entry.parcel.lx +++ b/.luxe/entry.parcel.lx @@ -9,6 +9,7 @@ material = [ "luxe: material/sprite.solid.material.lx" "material/asteroid.material.lx" "material/laser.material.lx" + "material/reticule.material.lx" "material/ship.material.lx" "material/star.material.lx" ] //material @@ -23,6 +24,7 @@ bytes = [ "_art/atlas.ase" "_art/laser.ase" "_art/player_ship.ase" + "_art/reticule.ase" "_art/star.ase" "ideas.txt" ] //bytes @@ -176,6 +178,7 @@ image = [ "luxe: image/logo.sprite.image.lx" "image/asteroid.image.lx" "image/laser.image.lx" + "image/reticule.image.lx" "image/ship.image.lx" "image/star.image.lx" ] //image diff --git a/.luxe/image/reticule.image.lx.2ff607d1.rgba8Unorm b/.luxe/image/reticule.image.lx.2ff607d1.rgba8Unorm new file mode 100644 index 0000000..2d7bd23 Binary files /dev/null and b/.luxe/image/reticule.image.lx.2ff607d1.rgba8Unorm differ diff --git a/.luxe/luxe.strings.lx b/.luxe/luxe.strings.lx index 36fdcf2..763aac5 100644 --- a/.luxe/luxe.strings.lx +++ b/.luxe/luxe.strings.lx @@ -10,7 +10,9 @@ strings = { 942045655 = "material/ship" 3621841971 = "project.name" 3941839433 = "luxe: material_basis/sprite" + 1564981858 = "image/reticule" 772168989 = "sprite.uv" + 1809647216 = "material/reticule" 4116382270 = "engine.runtime.window.resizable" 107771801 = "sprite.color" 3791347451 = "engine.render.antialiasing" diff --git a/.luxe/luxe.strings.lx.eebe2b61 b/.luxe/luxe.strings.lx.eebe2b61 index 28efd1a..12b0de1 100644 Binary files a/.luxe/luxe.strings.lx.eebe2b61 and b/.luxe/luxe.strings.lx.eebe2b61 differ diff --git a/.luxe/material/reticule.material.lx.4b19a6bf b/.luxe/material/reticule.material.lx.4b19a6bf new file mode 100644 index 0000000..81b8a5a Binary files /dev/null and b/.luxe/material/reticule.material.lx.4b19a6bf differ diff --git a/_art/reticule.ase b/_art/reticule.ase new file mode 100644 index 0000000..8bbcac4 Binary files /dev/null and b/_art/reticule.ase differ diff --git a/game.wren b/game.wren index 651a883..affa732 100644 --- a/game.wren +++ b/game.wren @@ -1,6 +1,6 @@ import "luxe: game" for Ready import "luxe: assets" for Assets -import "luxe: input" for Input, Key +import "luxe: input" for Input, Key, MouseButton import "luxe: world" for World, Entity, Transform, Sprite, Values, Tags, Camera, Text import "luxe: render" for Material import "luxe: math" for Math @@ -21,12 +21,22 @@ class Game is Ready { // game vars _rand = Random.new() + _controls = "mouse" //"mouse" | "keyboard" | "controller" + + // controls + if(_controls == "mouse") { + _reticule = Entity.create(app.world, "reticule") + var reticule_mat = Assets.material("material/reticule") + Sprite.create(_reticule, reticule_mat, 16, 16) + Transform.create(_reticule) + Input.set_mouse_capture(true) + } // camera - _camera_scale = 1 - _cam_offset_x = (app.width / _camera_scale) - _cam_offset_y = (app.height / _camera_scale) - Camera.ortho(app.camera, 0, _cam_offset_y, _cam_offset_x, 0, -5, 5) + _camera_scale = 2 + _cam_size_x = (app.width / _camera_scale) + _cam_size_y = (app.height / _camera_scale) + Camera.ortho(app.camera, 0, _cam_size_y, _cam_size_x, 0, -10, 10) // starfield _stars = [] @@ -34,29 +44,32 @@ class Game is Ready { // player ship _input_vec = [] - _ship_rotation = 0 - _ship_speed = 40 - _ship_acceleration_x = 0 - _ship_acceleration_y = 0 - _ship_velocity_x = 0 - _ship_velocity_y = 0 - _ship_dampening = 0.85 + _ship_speed = 20 + _ship_acceleration = [0,0] + _ship_velocity = [0,0] + _ship_dampening = 0.97 // make things - create_ship() - Transform.set_pos(app.camera, Transform.get_pos_x(_ship) - _cam_offset_x / 2, Transform.get_pos_y(_ship) - _cam_offset_y / 2) - create_ui_text() create_startracker() create_starfield() - Draw.commit(_starfield_context) + create_ship() + create_asteroids() + create_ui_text() } //ready tick(delta) { tick_ship(delta) tick_camera(delta) + tick_startracker(delta) tick_starfield(delta) + + if(Input.mouse_state_down(MouseButton.left)) { + Input.set_mouse_capture(true) + } + if(Input.key_state_released(Key.escape)) { IO.shutdown() + // Input.set_mouse_capture(false) } } //tick @@ -68,7 +81,8 @@ class Game is Ready { var ship_mat = Assets.material("material/ship") Sprite.create(_ship, ship_mat, 16, 32) Transform.create(_ship) - Transform.set_pos(_ship, 0, 0) + Transform.set_pos(_ship, 0, 0, 0) + Transform.set_pos(app.camera, Transform.get_pos_x(_ship) - _cam_size_x / 2, Transform.get_pos_y(_ship) - _cam_size_y / 2) } //create_ship create_ui_text() { @@ -79,43 +93,87 @@ class Game is Ready { Text.create(_position_text, _mat_font, 32, "fonts/lato", [1,1,1,1]) } //create_ui_text + create_starfield() { + // each star needs [xpos, ypos, xsize, ysize, angle?] + for(i in 0...1000) { + var xpos = Transform.get_pos_x(_startracker) + (_rand.float(-500, 500)) + var ypos = Transform.get_pos_y(_startracker) + (_rand.float(-500, 500)) + var xsize = 2 + var ysize = 2 + var angle = 0 + var alpha = _rand.float(0, 0.8) + _stars.add([xpos, ypos, xsize, ysize, angle, alpha]) + Draw.quad(_starfield_context, xpos, ypos, -2, xsize * alpha, ysize * alpha, angle, [1,1,1,alpha]) + } + Draw.commit(_starfield_context) + } //create_starfield + create_startracker() { - _star_tracker = Entity.create(app.world, "star_tracker") - Transform.create(_star_tracker) - Transform.set_pos(_star_tracker, Transform.get_pos_x(_ship), Transform.get_pos_y(_ship), Transform.get_pos_z(_ship)) + _startracker = Entity.create(app.world, "startracker") + Transform.create(_startracker) + // Transform.set_pos(_startracker, Transform.get_pos_x(app.camera) + _cam_size_x / 2, Transform.get_pos_y(app.camera) + _cam_size_y / 2, 0) + Transform.set_pos(_startracker, 0, 0) + } //create_startracker - create_starfield() { - for(i in 0...5000) { - var xpos = _rand.float() * 1000 - 500 - var ypos = _rand.float() * 1000 - 500 - Draw.quad(_starfield_context, xpos-1, ypos, -1, 3, 1, 0, [1,1,1,1]) - Draw.quad(_starfield_context, xpos, ypos-1, -1, 1, 3, 0, [1,1,1,1]) + create_asteroids() { + for(i in 0...70) { + var asteroid = Entity.create(app.world, "asteroid") + var asteroid_mat = Assets.material("material/asteroid") + Sprite.create(asteroid, asteroid_mat, 8, 8) + Transform.create(asteroid) + var offsetx = _rand.float(-200, 200) + var offsety = _rand.float(-200, 200) + Transform.set_pos(asteroid, offsetx, offsety, -1) } - } //create_starfield2 + } //create_asteroids -// UPDATERS -/////////// +// TICKS +//////// tick_ship(delta) { - var input_vec = [get_axis("horizontal"), get_axis("vertical")] - Math.normalize2D(input_vec) - - // 2d movement physics - _ship_acceleration_x = input_vec.x * _ship_speed - _ship_acceleration_y = input_vec.y * _ship_speed - _ship_velocity_x = _ship_velocity_x + (_ship_acceleration_x * delta) - _ship_velocity_y = _ship_velocity_y + (_ship_acceleration_y * delta) - _ship_velocity_x = _ship_velocity_x * _ship_dampening - _ship_velocity_y = _ship_velocity_y * _ship_dampening + if(_controls == "keyboard") { + // WASD/arrows to move in directions. ship rotates to face movement direction + var input_vec = [get_axis("horizontal"), get_axis("vertical")] + Math.normalize2D(input_vec) + + // 2d movement physics + _ship_acceleration = [input_vec.x * _ship_speed, input_vec.y * _ship_speed] + _ship_velocity = [_ship_velocity.x + (_ship_acceleration.x * delta), _ship_velocity.y + (_ship_acceleration.y * delta)] + _ship_velocity = [_ship_velocity.x * _ship_dampening, _ship_velocity.y * _ship_dampening] - // rotate ship in direction of movement, if input is detected (solves snap at vel=0) - if(input_vec.x != 0 || input_vec.y != 0) { - _ship_rotation = Math.atan2(_ship_velocity_y, _ship_velocity_x) + Math.radians(270) - Transform.set_euler_world(_ship, 0, 0, _ship_rotation) - } + // rotate ship in direction of movement, if input is detected (solves snap at vel=0) + if(input_vec.x != 0 || input_vec.y != 0) { + var ship_rotation = Math.atan2(_ship_velocity.y, _ship_velocity.x) + Math.radians(270) + Transform.set_euler_world(_ship, 0, 0, ship_rotation) + } + } //keyboard + + if(_controls == "mouse") { + // ship rotates to face mouse pointer, right click adds thrust in facing direction. + // ship will slowly slow down, so you can keep traveling in one direction, but spin around to fire + // left click fires weapon + var mouse = Camera.screen_point_to_world(app.camera, Input.mouse_x(), Input.mouse_y()) + Transform.set_pos(_reticule, mouse.x, mouse.y) + var ydiff = mouse.y - Transform.get_pos_y(_ship) + var xdiff = mouse.x - Transform.get_pos_x(_ship) + var rotation = Math.atan2(ydiff, xdiff) + Math.radians(270) + Transform.set_euler_world(_ship, 0, 0, rotation) + if(Input.mouse_state_down(MouseButton.right)) { + _ship_acceleration = [xdiff, ydiff] + Math.normalize2D(_ship_acceleration) + _ship_acceleration = [_ship_acceleration.x * 10, _ship_acceleration.y * 10] + _ship_velocity = [_ship_velocity.x + (_ship_acceleration.x * delta), _ship_velocity.y + (_ship_acceleration.y * delta)] + } + _ship_velocity = [_ship_velocity.x * _ship_dampening, _ship_velocity.y * _ship_dampening] + + } //mouse + + if(_controls == "controller") { + + } //controller // move ship - Transform.translate(_ship, _ship_velocity_x, _ship_velocity_y) + Transform.translate(_ship, _ship_velocity.x, _ship_velocity.y) // update position text var ship_pos_x_int = Math.floor_around_zero(Transform.get_pos_x(_ship)) @@ -124,43 +182,47 @@ class Game is Ready { } //tick_ship tick_camera(delta) { - // move the camera, with some lerp delay, along with the ship + // move the camera, with some lerp delay, following the ship var shipx = Transform.get_pos_x(_ship) var shipy = Transform.get_pos_y(_ship) var camerax = Transform.get_pos_x(app.camera) var cameray = Transform.get_pos_y(app.camera) var interpolation = 0.8 - var camera_interp_x = lerp(shipx - _cam_offset_x / 2, camerax, interpolation) - var camera_interp_y = lerp(shipy - _cam_offset_y / 2, cameray, interpolation) + var camera_interp_x = lerp(shipx - _cam_size_x / 2, camerax, interpolation) + var camera_interp_y = lerp(shipy - _cam_size_y / 2, cameray, interpolation) Transform.set_pos(app.camera, camera_interp_x, camera_interp_y) } //tick_camera + tick_startracker(delta) { + Transform.set_pos(_startracker, Transform.get_pos_x(app.camera) + _cam_size_x / 2, Transform.get_pos_y(app.camera) + _cam_size_y / 2) + // System.print("[%(Transform.get_pos_x(_startracker)),%(Transform.get_pos_y(_startracker))]") + } //tick_startracker + tick_starfield(delta) { - //todo: 20191130 - found an interesting bug, where if you (while going super fast) travel out too far, and return to [0,0], the stars will be slightly misaligned. must have something to do with a floating point error while moving the stars around. Went to 25,000 out and saw a slight misalign - // to fix, can make scrolling more accurate somehow, maybe track a stars movement and see where it gets it's error. probably when having them switch sides - // another option is to restrict how far out the player can travel from [0,0], either with a hard limit, or some gameplay thing that makes them stay close to base - Transform.set_pos(_star_tracker, Transform.get_pos_x(app.camera) + _cam_offset_x, Transform.get_pos_y(app.camera) + _cam_offset_y, -1) - // loop through stars[] for(star in _stars) { - Transform.set_pos_x(star, Transform.get_pos_x(star) + -_ship_velocity_x * (Sprite.get_alpha(star) * 0.5)) - Transform.set_pos_y(star, Transform.get_pos_y(star) + -_ship_velocity_y * (Sprite.get_alpha(star) * 0.5)) + star[0] = star[0] - (_ship_velocity.x * (star[5] / 10)) + star[1] = star[1] - (_ship_velocity.y * (star[5] / 10)) + /* // x pos reset - if(Transform.get_pos_x(star) > _cam_offset_x * _camera_scale) { - Transform.set_pos_x(star, -_cam_offset_x * _camera_scale) + if(star[0] > Transform.get_pos_x(_ship) + _cam_size_x * _camera_scale) { + star[0] = Transform.get_pos_x(_ship) + -_cam_size_x * _camera_scale } - if(Transform.get_pos_x(star) < -_cam_offset_x * _camera_scale) { - Transform.set_pos_x(star, _cam_offset_x * _camera_scale) + if(star[0] < Transform.get_pos_x(_ship) + -_cam_size_x * _camera_scale) { + star[0] = Transform.get_pos_x(_ship) + _cam_size_x * _camera_scale } - // y pos reset - if(Transform.get_pos_y(star) > _cam_offset_y * _camera_scale) { - Transform.set_pos_y(star, -_cam_offset_y * _camera_scale) + if(star[1] > _cam_size_y * _camera_scale) { + star[1] = -_cam_size_y * _camera_scale } - if(Transform.get_pos_y(star) < -_cam_offset_y * _camera_scale) { - Transform.set_pos_y(star, _cam_offset_y * _camera_scale) + if(star[1] < -_cam_size_y * _camera_scale) { + star[1] = _cam_size_y * _camera_scale } + */ + + Draw.quad(_starfield_context, Transform.get_pos_x(_startracker) + star[0], Transform.get_pos_y(_startracker) + star[1], -2, star[2] * star[5], star[3] * star[5], star[4], [1,1,1,star[5]]) } + Draw.commit(_starfield_context) } //tick_starfield // MISC diff --git a/ideas.txt b/ideas.txt index a8c29e0..0a7a21c 100644 --- a/ideas.txt +++ b/ideas.txt @@ -1 +1,4 @@ -new idea for controls. left stick controls which direction you face, triggers used for thrust in that direction (left trig) and weapons (right trig). Have a slow drift/slow down. This allows you to have thrust in one direction, spin around and keep moving in that direction, but shoot behind you/strafe to the side. \ No newline at end of file +new idea for controls. left stick controls which direction you face, triggers used for thrust in that direction (left trig) and weapons (right trig). Have a slow drift/slow down. This allows you to have thrust in one direction, spin around and keep moving in that direction, but shoot behind you/strafe to the side. + +todo: animate ship sprite +todo: shooting \ No newline at end of file diff --git a/image/reticule.image.lx b/image/reticule.image.lx new file mode 100644 index 0000000..6f882fb --- /dev/null +++ b/image/reticule.image.lx @@ -0,0 +1,3 @@ +image = { + source = "image/reticule.png" +} \ No newline at end of file diff --git a/image/reticule.png b/image/reticule.png new file mode 100644 index 0000000..c04a8d7 Binary files /dev/null and b/image/reticule.png differ diff --git a/log.txt b/log.txt index f984e09..73f0126 100644 --- a/log.txt +++ b/log.txt @@ -1,4 +1,4 @@ -luxe / Engine / Fri Sep 25 09:52:20 2020 +luxe / Engine / Sat Sep 26 16:40:48 2020 luxe / Engine / path is `/Users/jonathan/Developer/luxe/space` luxe / Engine / 2020.3.0 luxe / paths / root / located at `/Users/jonathan/.luxe` @@ -13,26 +13,26 @@ luxe / dev / parcel / adding dependency `luxe` @ `2020.3.0` luxe / dev / parcel / - adding scripts from `/Users/jonathan/.luxe/modules/luxe/2020.3.0/api` luxe / dev / parcel / - adding assets from `/Users/jonathan/.luxe/modules/luxe/2020.3.0/assets` luxe / dev / images / adding unreferenced sources... -luxe / dev / parcel / entry parcel generated in 13.72843401622958ms +luxe / dev / parcel / entry parcel generated in 14.69384395750239ms luxe / dev / compiler / compiling dev content to `.luxe/` ... luxe / dev / compiler / luxe runtime `2020.3.0` at path `/Users/jonathan/.luxe/modules/luxe/2020.3.0` ... + modifier - 0 found + block - 0 found - + material - 12 found + + material - 13 found + shaders - 1 found + particles - 0 found + settings - 1 found - `.luxe/entry.settings.lx` > `.luxe/.luxe/entry.settings.lx.814a19b5` + script - 109 found - parsing 1 scripts and their imports ... - - parsing `game.wren` - 22.7076ms - - parsing `random` - 0.00148ms + - parsing `game.wren` - 29.59524ms + - parsing `random` - 0.0016ms - compiling 1 scripts ... - - parsing `luxe: input` - 281.83291ms - - parsing `luxe: io` - 4.99927ms - - parsing `luxe/io` - 0.0013ms - - parsing `luxe: assets` - 45.93918ms - - compiled `game.wren` - 376.8662ms + - parsing `luxe: assets` - 46.01129ms + - parsing `luxe: input` - 279.94995ms + - parsing `luxe: io` - 5.2143ms + - parsing `luxe/io` - 0.00163ms + - compiled `game.wren` - 374.95113ms + render - 1 found + tiles - 0 found + font - 2 found @@ -41,22 +41,22 @@ luxe / dev / compiler / luxe runtime `2020.3.0` at path `/Users/jonathan/.luxe/m + material_basis - 13 found + material_input - 0 found + prototype - 0 found - + image - 6 found + + image - 7 found + input - 1 found + mesh - 0 found + ui - 22 found luxe / dev / data compile times: - - / material / spent `2.67191ms` - - / shaders / spent `5.33388ms` - - / font / spent `4.32393ms` - - / material_basis / spent `1.36295ms` - - / settings / spent `1.03035ms` - - / script / spent `438.07279ms` - - / image / spent `23.12202ms` - - / input / spent `0.54995ms` - - / render / spent `0.64896ms` - - / ui / spent `2.51099ms` -luxe / dev / compiler / compile complete | `168 assets` | `481.1434459988959ms` + - / material / spent `2.89596ms` + - / shaders / spent `5.67593ms` + - / font / spent `25.00054ms` + - / material_basis / spent `1.6935ms` + - / settings / spent `1.14198ms` + - / script / spent `444.15931ms` + - / image / spent `4.65849ms` + - / input / spent `0.73599ms` + - / render / spent `0.69617ms` + - / ui / spent `2.75271ms` +luxe / dev / compiler / compile complete | `170 assets` | `491.2206230219454ms` luxe / project / info: - name: `space` - version: `0.0.1` @@ -83,6 +83,7 @@ luxe / assets / loading `entry parcel` ... luxe / assets / loading / image `luxe: image/logo.sprite` luxe / assets / loading / image `image/asteroid` luxe / assets / loading / image `image/laser` + luxe / assets / loading / image `image/reticule` luxe / assets / loading / image `image/ship` luxe / assets / loading / image `image/star` luxe / assets / loading / basis `luxe: material_basis/font` 3777439469 @@ -110,6 +111,7 @@ luxe / assets / loading `entry parcel` ... luxe / assets / loading / material `luxe: material/sprite.solid` luxe / assets / loading / material `material/asteroid` luxe / assets / loading / material `material/laser` + luxe / assets / loading / material `material/reticule` luxe / assets / loading / material `material/ship` luxe / assets / loading / material `material/star` luxe / assets / loading / bytes `luxe: anim/material.track.lx` @@ -118,6 +120,7 @@ luxe / assets / loading `entry parcel` ... luxe / assets / loading / bytes `_art/atlas.ase` luxe / assets / loading / bytes `_art/laser.ase` luxe / assets / loading / bytes `_art/player_ship.ase` + luxe / assets / loading / bytes `_art/reticule.ase` luxe / assets / loading / bytes `_art/star.ase` luxe / assets / loading / bytes `ideas.txt` luxe / assets / loading / input `outline/inputs` @@ -143,7 +146,7 @@ luxe / assets / loading `entry parcel` ... luxe / assets / loading / ui `luxe: ui/editor.panel.progress` luxe / assets / loading / ui `luxe: ui/editor.panel.slider` luxe / assets / loading / ui `luxe: ui/editor.panel.text` -luxe / assets / loaded `entry parcel` with `66 items` in `27.47206698404625ms` +luxe / assets / loaded `entry parcel` with `69 items` in `27.85568300168961ms` luxe / runtime / setting log level `info` luxe / assets / input / loading entry input `outline/inputs` luxe / render / init renderer script `outline/renderer` diff --git a/material/reticule.material.lx b/material/reticule.material.lx new file mode 100644 index 0000000..163dbb8 --- /dev/null +++ b/material/reticule.material.lx @@ -0,0 +1,4 @@ +material = { + basis = "luxe: material_basis/sprite_pixelated" + inputs = { sprite.image = "image/reticule" } +} \ No newline at end of file