mirror of
https://github.com/Kapendev/parin.git
synced 2025-04-25 12:39:54 +03:00
New engine flag and some other stuff.
This commit is contained in:
parent
ce52c4cee4
commit
cb0cb5a904
5 changed files with 72 additions and 38 deletions
|
@ -5,7 +5,7 @@ import parin;
|
|||
auto atlas = TextureId();
|
||||
auto map = TileMap();
|
||||
auto camera = Camera(0, 0, true);
|
||||
auto tile = Tile(16, 16, 145);
|
||||
auto tile = Tile(16, 145);
|
||||
auto tileFlip = Flip.none;
|
||||
|
||||
void ready() {
|
||||
|
@ -24,15 +24,15 @@ bool update(float dt) {
|
|||
foreach (point; map.gridPoints(camera.area)) {
|
||||
if (map[point] < 0) continue;
|
||||
auto area = Rect(map.toWorldPoint(point), map.tileSize);
|
||||
while (area.hasIntersection(tile.area)) {
|
||||
while (area.hasIntersection(Rect(tile.position, tile.size))) {
|
||||
tile.position -= wasd * Vec2(dt);
|
||||
camera.position = tile.position + tile.size * Vec2(0.5f);
|
||||
}
|
||||
}
|
||||
// Draw the world.
|
||||
camera.attach();
|
||||
drawTile(atlas, tile, DrawOptions(tileFlip));
|
||||
drawTileMap(atlas, map, camera);
|
||||
drawTile(atlas, tile, DrawOptions(tileFlip));
|
||||
camera.detach();
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
[default]
|
||||
-I=../../source
|
||||
-L=-lraylib
|
||||
-D=-betterC
|
||||
-R=../../assets/parin_atlas.png
|
||||
# Those lines work for me. Use -s=custom to fix any errors.
|
||||
-I=../../../joka/source
|
||||
|
@ -11,3 +12,5 @@
|
|||
[custom]
|
||||
-I=../../source
|
||||
-L=-lraylib
|
||||
-D=-betterC
|
||||
-R=../../assets/parin_atlas.png
|
||||
|
|
|
@ -30,13 +30,14 @@ enum defaultEngineSoundsCapacity = 64;
|
|||
enum defaultEngineFontsCapacity = 16;
|
||||
|
||||
enum EngineFlag : EngineFlags {
|
||||
none = 0x0000,
|
||||
isUpdating = 0x0001,
|
||||
isUsingAssetsPath = 0x0002,
|
||||
isPixelSnapped = 0x0004,
|
||||
isPixelPerfect = 0x0008,
|
||||
isFullscreen = 0x0010,
|
||||
isCursorVisible = 0x0020,
|
||||
none = 0x0000,
|
||||
isUpdating = 0x0001,
|
||||
isUsingAssetsPath = 0x0002,
|
||||
isPixelSnapped = 0x0004,
|
||||
isPixelPerfect = 0x0008,
|
||||
isEmptyTextureVisible = 0x0010,
|
||||
isFullscreen = 0x0020,
|
||||
isCursorVisible = 0x0040,
|
||||
}
|
||||
|
||||
/// Flipping orientations.
|
||||
|
@ -1319,7 +1320,7 @@ void openWindow(int width, int height, const(IStr)[] args, IStr title = "Parin")
|
|||
// Engine stuff.
|
||||
engineState = cast(EngineState*) jokaMalloc(EngineState.sizeof);
|
||||
jokaMemset(engineState, 0, EngineState.sizeof);
|
||||
engineState.flags |= EngineFlag.isUsingAssetsPath;
|
||||
engineState.flags |= EngineFlag.isUsingAssetsPath | EngineFlag.isEmptyTextureVisible;
|
||||
engineState.borderColor = black;
|
||||
engineState.defaultFilter = Filter.init;
|
||||
engineState.defaultWrap = Wrap.init;
|
||||
|
@ -1347,21 +1348,13 @@ void openWindow(int width, int height, const(IStr)[] args, IStr title = "Parin")
|
|||
rl.UnloadImage(monogramImage);
|
||||
}
|
||||
|
||||
/// Passes C strings to the window arguments.
|
||||
/// You should avoid calling this function manually.
|
||||
extern(C)
|
||||
void openWindowExtraStep(int argc, ICStr* argv) {
|
||||
engineState.envArgsBuffer.clear();
|
||||
foreach (i; 0 .. argc) engineState.envArgsBuffer.append(argv[i].cStrToStr());
|
||||
if (engineState.envArgsBuffer.length) engineState.assetsPath.append(pathConcat(engineState.envArgsBuffer[0].pathDirName, "assets"));
|
||||
}
|
||||
|
||||
/// Opens a window with the specified size and title, using C strings.
|
||||
/// You should avoid calling this function manually.
|
||||
extern(C)
|
||||
void openWindowC(int width, int height, int argc, ICStr* argv, ICStr title = "Parin") {
|
||||
openWindow(width, height, null, title.cStrToStr());
|
||||
openWindowExtraStep(argc, argv);
|
||||
foreach (i; 0 .. argc) engineState.envArgsBuffer.append(argv[i].cStrToStr());
|
||||
if (engineState.envArgsBuffer.length) engineState.assetsPath.append(pathConcat(engineState.envArgsBuffer[0].pathDirName, "assets"));
|
||||
}
|
||||
|
||||
/// Use by the `updateWindow` function.
|
||||
|
@ -1543,6 +1536,21 @@ void setIsPixelPerfect(bool value) {
|
|||
: engineState.flags & ~EngineFlag.isPixelPerfect;
|
||||
}
|
||||
|
||||
|
||||
/// Returns true if drawing is done when an empty texture is used.
|
||||
extern(C)
|
||||
bool isEmptyTextureVisible() {
|
||||
return cast(bool) (engineState.flags & EngineFlag.isEmptyTextureVisible);
|
||||
}
|
||||
|
||||
/// Sets whether drawing should be done when an empty texture is used.
|
||||
extern(C)
|
||||
void setIsEmptyTextureVisible(bool value) {
|
||||
engineState.flags = value
|
||||
? engineState.flags | EngineFlag.isEmptyTextureVisible
|
||||
: engineState.flags & ~EngineFlag.isEmptyTextureVisible;
|
||||
}
|
||||
|
||||
/// Returns true if the application is currently in fullscreen mode.
|
||||
// NOTE: There is a conflict between the flag and real-window-state, which could potentially cause issues for some users.
|
||||
extern(C)
|
||||
|
@ -2267,7 +2275,11 @@ void drawLine(Line area, float size, Rgba color = white) {
|
|||
/// Draws a portion of the specified texture at the given position with the specified draw options.
|
||||
extern(C)
|
||||
void drawTextureAreaX(Texture texture, Rect area, Vec2 position, DrawOptions options = DrawOptions()) {
|
||||
if (texture.isEmpty || area.size.x <= 0.0f || area.size.y <= 0.0f) return;
|
||||
if (area.size.x <= 0.0f || area.size.y <= 0.0f) return;
|
||||
if (texture.isEmpty) {
|
||||
if (isEmptyTextureVisible) drawRect(Rect(position, area.size * options.scale).area(options.hook), red);
|
||||
return;
|
||||
}
|
||||
auto target = Rect(position, area.size * options.scale.abs());
|
||||
auto origin = options.origin.isZero ? target.origin(options.hook) : options.origin;
|
||||
auto flip = options.flip;
|
||||
|
@ -2326,6 +2338,11 @@ void drawTexture(TextureId texture, Vec2 position, DrawOptions options = DrawOpt
|
|||
/// Draws a 9-patch texture from the specified texture area at the given target area.
|
||||
extern(C)
|
||||
void drawTexturePatchX(Texture texture, Rect area, Rect target, bool isTiled, DrawOptions options = DrawOptions()) {
|
||||
if (texture.isEmpty) {
|
||||
if (isEmptyTextureVisible) drawRect(target.area(options.hook), red);
|
||||
return;
|
||||
}
|
||||
|
||||
auto tileSize = (area.size / Vec2(3.0f)).floor();
|
||||
auto hOptions = options;
|
||||
auto vOptions = options;
|
||||
|
@ -2598,10 +2615,9 @@ void drawDebugText(IStr text, Vec2 position, DrawOptions options = DrawOptions()
|
|||
mixin template runGame(alias readyFunc, alias updateFunc, alias finishFunc, int width = 960, int height = 540, IStr title = "Parin") {
|
||||
version (D_BetterC) {
|
||||
extern(C)
|
||||
int main(int argc, immutable(char)** argv) {
|
||||
int main(int argc, const(char)** argv) {
|
||||
alias f = extern(C) bool function(float dt);
|
||||
openWindow(width, height, null, title);
|
||||
openWindowExtraStep(argc, cast(ICStr*) argv);
|
||||
openWindowC(width, height, argc, argv, title);
|
||||
readyFunc();
|
||||
updateWindow(cast(f) &updateFunc);
|
||||
finishFunc();
|
||||
|
|
|
@ -18,26 +18,28 @@ import parin.engine;
|
|||
@safe @nogc nothrow:
|
||||
|
||||
struct Tile {
|
||||
int width = 16;
|
||||
int height = 16;
|
||||
short id;
|
||||
int widthHeight = 16;
|
||||
Vec2 position;
|
||||
short id;
|
||||
|
||||
@safe @nogc nothrow:
|
||||
|
||||
this(int width, int height, short id, Vec2 position = Vec2()) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this(int widthHeight, short id, Vec2 position = Vec2()) {
|
||||
this.widthHeight = widthHeight;
|
||||
this.id = id;
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
Vec2 size() {
|
||||
return Vec2(width, height);
|
||||
int width() {
|
||||
return widthHeight;
|
||||
}
|
||||
|
||||
Rect area() {
|
||||
return Rect(position, size);
|
||||
int height() {
|
||||
return widthHeight;
|
||||
}
|
||||
|
||||
Vec2 size() {
|
||||
return Vec2(widthHeight, widthHeight);
|
||||
}
|
||||
|
||||
Sz row(Sz colCount) {
|
||||
|
@ -49,7 +51,7 @@ struct Tile {
|
|||
}
|
||||
|
||||
Rect textureArea(Sz colCount) {
|
||||
return Rect(col(colCount) * width, row(colCount) * height, width, height);
|
||||
return Rect(col(colCount) * widthHeight, row(colCount) * widthHeight, widthHeight, widthHeight);
|
||||
}
|
||||
|
||||
/// Moves the tile to follow the target position at the specified speed.
|
||||
|
@ -313,7 +315,11 @@ Fault saveTileMap(IStr path, TileMap map) {
|
|||
}
|
||||
|
||||
void drawTileX(Texture texture, Tile tile, DrawOptions options = DrawOptions()) {
|
||||
if (texture.isEmpty || tile.id < 0 || tile.width <= 0 || tile.height <= 0) return;
|
||||
if (tile.id < 0 || tile.width <= 0 || tile.height <= 0) return;
|
||||
if (texture.isEmpty) {
|
||||
if (isEmptyTextureVisible) drawRect(Rect(tile.position, tile.size * options.scale).area(options.hook), green);
|
||||
return;
|
||||
}
|
||||
drawTextureAreaX(texture, tile.textureArea(texture.width / tile.width), tile.position, options);
|
||||
}
|
||||
|
||||
|
@ -322,7 +328,12 @@ void drawTile(TextureId texture, Tile tile, DrawOptions options = DrawOptions())
|
|||
}
|
||||
|
||||
void drawTileMapX(Texture texture, TileMap map, Camera camera, DrawOptions options = DrawOptions()) {
|
||||
if (texture.isEmpty || map.softRowCount == 0 || map.softColCount == 0 || map.tileWidth <= 0 || map.tileHeight <= 0) return;
|
||||
if (map.softRowCount == 0 || map.softColCount == 0 || map.tileWidth <= 0 || map.tileHeight <= 0) return;
|
||||
if (texture.isEmpty) {
|
||||
if (isEmptyTextureVisible) drawRect(Rect(map.position, map.size * options.scale).area(options.hook), red);
|
||||
return;
|
||||
}
|
||||
|
||||
auto topLeftWorldPoint = camera.topLeftPoint;
|
||||
auto bottomRightWorldPoint = camera.bottomRightPoint;
|
||||
auto textureColCount = texture.width / map.tileWidth;
|
||||
|
|
|
@ -147,6 +147,10 @@ struct Sprite {
|
|||
|
||||
void drawSpriteX(Texture texture, Sprite sprite, DrawOptions options = DrawOptions()) {
|
||||
if (sprite.width == 0 || sprite.height == 0) return;
|
||||
if (texture.isEmpty) {
|
||||
if (isEmptyTextureVisible) drawRect(Rect(sprite.position, sprite.size * options.scale).area(options.hook), green);
|
||||
return;
|
||||
}
|
||||
|
||||
auto top = sprite.atlasTop + sprite.animation.frameRow * sprite.height;
|
||||
auto gridWidth = max(texture.width - sprite.atlasLeft, 0) / sprite.width;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue