tries to fix the collision problems
This commit is contained in:
parent
54f352c577
commit
c3d0a69148
1 changed files with 22 additions and 29 deletions
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div id="field" :class="daytimeClass">
|
<div id="field" :class="daytimeClass">
|
||||||
<input v-keep-focussed type="text"
|
<input v-keep-focussed type="text"
|
||||||
@keydown.up="jump = jump ? jump : 16"
|
@keydown.up="jump = jump || !blocked.below ? jump : 20"
|
||||||
@keydown.right="player_velocity_x = 8"
|
@keydown.right="player_velocity_x = 8"
|
||||||
@keydown.left="player_velocity_x = -8"
|
@keydown.left="player_velocity_x = -8"
|
||||||
@keyup.right="player_velocity_x = 0"
|
@keyup.right="player_velocity_x = 0"
|
||||||
|
@ -10,8 +10,8 @@
|
||||||
/>
|
/>
|
||||||
<mountain-background :x="128 + x / 8" :time="time" />
|
<mountain-background :x="128 + x / 8" :time="time" />
|
||||||
<div id="wrap" :style="{transform: `translate(${tx}px, ${ty}px)`}">
|
<div id="wrap" :style="{transform: `translate(${tx}px, ${ty}px)`}">
|
||||||
<template v-for="row in rows">
|
<template v-for="(row, y) in rows">
|
||||||
<div v-for="block in row" class="block" :class="[block.type]" />
|
<div v-for="(block, x) in row" class="block" :class="[block.type]" />
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div id="player" :class="[player_direction]" />
|
<div id="player" :class="[player_direction]" />
|
||||||
|
@ -55,37 +55,30 @@ export default {
|
||||||
mounted () {
|
mounted () {
|
||||||
this.move()
|
this.move()
|
||||||
},
|
},
|
||||||
watch: {
|
|
||||||
player_push_x (px) {
|
|
||||||
if (px === 0) this.player_velocity_x = 0
|
|
||||||
else this.player_velocity_x = px
|
|
||||||
},
|
|
||||||
player_push_y (py) {
|
|
||||||
if (py === 0) this.player_velocity_y = 8
|
|
||||||
else this.player_velocity_y = py
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
rows () { return level.grid(this.floorX, this.floorY) },
|
rows () { return level.grid(this.floorX, this.floorY) },
|
||||||
surroundings () {
|
surroundings () {
|
||||||
const at = this.rows[PLAYER_Y][PLAYER_X]
|
const px = PLAYER_X
|
||||||
const left = this.rows[PLAYER_Y][PLAYER_X - 1]
|
const py = PLAYER_Y
|
||||||
const right = this.rows[PLAYER_Y][PLAYER_X + 1]
|
const at = this.rows[py][px]
|
||||||
const above = this.rows[PLAYER_Y - 1][PLAYER_X]
|
const left = this.rows[py][px]
|
||||||
const below = this.rows[PLAYER_Y + 1][PLAYER_X]
|
const right = this.rows[py][px + 1]
|
||||||
|
const above = this.rows[py - 1][px] || at
|
||||||
|
const below = this.rows[py + 1][px]
|
||||||
|
|
||||||
const blocked = {
|
return { at, left, right, above, below }
|
||||||
|
},
|
||||||
|
blocked () {
|
||||||
|
const { at, left, right, above, below } = this.surroundings
|
||||||
|
|
||||||
|
return {
|
||||||
at: !at.walkable,
|
at: !at.walkable,
|
||||||
left: !left.walkable,
|
left: !left.walkable,
|
||||||
right: !right.walkable,
|
right: !right.walkable,
|
||||||
above: !above.walkable,
|
above: !above.walkable,
|
||||||
below: !below.walkable
|
below: !below.walkable
|
||||||
}
|
}
|
||||||
|
|
||||||
return { at, left, right, below, blocked }
|
|
||||||
},
|
},
|
||||||
cornerX () { return this.x === ~~this.x }, // cornering a block
|
|
||||||
cornerY () { return this.y === ~~this.y },
|
|
||||||
floorX () { return Math.floor(this.x) },
|
floorX () { return Math.floor(this.x) },
|
||||||
floorY () { return Math.floor(this.y) },
|
floorY () { return Math.floor(this.y) },
|
||||||
tx () { return (this.x - this.floorX) * -BLOCK_SIZE },
|
tx () { return (this.x - this.floorX) * -BLOCK_SIZE },
|
||||||
|
@ -123,18 +116,17 @@ export default {
|
||||||
let vx = this.player_velocity_x * RECIPROCAL
|
let vx = this.player_velocity_x * RECIPROCAL
|
||||||
let vy = (this.player_velocity_y - this.jump) * RECIPROCAL
|
let vy = (this.player_velocity_y - this.jump) * RECIPROCAL
|
||||||
|
|
||||||
if (this.jump > 0) this.jump--
|
if (this.jump > 0) this.jump -= 2
|
||||||
|
|
||||||
// change player graphic according to direction
|
// change player graphic according to direction
|
||||||
if (vx < 0) this.player_direction = 'left'
|
if (vx < 0) this.player_direction = 'left'
|
||||||
if (vx > 0) this.player_direction = 'right'
|
if (vx > 0) this.player_direction = 'right'
|
||||||
|
|
||||||
// don't walk / fall into blocks
|
// don't walk / fall into blocks
|
||||||
const { blocked } = this.surroundings
|
if (vx > 0 && this.blocked.right) vx = 0
|
||||||
if (vx > 0 && blocked.right) vx = 0
|
if (vx < 0 && this.blocked.left) vx = 0
|
||||||
if (vx < 0 && blocked.left) vx = 0
|
if (vy > 0 && this.blocked.below) vy = 0
|
||||||
if (vy > 0 && blocked.below) vy = 0
|
if (vy < 0 && this.blocked.above) vy = 0
|
||||||
if (vy < 0 && blocked.above) vy = 0
|
|
||||||
|
|
||||||
this.x += vx
|
this.x += vx
|
||||||
this.y += vy
|
this.y += vy
|
||||||
|
@ -189,4 +181,5 @@ export default {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-flow: row wrap;
|
flex-flow: row wrap;
|
||||||
}
|
}
|
||||||
|
.left-of-player, .right-of-player, .below-player { outline: 2px solid #FFF5; }
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue