#D言語くんかわいい
app.d
import derelict.sdl2.sdl;
import derelict.sdl2.image;
import std.random;
import std.math;
import std.algorithm.iteration;
import window;
import texture;
import surface;
import manager;
import input;
import event;
import vector;
enum WINDOW_WIDTH = 640;
enum WINDOW_HEIGHT = 480;
enum DMAN_SIZE = 100;
enum SPEED_MAX = 10.0;
enum SPIN_MAX = 10.0;
enum DMAN_NUM = 100;
static this()
{
//いろいろ読み込んで初期化
DerelictSDL2.load();
SDL_Init(SDL_INIT_VIDEO);
DerelictSDL2Image.load();
IMG_Init(IMG_INIT_PNG);
}
void main()
{
auto win = new Window("D言語くん",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH,
WINDOW_HEIGHT,
SDL_WINDOW_SHOWN,
SDL_RENDERER_ACCELERATED);
auto tex = win.createTexture(new Surface("dman.png"));
auto key = new Key;
SDL_Event e;
Dman[] dmans;
foreach(i;0..DMAN_NUM)
dmans ~= new Dman(tex);
bool running = true;
while(running)
{
SDL_Delay(16);
update(key); //キー入力状態のアップデート
if (key[SDL_SCANCODE_ESCAPE] > 0)
running = false; //Esc押すと終了
win.clear; //画面をクリアー
dmans.each!(a => a.update(win));
win.present; //反映
}
}
class Dman
{
Vector!float vector; //移動ベクトル
double spin; //角速度
double angel; //角度
float x,y; //座標
Texture tex; //テクスチャ
this(Texture tex)
{
this.tex = tex;
init();
}
void init()
{
vector = Vector!float(uniform(-SPEED_MAX,SPEED_MAX),uniform(-SPEED_MAX,SPEED_MAX));
spin = uniform(-SPIN_MAX,SPIN_MAX);
x = WINDOW_WIDTH / 2 - DMAN_SIZE / 2;
y = WINDOW_HEIGHT / 2 - DMAN_SIZE / 2;
angel = 0.0;
}
void update(Window window)
{
x += vector.x;
y += vector.y;
angel += spin;
//画面外なら初期化して再利用
if (x < 0 - DMAN_SIZE || x > WINDOW_WIDTH + DMAN_SIZE || y < 0 || y - DMAN_SIZE > WINDOW_WIDTH + DMAN_SIZE)
init();
auto rect = const SDL_Rect(cast(int)x,cast(int)y,DMAN_SIZE,DMAN_SIZE);
//SDL_RenderCopyExと同じ
window.drawEx(tex,null,&rect,angel,null,SDL_FLIP_NONE);
}
}
作りかけのSDL2のラッパライブラリみたいなの使ってます。GitHubに上げるつもりです。D言語くんかわいい