@AFA
Thank you AFA.
AFA wrote: "Personally the biggest advantage of agk is the combination of simple coding without having any trouble no matter which platform it is for. Locking at Tier 2 we lose this advantage but gain processing speed, right?"
This is right. With c++ you can also develop for all other platforms. Templates and tutorials already exist, but the effort is much higher than in Tier 1.
AFA wrote: "Because somewhere agk said, OOP combined with multiple platform ability would not be possible. Where I have to say I'm not sure if and how extensive the OOP-functionality C sharp will be needed."
C-Sharp exists on Windows, Linux and MacOS. With Xamarin also for mobile platforms. I think that OOP (C#) is possible for multiple platforms.
@MateiSoft
After I have browsed in the Tier2 code. I came to the result that the DLL doesn't have to be updated to solve the input problem.
Here are the new Core.cs and AgkFormTemplate.cs so the keyboard input should work as expected.
AgkFormTemplate.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AGKCore;
using AgkSharp;
namespace AgkSharp_TemplateWinForms
{
public partial class AgkFormTemplate : Form
{
bool init = false;
Timer agkSyncTimer = new Timer();
public bool DisableCmdKeys { get; set; } = false;
public AgkFormTemplate()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (!AGKScreen.Focused)
return base.ProcessCmdKey(ref msg, keyData);
int key = (int)keyData;
if ((keyData & Keys.Alt) == Keys.Alt)
key = 18;
else if ((keyData & Keys.Shift) == Keys.Shift)
key = 16;
else if ((keyData & Keys.Control) == Keys.Control)
key = 17;
Agk.KeyDown((uint)Core.TranslateKey(key));
if (key > 0 && key < 512)
Agk.KeyDown((uint)key);
Char chr = Core.TranslateKeyToUnicode(keyData);
Agk.CharDown(chr);
return true;
}
private void ButtonUp_Click(object sender, EventArgs e)
{
Agk.SetSpritePosition(1, Agk.GetSpriteX(1), Agk.GetSpriteY(1) - 10);
}
private void ButtonDown_Click(object sender, EventArgs e)
{
Agk.SetSpritePosition(1, Agk.GetSpriteX(1), Agk.GetSpriteY(1) + 10);
}
private void ButtonLeft_Click(object sender, EventArgs e)
{
Agk.SetSpritePosition(1, Agk.GetSpriteX(1) - 10, Agk.GetSpriteY(1));
}
private void ButtonRight_Click(object sender, EventArgs e)
{
Agk.SetSpritePosition(1, Agk.GetSpriteX(1) + 10, Agk.GetSpriteY(1));
}
private void AgkFormTemplate_Shown(object sender, EventArgs e)
{
if (!init)
{
Agk.InitGL(AGKScreen.Handle);
AGKCore.Core.LoopInputs(AGKScreen);
init = true;
Agk.SetVirtualResolution(AGKScreen.Width, AGKScreen.Height);
// display a background
Agk.CreateSprite(Agk.LoadImage("media/background.jpg"));
// create a sprite with ID that has no image
Agk.CreateSprite(1, 0);
Agk.SetSpritePosition(1, 130, 200);
// add individual images into an animation list
Agk.AddSpriteAnimationFrame(1, Agk.LoadImage("media/item0.png"));
Agk.AddSpriteAnimationFrame(1, Agk.LoadImage("media/item1.png"));
Agk.AddSpriteAnimationFrame(1, Agk.LoadImage("media/item2.png"));
Agk.AddSpriteAnimationFrame(1, Agk.LoadImage("media/item3.png"));
Agk.AddSpriteAnimationFrame(1, Agk.LoadImage("media/item4.png"));
// play the sprite at 10 fps, looping, going from frame 1 to 5
Agk.PlaySprite(1, 10, 1, 1, 5);
agkSyncTimer.Tick += new EventHandler(SyncTimer);
agkSyncTimer.Interval = 33; // ~ 30 fps
agkSyncTimer.Start();
}
}
private void SyncTimer(Object sender, EventArgs e)
{
Core.LoopAGK();
int key = Agk.GetRawLastKey();
Agk.Print(key);
switch (key)
{
case 16:
Agk.Print("SHIFT-" + (Agk.GetRawKeyState(257) > 0 ? "Left" : Agk.GetRawKeyState(258) > 0 ? "Right" : "Unknown"));
break;
case 17:
Agk.Print("CTRL-" + (Agk.GetRawKeyState(259) > 0 ? "Left" : Agk.GetRawKeyState(260) > 0 ? "Right" : "Unknown"));
break;
case 18:
Agk.Print("ALT-" + (Agk.GetRawKeyState(261) > 0 ? "Left" : Agk.GetRawKeyState(262) > 0 ? "Right" : "Unknown"));
break;
default:
break;
}
Agk.Sync();
}
}
}
Core.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AgkSharp;
namespace AGKCore
{
public class Core
{
static Panel mPanel;
//static bool m_bMaximized = false;
static bool m_bBreakLoop = false;
public static bool DisableEscape { get; set; } = false;
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetKeyboardState(byte[] lpKeyState);
[DllImport("user32.dll", SetLastError = true)]
static extern uint MapVirtualKey(uint uCode, uint uMapType);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetKeyboardLayout(uint idThread);
[DllImport("user32.dll", SetLastError = true)]
static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
static public int TranslateKey(int key)
{
switch (key)
{
// Top Row 0-9
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
key += 215;
break;
// Num pad 0-9
case 96:
case 97:
case 98:
case 99:
case 100:
case 101:
case 102:
case 103:
case 104:
case 105:
key -= 48;
break;
case 16:
if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftShift))
key = 257;
else if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightShift))
key = 258;
break;
case 17:
if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftCtrl))
key = 259;
else if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightCtrl))
key = 260;
break;
case 18:
if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.LeftAlt))
key = 261;
else if (System.Windows.Input.Keyboard.IsKeyDown(System.Windows.Input.Key.RightAlt))
key = 262;
break;
}
return key;
}
static public Char TranslateKeyToUnicode(Keys key)
{
Char result = new Char();
byte[] keyboardState = new byte[255];
bool keyboardStateStatus = GetKeyboardState(keyboardState);
if (!keyboardStateStatus)
{
return result;
}
uint virtualKeyCode = (uint)key;
uint scanCode = MapVirtualKey(virtualKeyCode, 0);
IntPtr inputLocaleIdentifier = GetKeyboardLayout(0);
StringBuilder txt = new StringBuilder();
ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, txt, (int)5, (uint)0, inputLocaleIdentifier);
if (txt.Length > 0)
result = txt[0];
return result;
}
// a panel cannot handle this event.
//static void Core_OnClose(object sender, EventArgs e)
//{
// m_bBreakLoop = true;
//}
static void Core_OnMouseMove(object sender, MouseEventArgs e)
{
Agk.MouseMove(0, e.X, e.Y);
}
static void Core_OnMouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) Agk.MouseLeftButton(0, 1);
if (e.Button == MouseButtons.Right) Agk.MouseRightButton(0, 1);
if (e.Button == MouseButtons.Middle) Agk.MouseMiddleButton(0, 1);
}
static void Core_OnMouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) Agk.MouseLeftButton(0, 0);
if (e.Button == MouseButtons.Right) Agk.MouseRightButton(0, 0);
if (e.Button == MouseButtons.Middle) Agk.MouseMiddleButton(0, 0);
}
static void Core_OnMouseWheel(object sender, MouseEventArgs e)
{
Agk.MouseWheel(0, (float)e.Delta / 40);
}
static void Core_OnSizeChanged(object sender, EventArgs e)
{
//m_bMaximized = m_Window.WindowState == FormWindowState.Maximized;
//m_bMaximized = false; // a Panel in a window can't be maximized.
//m_Window.TopMost = m_bMaximized; // Panel hasn't the item 'TopMost'
Agk.UpdateDeviceSize();
Agk.WindowMoved();
}
static void Core_OnMove(object sender, EventArgs e)
{
Agk.WindowMoved();
}
// a panel cannot handle this event.
//static void Core_OnDeactivate(object sender, EventArgs e)
//{
// Agk.MouseLeftButton(0, 0);
// Agk.MouseRightButton(0, 0);
// Agk.MouseMiddleButton(0, 0);
// mPanel.TopMost = m_bMaximized;
// mPanel.Update();
// Agk.Paused();
// Agk.WindowMoved();
//}
// a panel cannot handle these events.
//static void Core_OnActivated(object sender, EventArgs e)
//{
// mPanel.TopMost = m_bMaximized;
// mPanel.Update();
// Agk.Resumed();
// Agk.WindowMoved();
//}
static void Core_OnGotFocus(object sender, EventArgs e)
{
Agk.WindowMoved();
}
static void Core_OnLostFocus(object sender, EventArgs e)
{
Agk.WindowMoved();
}
static void Core_OnKeyDown(object sender, KeyEventArgs e)
{
Agk.KeyDown((uint)TranslateKey(e.KeyValue));
if (e.KeyValue > 0)
Agk.KeyDown((uint)e.KeyValue);
if (!DisableEscape && e.KeyValue == 27)
m_bBreakLoop = true;
Char chr = TranslateKeyToUnicode(e.KeyCode);
Agk.CharDown(chr);
}
static void Core_OnKeyUp(object sender, KeyEventArgs e)
{
Agk.KeyUp((uint)TranslateKey(e.KeyValue));
if (e.KeyValue > 0)
Agk.KeyUp((uint)e.KeyValue);
}
static void Core_OnClick(object sender, EventArgs e)
{
mPanel.Focus();
}
public static void LoopInputs(Panel form)
{
if (form != null)
{
mPanel = form;
form.MouseDown += Core_OnMouseDown;
form.MouseUp += Core_OnMouseUp;
form.MouseWheel += Core_OnMouseWheel;
form.MouseMove += Core_OnMouseMove;
form.SizeChanged += Core_OnSizeChanged;
form.Move += Core_OnMove;
//form.Activated += Core_OnActivated; // a panel cannot handle this event.
//form.Deactivate += Core_OnDeactivate; // a panel cannot handle this event.
form.GotFocus += Core_OnGotFocus;
form.LostFocus += Core_OnLostFocus;
form.KeyDown += Core_OnKeyDown;
form.KeyUp += Core_OnKeyUp;
//form.FormClosing += Core_OnClose; // a panel cannot handle this event.
form.Click += Core_OnClick;
}
}
public static bool LoopAGK()
{
Application.DoEvents();
if (Agk.IsCapturingImage() > 0)
System.Threading.Thread.Sleep(10);
return !m_bBreakLoop;
}
public static void CleanUp()
{
Agk.CleanUp();
}
}
}
Share your knowledge. It\'s a way to achieve immortality.
(Tenzin Gyatso)

