LoginSignup
9
9

More than 5 years have passed since last update.

SDL2でも増殖するD言語くん

Posted at

D言語くんかわいい

dman_sdl.gif

ソースコードです

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言語くんかわいい

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9