add collision with foreground
This commit is contained in:
parent
2ba5dd275f
commit
c7fb1d5a86
88
cart.wren
88
cart.wren
|
@ -8,6 +8,19 @@ import "random" for Random
|
|||
var W = 240
|
||||
var H = 136
|
||||
var R = Random.new()
|
||||
var TileSize = 8
|
||||
var DbgBox = false
|
||||
|
||||
class Color {
|
||||
static black { 0 }
|
||||
static purple { 1 }
|
||||
static red { 2 }
|
||||
static orange { 3 }
|
||||
static yellow { 4 }
|
||||
static green_light { 5 }
|
||||
static green { 6 }
|
||||
static green_dark { 7 }
|
||||
}
|
||||
|
||||
class Star {
|
||||
construct new(x, y, size, scrollSpeed, color) {
|
||||
|
@ -90,15 +103,30 @@ class Enemy {
|
|||
}
|
||||
}
|
||||
|
||||
class Ship {
|
||||
class Player {
|
||||
construct new(x, y) {
|
||||
_x = x
|
||||
_y = y
|
||||
_w = 16
|
||||
_h = 16
|
||||
|
||||
// box size
|
||||
_bw = 12
|
||||
_bh = 10
|
||||
|
||||
_speed = 1
|
||||
_bullets = []
|
||||
_alive = true
|
||||
}
|
||||
|
||||
x { _x }
|
||||
y { _y }
|
||||
w { _w }
|
||||
h { _h }
|
||||
bw { _bw }
|
||||
bh { _bh }
|
||||
bullets { _bullets }
|
||||
alive { _alive }
|
||||
|
||||
update() {
|
||||
if (TIC.btn(0)) {
|
||||
|
@ -113,8 +141,8 @@ class Ship {
|
|||
if (TIC.btn(3)) {
|
||||
_x = _x + _speed
|
||||
}
|
||||
_x.clamp(0, W)
|
||||
_y.clamp(0, H)
|
||||
_x = _x.clamp(_w / 2, W - _w / 2)
|
||||
_y = _y.clamp(_h / 2, H - _h / 2)
|
||||
|
||||
if (TIC.btnp(4, 5, 10)) {
|
||||
shoot()
|
||||
|
@ -129,14 +157,22 @@ class Ship {
|
|||
}
|
||||
|
||||
draw() {
|
||||
TIC.spr(256, _x, _y, 0, 1, 0, 0, 2, 2)
|
||||
TIC.spr(256, _x - _w / 2, _y - _h / 2, 0, 1, 0, 0, 2, 2)
|
||||
for (b in _bullets) {
|
||||
b.draw()
|
||||
}
|
||||
if (DbgBox) {
|
||||
TIC.rectb(_x - _w / 2, _y - _h / 2, _w, _h, 5)
|
||||
TIC.rectb(_x - _bw / 2, _y - _bh / 2, _bw, _bh, Color.red)
|
||||
}
|
||||
}
|
||||
|
||||
shoot() {
|
||||
_bullets.add(Bullet.new(_x + 8, _y + 8))
|
||||
_bullets.add(Bullet.new(_x + _w / 2, _y))
|
||||
}
|
||||
|
||||
die() {
|
||||
_alive = false
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +193,7 @@ class Explosion {
|
|||
|
||||
draw() {
|
||||
var size = 10
|
||||
TIC.circ(_x - size / 2, _y - size / 2, size, 2)
|
||||
TIC.circ(_x, _y, size, 2)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -167,9 +203,10 @@ class World {
|
|||
_stars = []
|
||||
_enemies = []
|
||||
_vfx = []
|
||||
_player = Ship.new(W / 2, H / 2)
|
||||
_player = Player.new(W / 2, H / 2)
|
||||
_world_x = 0
|
||||
_world_y = 0
|
||||
_w_offset_x = 0
|
||||
_world_scroll_speed = 60 / 2
|
||||
|
||||
// init background
|
||||
|
@ -205,15 +242,18 @@ class World {
|
|||
}
|
||||
|
||||
update() {
|
||||
if (_player.alive) {
|
||||
_player.update()
|
||||
|
||||
for (s in _stars) {
|
||||
s.update()
|
||||
}
|
||||
}
|
||||
|
||||
for (e in _enemies) {
|
||||
e.update()
|
||||
}
|
||||
|
||||
for (s in _stars) {
|
||||
s.update()
|
||||
}
|
||||
|
||||
for (v in _vfx) {
|
||||
v.update()
|
||||
|
@ -239,11 +279,15 @@ class World {
|
|||
if (_t % mediumTick == 0) {
|
||||
_stars.add(Star.new(W, R.int(0,H), width, speed, 13))
|
||||
}
|
||||
|
||||
if (_player.alive) {
|
||||
_t = _t + 1
|
||||
}
|
||||
|
||||
if (_t % _world_scroll_speed == 0) {
|
||||
_world_x = _world_x + 1
|
||||
}
|
||||
_w_offset_x = -(_t % _world_scroll_speed) / (_world_scroll_speed / 8)
|
||||
|
||||
// Collisions
|
||||
var i = 0
|
||||
|
@ -263,6 +307,14 @@ class World {
|
|||
i = i + 1
|
||||
}
|
||||
}
|
||||
if (!(fgCheck(_player.x - _player.bw / 2, _player.y - _player.bh / 2) &&
|
||||
fgCheck(_player.x - _player.bw / 2, _player.y + _player.bh / 2) &&
|
||||
fgCheck(_player.x + _player.bw / 2, _player.y + _player.bh / 2) &&
|
||||
fgCheck(_player.x + _player.bw / 2, _player.y - _player.bh / 2))) {
|
||||
System.print("collision with foreground")
|
||||
_player.die()
|
||||
_vfx.add(Explosion.new(_player.x, _player.y))
|
||||
}
|
||||
}
|
||||
|
||||
collide(x1, y1, w1, h1, x2, y2, w2, h2) {
|
||||
|
@ -291,18 +343,28 @@ class World {
|
|||
return true
|
||||
}
|
||||
|
||||
fgCheck(x, y) {
|
||||
var mapX = ((x + _w_offset_x) / TileSize) + _world_x
|
||||
var mapY = (y / TileSize) + _world_y
|
||||
var tile = TIC.mget(mapX, mapY)
|
||||
if (tile == 0) {
|
||||
return true
|
||||
}
|
||||
System.print("collision at %(x), %(y)!")
|
||||
return false
|
||||
}
|
||||
|
||||
draw() {
|
||||
for (s in _stars) {
|
||||
s.draw()
|
||||
}
|
||||
|
||||
TIC.map(_world_x, _world_y, 30 + 1, 17 + 1, _w_offset_x, 0, 0, 1, _remap)
|
||||
|
||||
for (v in _vfx) {
|
||||
v.draw()
|
||||
}
|
||||
|
||||
var sx = (_t % _world_scroll_speed) / (_world_scroll_speed / 8)
|
||||
TIC.map(_world_x, _world_y, 30 + 1, 17 + 1, -sx, 0, 0, 1, _remap)
|
||||
|
||||
for (e in _enemies) {
|
||||
e.draw()
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue