Javascript Api
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Wudgine ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΡΠ½ΡΠΉ JavaScript API Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Ρ Π΄Π²ΠΈΠΆΠΊΠΎΠΌ. ΠΡΠΎΡ API ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ Π² ΠΈΠ³ΡΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠ³ΡΠΎΠ²ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ.
engine
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ Π²Ρ
ΠΎΠ΄Π° Π² JavaScript API ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ engine
, ΠΊΠΎΡΠΎΡΡΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² Π»ΡΠ±ΠΎΠΌ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ WebUIComponent
.
// ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° engine
const playerHealth = engine.call('getPlayerHealth');
console.log(`Π’Π΅ΠΊΡΡΠ΅Π΅ Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅ ΠΈΠ³ΡΠΎΠΊΠ°: ${playerHealth}`);
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ C++
/**
* ΠΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² C++
* @param {string} functionName - ΠΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ
* @param {Object} params - ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ)
* @returns {*} Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ
*/
engine.call(functionName, params);
ΠΡΠΈΠΌΠ΅Ρ:
// ΠΡΠ·ΠΎΠ² C++ ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
const playerPosition = engine.call('getPlayerPosition');
console.log(`ΠΠΎΠ·ΠΈΡΠΈΡ ΠΈΠ³ΡΠΎΠΊΠ°: ${playerPosition.x}, ${playerPosition.y}, ${playerPosition.z}`);
// ΠΡΠ·ΠΎΠ² C++ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
const damageResult = engine.call('applyDamage', {
targetId: 'enemy_123',
amount: 50,
damageType: 'fire'
});
if (damageResult.success) {
console.log(`ΠΠ°Π½Π΅ΡΠ΅Π½ΠΎ ${damageResult.actualDamage} ΡΡΠΎΠ½Π°!`);
}
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ JavaScript ΡΡΠ½ΠΊΡΠΈΠΉ
/**
* Π Π΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ JavaScript ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΈΠ· C++
* @param {string} functionName - ΠΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ
* @param {Function} callback - Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
*/
engine.register(functionName, callback);
ΠΡΠΈΠΌΠ΅Ρ:
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
engine.register('updateHealthUI', (data) => {
const healthBar = document.getElementById('health-bar');
const healthText = document.getElementById('health-text');
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
healthBar.style.width = `${data.healthPercent}%`;
healthText.textContent = `${data.currentHealth}/${data.maxHealth}`;
// ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° ΠΏΡΠΈ Π½ΠΈΠ·ΠΊΠΎΠΌ Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅
if (data.healthPercent < 25) {
healthBar.classList.add('critical');
} else {
healthBar.classList.remove('critical');
}
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² C++
return { success: true };
});
Π Π°Π±ΠΎΡΠ° Ρ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ
ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠΈΡ
/**
* ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅ Π΄Π²ΠΈΠΆΠΊΠ°
* @param {string} eventName - ΠΠΌΡ ΡΠΎΠ±ΡΡΠΈΡ
* @param {Function} callback - Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
* @returns {number} ID ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ
*/
engine.subscribe(eventName, callback);
ΠΡΠΈΠΌΠ΅Ρ:
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ½Π°
const damageSubscriptionId = engine.subscribe('playerDamaged', (data) => {
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΌΠΈΠ³Π°Π½ΠΈΡ ΡΠΊΡΠ°Π½Π°
const damageFlash = document.createElement('div');
damageFlash.className = 'damage-flash';
document.body.appendChild(damageFlash);
// Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· 500 ΠΌΡ
setTimeout(() => {
document.body.removeChild(damageFlash);
}, 500);
});
ΠΡΠΏΠΈΡΠΊΠ° ΠΎΡ ΡΠΎΠ±ΡΡΠΈΠΉ
/**
* ΠΡΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΎΡ ΡΠΎΠ±ΡΡΠΈΡ
* @param {number} subscriptionId - ID ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ
*/
engine.unsubscribe(subscriptionId);
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ
/**
* ΠΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² Π΄Π²ΠΈΠΆΠΎΠΊ
* @param {string} eventName - ΠΠΌΡ ΡΠΎΠ±ΡΡΠΈΡ
* @param {Object} data - ΠΠ°Π½Π½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ
*/
engine.emit(eventName, data);
Π Π°Π±ΠΎΡΠ° Ρ ΠΈΠ³ΡΠΎΠ²ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ
ΠΠ°Π½Π½ΡΠ΅ ΠΈΠ³ΡΠΎΠΊΠ°
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΈΠ³ΡΠΎΠΊΠ°
const playerData = engine.call('getPlayerData');
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°
engine.call('updatePlayerStat', {
statName: 'strength',
newValue: 15
});
ΠΠ½Π²Π΅Π½ΡΠ°ΡΡ
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
const inventory = engine.call('getInventory');
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°
function useItem(itemId) {
const result = engine.call('useItem', { itemId });
if (result.success) {
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ UI
updateInventoryUI();
} else {
// ΠΠΎΠΊΠ°Π· ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅
showErrorMessage(result.errorMessage);
}
}
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
/**
* ΠΠ°Π³ΡΡΠΆΠ°Π΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈΠ³ΡΡ
* @param {string} imagePath - ΠΡΡΡ ΠΊ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
* @returns {Promise<string>} URL ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
*/
async function loadGameImage(imagePath) {
const result = await engine.call('loadImage', { path: imagePath });
return result.imageUrl;
}
ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π·Π²ΡΠΊΠΎΠ²
/**
* ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ Π·Π²ΡΠΊ
* @param {string} soundId - ID Π·Π²ΡΠΊΠ°
* @param {Object} options - ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ
*/
function playSound(soundId, options = {}) {
engine.call('playSound', {
soundId,
volume: options.volume || 1.0,
pitch: options.pitch || 1.0,
loop: options.loop || false
});
}
ΠΠ½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ
ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
/**
* ΠΠ½ΠΈΠΌΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
* @param {HTMLElement} element - ΠΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
* @param {string} property - CSS ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
* @param {string|number} targetValue - Π¦Π΅Π»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
* @param {number} duration - ΠΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π² ΠΌΡ
* @returns {Promise} Promise, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
*/
function animateProperty(element, property, targetValue, duration = 300) {
return new Promise(resolve => {
element.style.transition = `${property} ${duration}ms ease-out`;
element.style[property] = targetValue;
const onTransitionEnd = () => {
element.removeEventListener('transitionend', onTransitionEnd);
resolve();
};
element.addEventListener('transitionend', onTransitionEnd);
});
}
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
/**
* ΠΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² Π»ΠΎΠ³ Π΄Π²ΠΈΠΆΠΊΠ°
* @param {string} message - Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
* @param {string} level - Π£ΡΠΎΠ²Π΅Π½Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (debug, info, warning, error)
*/
function log(message, level = 'info') {
engine.call('log', {
message,
level
});
}
ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
/**
* ΠΠΎΠ»ΡΡΠ°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ
* @param {string} key - ΠΠ»ΡΡ ΡΡΡΠΎΠΊΠΈ
* @param {Object} params - ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
* @returns {string} ΠΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ°
*/
function getLocalizedString(key, params = {}) {
const result = engine.call('getLocalizedString', {
key,
params
});
return result.text;
}
ΠΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°: Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
class InventorySystem {
constructor() {
this.inventoryData = null;
this.draggedItem = null;
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
this.initialize();
}
async initialize() {
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π΄Π°Π½Π½ΡΡ
ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
this.inventoryData = await engine.call('getInventory');
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΡΠΎΠ²
this.createInventorySlots();
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ
this.setupDragAndDrop();
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ
engine.register('updateInventory', (data) => {
this.updateInventoryUI(data);
return { success: true };
});
}
createInventorySlots() {
const container = document.getElementById('inventory-container');
container.innerHTML = '';
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ
for (let i = 0; i < this.inventoryData.slots.length; i++) {
const slot = document.createElement('div');
slot.className = 'inventory-slot';
slot.dataset.slotIndex = i;
// ΠΡΠ»ΠΈ Π² ΡΠ»ΠΎΡΠ΅ Π΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ
const itemData = this.inventoryData.slots[i];
if (itemData) {
const itemElement = this.createItemElement(itemData);
slot.appendChild(itemElement);
}
container.appendChild(slot);
}
}
createItemElement(itemData) {
const item = document.createElement('div');
item.className = 'inventory-item';
item.dataset.itemId = itemData.id;
// ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ°
const img = document.createElement('img');
img.src = itemData.iconUrl;
img.alt = itemData.name;
item.appendChild(img);
return item;
}
setupDragAndDrop() {
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΎΠ²
// ...
}
updateInventoryUI(data) {
this.inventoryData = data;
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ UI Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π½ΠΎΠ²ΡΡ
Π΄Π°Π½Π½ΡΡ
// ...
}
}