|
|
|
using DotSDL.Events;
|
|
|
|
using DotSDL.Graphics;
|
|
|
|
using DotSDL.Input.Keyboard;
|
|
|
|
using System;
|
|
|
|
using System.Numerics;
|
|
|
|
|
|
|
|
namespace Sample.Sprites {
|
|
|
|
public class Window : SdlWindow {
|
|
|
|
//private int _camX = 0, _camY = 0, _deltaX = 2, _deltaY = 1;
|
|
|
|
private Player _player1, _player2;
|
|
|
|
private Point _player1Delta, _player2Delta;
|
|
|
|
|
|
|
|
public Window(int scale) : base("Sprites Test",
|
|
|
|
new Point(WindowPosUndefined, WindowPosUndefined),
|
|
|
|
256 * scale, 196 * scale,
|
|
|
|
256, 196) {
|
|
|
|
KeyPressed += OnKeyPressed;
|
|
|
|
KeyReleased += OnKeyReleased;
|
|
|
|
|
|
|
|
Background.Height = Background.Width = 1024;
|
|
|
|
|
|
|
|
GenerateBackground();
|
|
|
|
GeneratePlayers();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void GenerateBackground() {
|
|
|
|
// Draw colored, diagonal strips across the entire background canvas.
|
|
|
|
var stripRef = new Color[Background.Width * 2];
|
|
|
|
for(var i = 0; i < Background.Width * 2; i++) {
|
|
|
|
stripRef[i].R = (byte)(Math.Abs(i % 511 - 255) / 2);
|
|
|
|
stripRef[i].G = (byte)(80 / (stripRef[i].R + 4) / 2);
|
|
|
|
stripRef[i].B = (byte)(120 * (Math.Sin(i * Math.PI / 128 + 256) * 0.2 + 0.8));
|
|
|
|
}
|
|
|
|
|
|
|
|
for(var y = 0; y < Background.Height; y++) {
|
|
|
|
var stripIdx = y % Background.Width;
|
|
|
|
for(var x = 0; x < Background.Width; x++) {
|
|
|
|
var pix = y * Background.Width + x;
|
|
|
|
Background.Pixels[pix] = stripRef[stripIdx + x];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Darken every other layer, because why not. :)
|
|
|
|
for(var y = 2; y < Background.Height; y += 2) {
|
|
|
|
for(var x = 0; x < Background.Width; x++) {
|
|
|
|
var pix = Background.Width * y + x;
|
|
|
|
Background.Pixels[pix].R = (byte)(Background.Pixels[pix].R * 0.8);
|
|
|
|
Background.Pixels[pix].G = (byte)(Background.Pixels[pix].G * 0.8);
|
|
|
|
Background.Pixels[pix].B = (byte)(Background.Pixels[pix].B * 0.8);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Finally, draw a dashed border around the edge to show the edge boundaries.
|
|
|
|
// This routine assumes that the canvas is square.
|
|
|
|
const int lineSize = 7;
|
|
|
|
const int margin = 4;
|
|
|
|
var black = new Color { R = 0, G = 0, B = 0 };
|
|
|
|
var yellow = new Color { R = 255, G = 255, B = 0 };
|
|
|
|
|
|
|
|
for(var i = margin; i < Background.Width - margin; i++) {
|
|
|
|
// Y axis.
|
|
|
|
var activeColor = (i - margin) / lineSize % 2 == 1 ? black : yellow;
|
|
|
|
|
|
|
|
var pix = Background.Width * i + margin;
|
|
|
|
Background.Pixels[pix] = activeColor;
|
|
|
|
pix = Background.Width * i + Background.Width - 1 - margin;
|
|
|
|
Background.Pixels[pix] = activeColor;
|
|
|
|
|
|
|
|
// X axis.
|
|
|
|
activeColor = (i - margin) / lineSize % 2 == 1 ? yellow : black;
|
|
|
|
|
|
|
|
pix = Background.Width * margin + i;
|
|
|
|
Background.Pixels[pix] = activeColor;
|
|
|
|
pix = Background.Width * (Background.Height - 1 - margin) + i;
|
|
|
|
Background.Pixels[pix] = activeColor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void GeneratePlayers() {
|
|
|
|
_player1 = new Player(new Color { R = 255, G = 64, B = 64 }, 2, 1);
|
|
|
|
_player2 = new Player(new Color { R = 64, G = 64, B = 255 }, 3, 2);
|
|
|
|
|
|
|
|
_player1.Position.X = 24;
|
|
|
|
_player1.Position.Y = 24;
|
|
|
|
_player1Delta = new Point();
|
|
|
|
|
|
|
|
_player2.Position.X = 96;
|
|
|
|
_player2.Position.Y = 24;
|
|
|
|
_player2Delta = new Point();
|
|
|
|
|
|
|
|
_player1.Scale.X = 1.5f;
|
|
|
|
|
|
|
|
_player2.ScalingQuality = ScalingQuality.Linear;
|
|
|
|
_player2.Scale.Y = 2.0f;
|
|
|
|
|
|
|
|
Sprites.Add(_player1);
|
|
|
|
Sprites.Add(_player2);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnKeyPressed(object sender, KeyboardEvent e) {
|
|
|
|
switch(e.Keycode) {
|
|
|
|
case Keycode.Escape:
|
|
|
|
Stop();
|
|
|
|
break;
|
|
|
|
case Keycode.W:
|
|
|
|
_player1Delta.Y = -1;
|
|
|
|
break;
|
|
|
|
case Keycode.S:
|
|
|
|
_player1Delta.Y = 1;
|
|
|
|
break;
|
|
|
|
case Keycode.A:
|
|
|
|
_player1Delta.X = -1;
|
|
|
|
break;
|
|
|
|
case Keycode.D:
|
|
|
|
_player1Delta.X = 1;
|
|
|
|
break;
|
|
|
|
case Keycode.Up:
|
|
|
|
_player2Delta.Y = -1;
|
|
|
|
break;
|
|
|
|
case Keycode.Down:
|
|
|
|
_player2Delta.Y = 1;
|
|
|
|
break;
|
|
|
|
case Keycode.Left:
|
|
|
|
_player2Delta.X = -1;
|
|
|
|
break;
|
|
|
|
case Keycode.Right:
|
|
|
|
_player2Delta.X = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnKeyReleased(object sender, KeyboardEvent e) {
|
|
|
|
switch(e.Keycode) {
|
|
|
|
case Keycode.W:
|
|
|
|
case Keycode.S:
|
|
|
|
_player1Delta.Y = 0;
|
|
|
|
break;
|
|
|
|
case Keycode.A:
|
|
|
|
case Keycode.D:
|
|
|
|
_player1Delta.X = 0;
|
|
|
|
break;
|
|
|
|
case Keycode.Up:
|
|
|
|
case Keycode.Down:
|
|
|
|
_player2Delta.Y = 0;
|
|
|
|
break;
|
|
|
|
case Keycode.Left:
|
|
|
|
case Keycode.Right:
|
|
|
|
_player2Delta.X = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void OnUpdate() {
|
|
|
|
_player1.Move(_player1Delta);
|
|
|
|
_player2.Move(_player2Delta);
|
|
|
|
|
|
|
|
/*_camX += _deltaX;
|
|
|
|
_camY += _deltaY;
|
|
|
|
|
|
|
|
if(_camX + Background.Clipping.Size.X >= Background.Width || _camX <= 0)
|
|
|
|
_deltaX = -_deltaX;
|
|
|
|
if(_camY + Background.Clipping.Size.Y >= Background.Height || _camY <= 0)
|
|
|
|
_deltaY = -_deltaY;
|
|
|
|
|
|
|
|
Background.Clipping.Position.X = _camX;
|
|
|
|
Background.Clipping.Position.Y = _camY;*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|