stanje 4am
This commit is contained in:
@@ -31,13 +31,15 @@ class Player {
|
||||
}
|
||||
|
||||
createSprite() {
|
||||
// Use custom sprite if available, otherwise procedural
|
||||
let texKey = 'player';
|
||||
// Prefer animated sprite if available
|
||||
let texKey = 'player_walk'; // Spritesheet
|
||||
let isAnimated = this.scene.textures.exists(texKey);
|
||||
|
||||
if (this.scene.textures.exists('player_sprite')) {
|
||||
texKey = 'player_sprite';
|
||||
} else if (!this.scene.textures.exists(texKey)) {
|
||||
TextureGenerator.createPlayerSprite(this.scene, texKey);
|
||||
if (!isAnimated) {
|
||||
texKey = this.scene.textures.exists('player_sprite') ? 'player_sprite' : 'player';
|
||||
if (!this.scene.textures.exists(texKey)) {
|
||||
TextureGenerator.createPlayerSprite(this.scene, texKey);
|
||||
}
|
||||
}
|
||||
|
||||
// Kreira sprite
|
||||
@@ -48,12 +50,67 @@ class Player {
|
||||
texKey
|
||||
);
|
||||
this.sprite.setOrigin(0.5, 1);
|
||||
this.sprite.setScale(0.3); // Optimized for visibility
|
||||
|
||||
// Scale logic
|
||||
if (isAnimated) {
|
||||
this.sprite.setScale(1.5); // 64px frame -> looks good around 96px total height relative to 48px tile
|
||||
} else {
|
||||
this.sprite.setScale(0.3);
|
||||
}
|
||||
|
||||
// --- HAND / HELD ITEM SPRITE ---
|
||||
this.handSprite = this.scene.add.sprite(
|
||||
screenPos.x + this.offsetX + 10,
|
||||
screenPos.y + this.offsetY - 25, // Adjusted for new height
|
||||
'item_axe'
|
||||
);
|
||||
this.handSprite.setOrigin(0.5, 0.5);
|
||||
this.handSprite.setScale(0.25);
|
||||
this.handSprite.setVisible(false);
|
||||
|
||||
// Depth sorting
|
||||
this.updateDepth();
|
||||
}
|
||||
|
||||
// ... setupControls ...
|
||||
|
||||
// ... update ...
|
||||
|
||||
moveToGrid(targetX, targetY) {
|
||||
this.isMoving = true;
|
||||
this.gridX = targetX;
|
||||
this.gridY = targetY;
|
||||
|
||||
const targetScreen = this.iso.toScreen(targetX, targetY);
|
||||
|
||||
// Play Animation
|
||||
if (this.sprite.texture.key === 'player_walk') {
|
||||
this.sprite.play('player_walk_anim', true);
|
||||
}
|
||||
|
||||
// Tween za smooth gibanje
|
||||
this.scene.tweens.add({
|
||||
targets: [this.sprite, this.handSprite], // Move both
|
||||
x: '+=' + (targetScreen.x + this.offsetX - this.sprite.x),
|
||||
y: '+=' + (targetScreen.y + this.offsetY - this.sprite.y),
|
||||
duration: this.gridMoveTime,
|
||||
ease: 'Linear',
|
||||
onComplete: () => {
|
||||
this.isMoving = false;
|
||||
this.updatePosition();
|
||||
|
||||
// Stop Animation
|
||||
if (this.sprite.texture.key === 'player_walk') {
|
||||
this.sprite.stop();
|
||||
this.sprite.setFrame(0); // Idle frame
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Posodobi depth
|
||||
this.updateDepth();
|
||||
}
|
||||
|
||||
setupControls() {
|
||||
// WASD kontrole
|
||||
this.keys = this.scene.input.keyboard.addKeys({
|
||||
@@ -65,41 +122,73 @@ class Player {
|
||||
}
|
||||
|
||||
update(delta) {
|
||||
this.updateDepth();
|
||||
|
||||
if (!this.isMoving) {
|
||||
this.handleInput();
|
||||
}
|
||||
|
||||
// Sync Held Item with Inventory
|
||||
this.updateHeldItem();
|
||||
}
|
||||
|
||||
updateHeldItem() {
|
||||
const uiScene = this.scene.scene.get('UIScene');
|
||||
const invSys = this.scene.inventorySystem;
|
||||
|
||||
if (uiScene && invSys) {
|
||||
const selectedIdx = uiScene.selectedSlot;
|
||||
const slot = invSys.slots[selectedIdx];
|
||||
|
||||
if (slot && (slot.type === 'axe' || slot.type === 'pickaxe' || slot.type === 'hoe' || slot.type === 'sword')) {
|
||||
const texKey = `item_${slot.type}`;
|
||||
if (this.scene.textures.exists(texKey)) {
|
||||
this.handSprite.setTexture(texKey);
|
||||
this.handSprite.setVisible(true);
|
||||
} else {
|
||||
this.handSprite.setVisible(false);
|
||||
}
|
||||
} else {
|
||||
this.handSprite.setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleInput() {
|
||||
let targetX = this.gridX;
|
||||
let targetY = this.gridY;
|
||||
let moved = false;
|
||||
let facingRight = !this.sprite.flipX; // Keep current
|
||||
|
||||
// WASD za isometric movement
|
||||
if (this.keys.up.isDown) {
|
||||
// W = North-West v isometric view
|
||||
if (this.keys.up.isDown) { // North-West
|
||||
targetX--;
|
||||
moved = true;
|
||||
this.direction = 'up';
|
||||
} else if (this.keys.down.isDown) {
|
||||
// S = South-East v isometric view
|
||||
facingRight = false; // Left-ish
|
||||
} else if (this.keys.down.isDown) { // South-East
|
||||
targetX++;
|
||||
moved = true;
|
||||
this.direction = 'down';
|
||||
facingRight = true; // Right-ish
|
||||
}
|
||||
|
||||
if (this.keys.left.isDown) {
|
||||
// A = South-West v isometric view
|
||||
targetY--;
|
||||
if (this.keys.left.isDown) { // South-West
|
||||
targetY++; // SWAPPED: Was --
|
||||
moved = true;
|
||||
this.direction = 'left';
|
||||
} else if (this.keys.right.isDown) {
|
||||
// D = North-East v isometric view
|
||||
targetY++;
|
||||
facingRight = false; // Left-ish
|
||||
} else if (this.keys.right.isDown) { // North-East
|
||||
targetY--; // SWAPPED: Was ++
|
||||
moved = true;
|
||||
this.direction = 'right';
|
||||
facingRight = true; // Right-ish
|
||||
}
|
||||
|
||||
// Apply Facing
|
||||
this.sprite.setFlipX(!facingRight);
|
||||
|
||||
// Update Hand Position based on facing
|
||||
const handOffset = facingRight ? 10 : -10;
|
||||
this.handSprite.setX(this.sprite.x + handOffset);
|
||||
this.handSprite.setFlipX(!facingRight);
|
||||
|
||||
// Preveri kolizijo z robovi mape
|
||||
const terrainSystem = this.scene.terrainSystem;
|
||||
if (moved && terrainSystem) {
|
||||
@@ -109,28 +198,7 @@ class Player {
|
||||
}
|
||||
}
|
||||
|
||||
moveToGrid(targetX, targetY) {
|
||||
this.isMoving = true;
|
||||
this.gridX = targetX;
|
||||
this.gridY = targetY;
|
||||
|
||||
const targetScreen = this.iso.toScreen(targetX, targetY);
|
||||
|
||||
// Tween za smooth gibanje (brez animacije za zdaj)
|
||||
this.scene.tweens.add({
|
||||
targets: this.sprite,
|
||||
x: targetScreen.x + this.offsetX,
|
||||
y: targetScreen.y + this.offsetY,
|
||||
duration: this.gridMoveTime,
|
||||
ease: 'Linear',
|
||||
onComplete: () => {
|
||||
this.isMoving = false;
|
||||
}
|
||||
});
|
||||
|
||||
// Posodobi depth
|
||||
this.updateDepth();
|
||||
}
|
||||
|
||||
updatePosition() {
|
||||
const screenPos = this.iso.toScreen(this.gridX, this.gridY);
|
||||
@@ -138,12 +206,24 @@ class Player {
|
||||
screenPos.x + this.offsetX,
|
||||
screenPos.y + this.offsetY
|
||||
);
|
||||
|
||||
// Update hand
|
||||
const facingRight = !this.sprite.flipX;
|
||||
const handOffset = facingRight ? 10 : -10;
|
||||
this.handSprite.setPosition(
|
||||
screenPos.x + this.offsetX + handOffset,
|
||||
screenPos.y + this.offsetY - 15
|
||||
);
|
||||
|
||||
this.updateDepth();
|
||||
}
|
||||
|
||||
updateDepth() {
|
||||
const depth = this.iso.getDepth(this.gridX, this.gridY);
|
||||
this.sprite.setDepth(depth + 1000); // +1000 da je nad terenom
|
||||
// Pixel-perfect depth sorting based on screen Y
|
||||
if (this.sprite) {
|
||||
this.sprite.setDepth(this.sprite.y);
|
||||
if (this.handSprite) this.handSprite.setDepth(this.sprite.y + 1);
|
||||
}
|
||||
}
|
||||
|
||||
getPosition() {
|
||||
@@ -159,4 +239,19 @@ class Player {
|
||||
this.sprite.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
dieAnimation() {
|
||||
this.sprite.setTint(0xff0000);
|
||||
this.scene.tweens.add({
|
||||
targets: this.sprite,
|
||||
angle: 90,
|
||||
duration: 500,
|
||||
ease: 'Bounce.easeOut'
|
||||
});
|
||||
}
|
||||
|
||||
respawn() {
|
||||
this.sprite.clearTint();
|
||||
this.sprite.angle = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user