mirror of
https://github.com/iProgramMC/DSGameEngine.git
synced 2025-06-19 09:15:44 -04:00
* Initial commit
This commit is contained in:
commit
39513a07b8
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
keep/*
|
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018-2019 iProgramInCpp
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
140
Makefile
Normal file
140
Makefile
Normal file
@ -0,0 +1,140 @@
|
||||
#---------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
.SECONDARY:
|
||||
|
||||
ifeq ($(strip $(DEVKITARM)),)
|
||||
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
|
||||
endif
|
||||
|
||||
include $(DEVKITARM)/ds_rules
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# TARGET is the name of the output
|
||||
# BUILD is the directory where object files & intermediate files will be placed
|
||||
# SOURCES is a list of directories containing source code
|
||||
# INCLUDES is a list of directories containing extra header files
|
||||
#---------------------------------------------------------------------------------
|
||||
TARGET := $(shell basename $(CURDIR))
|
||||
BUILD := build
|
||||
SOURCES := source
|
||||
DATA :=
|
||||
INCLUDES := include
|
||||
GRAPHICS := data
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
ARCH := -mthumb -mthumb-interwork
|
||||
|
||||
CFLAGS := -g -Wall -O2\
|
||||
-march=armv5te -mtune=arm946e-s -fomit-frame-pointer\
|
||||
-ffast-math \
|
||||
$(ARCH)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DARM9
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=c++11
|
||||
|
||||
ASFLAGS := -g $(ARCH)
|
||||
LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lnds9
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBDIRS := $(LIBNDS)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# no real need to edit anything past this point unless you need to add additional
|
||||
# rules for different file extensions
|
||||
#---------------------------------------------------------------------------------
|
||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir))
|
||||
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
PNGFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.png)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# use CXX for linking C++ projects, CC for standard C
|
||||
#---------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(CPPFILES)),)
|
||||
#---------------------------------------------------------------------------------
|
||||
export LD := $(CC)
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
#---------------------------------------------------------------------------------
|
||||
export LD := $(CXX)
|
||||
#---------------------------------------------------------------------------------
|
||||
endif
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||
$(PNGFILES:.png=.o) \
|
||||
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
|
||||
|
||||
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||
-I$(CURDIR)/$(BUILD)
|
||||
|
||||
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||
|
||||
.PHONY: $(BUILD) clean
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
$(BUILD):
|
||||
@[ -d $@ ] || mkdir -p $@
|
||||
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
clean:
|
||||
@echo clean ...
|
||||
@rm -fr $(BUILD) $(TARGET).elf $(TARGET).nds $(TARGET).ds.gba
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
|
||||
DEPENDS := $(OFILES:.o=.d)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
$(OUTPUT).nds : $(OUTPUT).elf
|
||||
$(OUTPUT).elf : $(OFILES)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.bin.o : %.bin
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $<)
|
||||
@$(bin2o)
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.s %.h : %.png %.grit
|
||||
#---------------------------------------------------------------------------------
|
||||
grit $< -fts -o$*
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------------
|
||||
endif
|
||||
#---------------------------------------------------------------------------------------
|
BIN
OLC_Engine3D_NDS.nds
Normal file
BIN
OLC_Engine3D_NDS.nds
Normal file
Binary file not shown.
BIN
OLC_PlatformGameNDS.nds
Normal file
BIN
OLC_PlatformGameNDS.nds
Normal file
Binary file not shown.
16
README.md
Normal file
16
README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# DSGameEngine
|
||||
A DS game engine based off libnds with frame buffer capabilities for the top screen.
|
||||
|
||||
It includes basic image drawing functions with transparency and flipping, and basic rectangle drawing.
|
||||
|
||||
The graphics work is all done in software, only that the CPU will copy the framebuffer data to the GPU of the Nintendo DS.
|
||||
|
||||
It's quite inefficient, but who needs backgrounds and sprites when you can have this?
|
||||
|
||||
|
||||
This repo will also have examples of programs written based off it.
|
||||
|
||||
The platform game contains sprites from New Super Mario Bros. for the Nintendo DS. I won't provide them here for legal reasons.
|
||||
The 3D engine doesn't contain any other things.
|
||||
|
||||
You need devkitPro (namely devkitARM) to build.
|
362
ds_game_engine.h
Normal file
362
ds_game_engine.h
Normal file
@ -0,0 +1,362 @@
|
||||
#ifndef DS_GAME_ENGINE_INCL
|
||||
#define DS_GAME_ENGINE_INCL
|
||||
|
||||
#define WHITE 0xFFFF
|
||||
#define BLACK 0x0000
|
||||
#define SKY 0xEEEF
|
||||
#define BLUE 0xFC00
|
||||
#define MAGENTA 0xFC1F
|
||||
#define CYAN 0xFFE0
|
||||
|
||||
|
||||
#include <nds.h>
|
||||
|
||||
/*
|
||||
int round(float f){
|
||||
float decpt = f - (int)f;
|
||||
if(decpt < 0.5f){
|
||||
return (int)f;
|
||||
}else{
|
||||
return (int)f+1;
|
||||
}
|
||||
}*/
|
||||
|
||||
short screenbuffer_maindisplay[49152];
|
||||
short screen_width = 256;
|
||||
short screen_height = 192;
|
||||
|
||||
uint32 input_keys = 0;
|
||||
uint32 input_keysUp = 0;
|
||||
uint32 input_keysDown = 0;
|
||||
uint32 input_keysHeld = 0;
|
||||
|
||||
touchPosition touch;
|
||||
PrintConsole bottomScreen;
|
||||
|
||||
bool get_key_state(uint32 button){
|
||||
uint32 s = input_keys & button;
|
||||
if(s){return true;}else{return false;}
|
||||
}
|
||||
bool get_key_down_state(uint32 button){
|
||||
uint32 s = input_keysDown & button;
|
||||
if(s){return true;}else{return false;}
|
||||
}
|
||||
bool get_key_up_state(uint32 button){
|
||||
uint32 s = input_keysUp & button;
|
||||
if(s){return true;}else{return false;}
|
||||
}
|
||||
bool get_key_held_state(uint32 button){
|
||||
uint32 s = input_keysHeld & button;
|
||||
if(s){return true;}else{return false;}
|
||||
}
|
||||
|
||||
void push_frame(){
|
||||
dmaCopy(&screenbuffer_maindisplay, BG_GFX, 49152*2);
|
||||
}
|
||||
|
||||
void clear_screenbuffer(short colour){
|
||||
for(int x = 0; x < 49152; x+=1){
|
||||
screenbuffer_maindisplay[x] = colour;
|
||||
}
|
||||
}
|
||||
|
||||
void fill_rectangle(short colour, int w, int h, int dx, int dy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = colour;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void plot_pixel (int x, int y, short colour){
|
||||
|
||||
if((x) >= 0 && (x) < 256 && (y) >= 0 && (y) < 192){
|
||||
screenbuffer_maindisplay[y*screen_width+x] = colour;
|
||||
}
|
||||
}
|
||||
|
||||
void draw_line (int x1, int y1, int x2, int y2, short col){
|
||||
int x, y, dx, dy, dx1, dy1, px, py, xe, ye, i;
|
||||
dx = x2 - x1; dy = y2 - y1;
|
||||
dx1 = abs(dx); dy1 = abs(dy);
|
||||
px = 2 * dy1 - dx1; py = 2 * dx1 - dy1;
|
||||
if (dy1 <= dx1)
|
||||
{
|
||||
if (dx >= 0)
|
||||
{ x = x1; y = y1; xe = x2; }
|
||||
else
|
||||
{ x = x2; y = y2; xe = x1;}
|
||||
|
||||
plot_pixel(x, y, col);
|
||||
|
||||
for (i = 0; x<xe; i++)
|
||||
{
|
||||
x = x + 1;
|
||||
if (px<0)
|
||||
px = px + 2 * dy1;
|
||||
else
|
||||
{
|
||||
if ((dx<0 && dy<0) || (dx>0 && dy>0)) y = y + 1; else y = y - 1;
|
||||
px = px + 2 * (dy1 - dx1);
|
||||
}
|
||||
plot_pixel(x, y, col);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dy >= 0)
|
||||
{ x = x1; y = y1; ye = y2; }
|
||||
else
|
||||
{ x = x2; y = y2; ye = y1; }
|
||||
|
||||
plot_pixel(x, y, col);
|
||||
|
||||
for (i = 0; y<ye; i++)
|
||||
{
|
||||
y = y + 1;
|
||||
if (py <= 0)
|
||||
py = py + 2 * dx1;
|
||||
else
|
||||
{
|
||||
if ((dx<0 && dy<0) || (dx>0 && dy>0)) x = x + 1; else x = x - 1;
|
||||
py = py + 2 * (dx1 - dy1);
|
||||
}
|
||||
plot_pixel(x, y, col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_triangle (int x1, int y1, int x2, int y2, int x3, int y3, short colour){
|
||||
draw_line (x1, y1, x2, y2, colour);
|
||||
draw_line (x1, y1, x3, y3, colour);
|
||||
draw_line (x3, y3, x2, y2, colour);
|
||||
}
|
||||
|
||||
void fill_triangle (int x1, int y1, int x2, int y2, int x3, int y3, short col){
|
||||
/* Ripped from OneLoneCoder/ConsoleGameEngine */
|
||||
int x, y, dx, dy, dx1, dy1, px, py, xe, ye, i;
|
||||
dx = x2 - x1; dy = y2 - y1;
|
||||
dx1 = abs(dx); dy1 = abs(dy);
|
||||
px = 2 * dy1 - dx1; py = 2 * dx1 - dy1;
|
||||
if (dy1 <= dx1)
|
||||
{
|
||||
if (dx >= 0)
|
||||
{ x = x1; y = y1; xe = x2; }
|
||||
else
|
||||
{ x = x2; y = y2; xe = x1;}
|
||||
|
||||
plot_pixel(x, y, col);
|
||||
draw_line(x, y, x3, y3, col);
|
||||
|
||||
for (i = 0; x<xe; i++)
|
||||
{
|
||||
x = x + 1;
|
||||
if (px<0)
|
||||
px = px + 2 * dy1;
|
||||
else
|
||||
{
|
||||
if ((dx<0 && dy<0) || (dx>0 && dy>0)) y = y + 1; else y = y - 1;
|
||||
px = px + 2 * (dy1 - dx1);
|
||||
}
|
||||
plot_pixel(x, y, col);
|
||||
draw_line(x, y, x3, y3, col);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dy >= 0)
|
||||
{ x = x1; y = y1; ye = y2; }
|
||||
else
|
||||
{ x = x2; y = y2; ye = y1; }
|
||||
|
||||
plot_pixel(x, y, col);
|
||||
draw_line(x, y, x3, y3, col);
|
||||
|
||||
for (i = 0; y<ye; i++)
|
||||
{
|
||||
y = y + 1;
|
||||
if (py <= 0)
|
||||
py = py + 2 * dx1;
|
||||
else
|
||||
{
|
||||
if ((dx<0 && dy<0) || (dx>0 && dy>0)) x = x + 1; else x = x - 1;
|
||||
py = py + 2 * (dx1 - dy1);
|
||||
}
|
||||
plot_pixel(x, y, col);
|
||||
draw_line(x, y, x3, y3, col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_image_sizable(short* image, int w, int h, int dx, int dy, int dw, int dh){
|
||||
/*float pixel_width = dw / w;
|
||||
float pixel_height= dh / h;
|
||||
|
||||
for(int y = 0; y < dh; y++){
|
||||
for(int x = 0; x < dw; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
int src_y = round(y * pixel_height);
|
||||
int src_x = round(x * pixel_width);
|
||||
screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[(src_y*w+src_x)];
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
int w2 = dw, w1 = w, h2 = dh, h1 = h;
|
||||
|
||||
// EDIT: added +1 to account for an early rounding problem
|
||||
int x_ratio = (int)((w1<<16)/w2) +1;
|
||||
int y_ratio = (int)((h1<<16)/h2) +1;
|
||||
|
||||
int x2, y2 ;
|
||||
for (int i=0;i<h2;i++) {
|
||||
for (int j=0;j<w2;j++) {
|
||||
x2 = ((j*x_ratio)>>16) ;
|
||||
y2 = ((i*y_ratio)>>16) ;
|
||||
if((j+dx) >= 0 && (j+dx) < 256 && (i+dy) >= 0 && (i+dy) < 192){
|
||||
screenbuffer_maindisplay[(i+dy)*screen_width+(j+dx)] = image[(y2*w1)+x2] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_image(short* image, int w, int h, int dx, int dy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
if(image[y*w+x] == -993){}else{screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[y*w+x];}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_image_wsr(short* image, int w, int h, int dx, int dy, int sx, int sy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
if(image[(sy+y)*w+(sx+x)] == -993){}else{screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[(sy+y)*w+(sx+x)];}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_image_flipped_v(short* image, int w, int h, int dx, int dy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
if(image[(h-y-1)*w+x] == -993){}else{screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[(h-y-1)*w+x];}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void draw_image_flipped_hv(short* image, int w, int h, int dx, int dy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
if(image[(h-y)*w+(w-x-1)] == -993){}else{screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[(h-y)*w+(w-x-1)];}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void draw_image_flipped_h(short* image, int w, int h, int dx, int dy){
|
||||
for(int y = 0; y < h; y++){
|
||||
for(int x = 0; x < w; x++){
|
||||
if((x+dx) >= 0 && (x+dx) < 256 && (y+dy) >= 0 && (y+dy) < 192){
|
||||
if(image[y*w+(w-x-1)] == -993){}else{screenbuffer_maindisplay[(dy+y)*screen_width+(x+dx)] = image[y*w+(w-x-1)];}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnUserCreate();
|
||||
void OnUserUpdate();
|
||||
|
||||
void make_btm_screen() {consoleSelect(&bottomScreen);}
|
||||
void printchar(char x, char y, char c) { printf("\x1b[%d;%dH%c", y, x, c); }
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
int main(void) {
|
||||
//---------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
videoSetMode(MODE_5_2D);
|
||||
videoSetModeSub(MODE_0_2D);
|
||||
|
||||
vramSetBankA(VRAM_A_MAIN_BG);
|
||||
vramSetBankC(VRAM_C_SUB_BG);
|
||||
|
||||
bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0,0);
|
||||
|
||||
//consoleInit(&topScreen, 3,BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true);
|
||||
consoleInit(&bottomScreen, 3,BgType_Text4bpp, BgSize_T_256x256, 31, 0, false, true);
|
||||
|
||||
make_btm_screen();
|
||||
|
||||
OnUserCreate();
|
||||
|
||||
clear_screenbuffer(0xEEEE);
|
||||
|
||||
while(1) {
|
||||
touchRead(&touch);
|
||||
scanKeys();
|
||||
|
||||
input_keys = keysCurrent();
|
||||
input_keysUp = keysUp();
|
||||
input_keysDown = keysDown();
|
||||
input_keysHeld = keysHeld();
|
||||
|
||||
OnUserUpdate();
|
||||
swiWaitForVBlank();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
|
||||
if (dx >= dy){
|
||||
float y = 0.0f;
|
||||
if(x1 < x2){
|
||||
for (int x = x1; x <= x2; x++) {
|
||||
y = y1 + dy * (x - x1) / dx;
|
||||
plot_pixel(x, y, colour);
|
||||
}
|
||||
}else{
|
||||
for (int x = x2; x <= x1; x++) {
|
||||
y = y1 + dy * (x - x1) / dx;
|
||||
plot_pixel(x, y, colour);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
float x = 0.0f;
|
||||
if(dx == 0){
|
||||
if(y1 < y2){
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
plot_pixel(x1, y, colour);
|
||||
}
|
||||
}else{
|
||||
for (int y = y2; y <= y1; y++) {
|
||||
plot_pixel(x2, y, colour);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(y1 < y2){
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
x = x1 + dx * (y - y1) / dy;
|
||||
plot_pixel(x, y, colour);
|
||||
}
|
||||
}else{
|
||||
for (int y = y2; y <= y1; y++) {
|
||||
x = x1 + dx * (y - y1) / dy;
|
||||
plot_pixel(x, y, colour);
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
#endif
|
186
ds_olcEngine3D.cpp
Normal file
186
ds_olcEngine3D.cpp
Normal file
@ -0,0 +1,186 @@
|
||||
/*---------------------------------------------------------------------------------
|
||||
|
||||
Simple console print demo which prints to bottom screen
|
||||
and also has a frame buffer for the top screen to which
|
||||
you can draw stuff
|
||||
-- iProgramMC - Graphics Engine
|
||||
-- dovoto - Console bottom screen print
|
||||
|
||||
---------------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "block.h"
|
||||
#include "brick.h"
|
||||
#include "coin.h"
|
||||
#include "dirt.h"
|
||||
#include "door.h"
|
||||
#include "ground.h"
|
||||
#include "mariojump.h"
|
||||
#include "mariostill.h"
|
||||
#include "question.h"
|
||||
#include "usedblock.h"
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "ds_game_engine.h"
|
||||
|
||||
struct vec3d
|
||||
{
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
struct triangle
|
||||
{
|
||||
vec3d p[3];
|
||||
};
|
||||
|
||||
struct mesh
|
||||
{
|
||||
std::vector<triangle> tris;
|
||||
};
|
||||
|
||||
struct mat4x4
|
||||
{
|
||||
float m[4][4] = {0};
|
||||
};
|
||||
|
||||
mesh meshCube;
|
||||
mat4x4 matProj;
|
||||
|
||||
float fTheta;
|
||||
|
||||
void MultiplyMatrixVector (vec3d &i, vec3d &o, mat4x4 &m){
|
||||
|
||||
o.x = i.x * m.m[0][0] + i.y * m.m[1][0] + i.z * m.m[2][0] + m.m[3][0];
|
||||
o.y = i.x * m.m[0][1] + i.y * m.m[1][1] + i.z * m.m[2][1] + m.m[3][1];
|
||||
o.z = i.x * m.m[0][2] + i.y * m.m[1][2] + i.z * m.m[2][2] + m.m[3][2];
|
||||
float w = i.x * m.m[0][3] + i.y * m.m[1][3] + i.z * m.m[2][3] + m.m[3][3];
|
||||
|
||||
if (w != 0.0f)
|
||||
{
|
||||
o.x /= w; o.y /= w; o.z /= w;
|
||||
}
|
||||
}
|
||||
|
||||
int ScreenWidth() {return 256;}
|
||||
int ScreenHeight(){return 192;}
|
||||
|
||||
|
||||
void OnUserCreate()
|
||||
{
|
||||
|
||||
meshCube.tris = {
|
||||
|
||||
// SOUTH
|
||||
{ 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
|
||||
// EAST
|
||||
{ 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f },
|
||||
{ 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
|
||||
|
||||
// NORTH
|
||||
{ 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f },
|
||||
{ 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f },
|
||||
|
||||
// WEST
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
|
||||
|
||||
// TOP
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
|
||||
{ 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f },
|
||||
|
||||
// BOTTOM
|
||||
{ 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
|
||||
{ 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
|
||||
};
|
||||
|
||||
|
||||
// Projection Matrix
|
||||
float fNear = 0.1f;
|
||||
float fFar = 1000.0f;
|
||||
float fFov = 90.0f;
|
||||
float fAspectRatio = (float)ScreenHeight() / (float)ScreenWidth();
|
||||
float fFovRad = 1.0f / tanf(fFov * 0.5f / 180.0f * 3.14159f);
|
||||
|
||||
matProj.m[0][0] = fAspectRatio * fFovRad;
|
||||
matProj.m[1][1] = fFovRad;
|
||||
matProj.m[2][2] = fFar / (fFar - fNear);
|
||||
matProj.m[3][2] = (-fFar * fNear) / (fFar - fNear);
|
||||
matProj.m[2][3] = 1.0f;
|
||||
matProj.m[3][3] = 0.0f;
|
||||
//iprintf("\n\n\tGraphics Engine\n\tCoded by iProgramMC\n\tMore modern-like\n\tDo whatever you want!");
|
||||
}
|
||||
|
||||
void OnUserUpdate()
|
||||
{
|
||||
clear_screenbuffer(BLACK);
|
||||
|
||||
mat4x4 matRotX, matRotZ;
|
||||
fTheta += 0.01f;
|
||||
|
||||
|
||||
matRotZ.m[0][0] = cosf(fTheta);
|
||||
matRotZ.m[0][1] = sinf(fTheta);
|
||||
matRotZ.m[1][0] = -sinf(fTheta);
|
||||
matRotZ.m[1][1] = cosf(fTheta);
|
||||
matRotZ.m[2][2] = 1;
|
||||
matRotZ.m[3][3] = 1;
|
||||
|
||||
// Rotation X
|
||||
matRotX.m[0][0] = 1;
|
||||
matRotX.m[1][1] = cosf(fTheta * 0.5f);
|
||||
matRotX.m[1][2] = sinf(fTheta * 0.5f);
|
||||
matRotX.m[2][1] = -sinf(fTheta * 0.5f);
|
||||
matRotX.m[2][2] = cosf(fTheta * 0.5f);
|
||||
matRotX.m[3][3] = 1;
|
||||
|
||||
for(auto tri : meshCube.tris){
|
||||
|
||||
triangle triProjected, triTranslated, triRotatedZ, triRotatedZX;
|
||||
|
||||
// Rotate in Z-Axis
|
||||
MultiplyMatrixVector(tri.p[0], triRotatedZ.p[0], matRotZ);
|
||||
MultiplyMatrixVector(tri.p[1], triRotatedZ.p[1], matRotZ);
|
||||
MultiplyMatrixVector(tri.p[2], triRotatedZ.p[2], matRotZ);
|
||||
|
||||
// Rotate in X-Axis
|
||||
MultiplyMatrixVector(triRotatedZ.p[0], triRotatedZX.p[0], matRotX);
|
||||
MultiplyMatrixVector(triRotatedZ.p[1], triRotatedZX.p[1], matRotX);
|
||||
MultiplyMatrixVector(triRotatedZ.p[2], triRotatedZX.p[2], matRotX);
|
||||
|
||||
// Offset into the screen
|
||||
triTranslated = triRotatedZX;
|
||||
triTranslated.p[0].z = triRotatedZX.p[0].z + 3.0f;
|
||||
triTranslated.p[1].z = triRotatedZX.p[1].z + 3.0f;
|
||||
triTranslated.p[2].z = triRotatedZX.p[2].z + 3.0f;
|
||||
|
||||
// Project triangles from 3D --> 2D
|
||||
MultiplyMatrixVector(triTranslated.p[0], triProjected.p[0], matProj);
|
||||
MultiplyMatrixVector(triTranslated.p[1], triProjected.p[1], matProj);
|
||||
MultiplyMatrixVector(triTranslated.p[2], triProjected.p[2], matProj);
|
||||
|
||||
// Scale into view
|
||||
triProjected.p[0].x += 1.0f; triProjected.p[0].y += 1.0f;
|
||||
triProjected.p[1].x += 1.0f; triProjected.p[1].y += 1.0f;
|
||||
triProjected.p[2].x += 1.0f; triProjected.p[2].y += 1.0f;
|
||||
triProjected.p[0].x *= 0.5f * (float)ScreenWidth();
|
||||
triProjected.p[0].y *= 0.5f * (float)ScreenHeight();
|
||||
triProjected.p[1].x *= 0.5f * (float)ScreenWidth();
|
||||
triProjected.p[1].y *= 0.5f * (float)ScreenHeight();
|
||||
triProjected.p[2].x *= 0.5f * (float)ScreenWidth();
|
||||
triProjected.p[2].y *= 0.5f * (float)ScreenHeight();
|
||||
|
||||
// Rasterize triangle
|
||||
draw_triangle(triProjected.p[0].x, triProjected.p[0].y,
|
||||
triProjected.p[1].x, triProjected.p[1].y,
|
||||
triProjected.p[2].x, triProjected.p[2].y, WHITE);
|
||||
}
|
||||
|
||||
push_frame();
|
||||
}
|
298
ds_olc_platformer.c
Normal file
298
ds_olc_platformer.c
Normal file
@ -0,0 +1,298 @@
|
||||
/*---------------------------------------------------------------------------------
|
||||
|
||||
Simple console print demo which prints to bottom screen
|
||||
and also has a frame buffer for the top screen to which
|
||||
you can draw stuff
|
||||
-- iProgramInCpp - Graphics Engine
|
||||
-- dovoto - Console bottom screen print
|
||||
|
||||
---------------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "block.h"
|
||||
#include "brick.h"
|
||||
#include "coin.h"
|
||||
#include "dirt.h"
|
||||
#include "door.h"
|
||||
#include "ground.h"
|
||||
#include "mariojump.h"
|
||||
#include "mariostill.h"
|
||||
#include "question.h"
|
||||
#include "usedblock.h"
|
||||
|
||||
|
||||
#include "ds_game_engine.h"
|
||||
|
||||
|
||||
char sLevel[] = "................................................................"
|
||||
"................................................................"
|
||||
".......ooooo...................................................."
|
||||
"........ooo....................................................."
|
||||
".......................########................................."
|
||||
".....BB?BBBB?BB.......###..............#.#......................"
|
||||
"....................###................#.#......................"
|
||||
"...................####........................................."
|
||||
"GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG.##############.....########"
|
||||
"...................................#.#...............###........"
|
||||
"........................############.#............###..........."
|
||||
"........................#............#.........###.............."
|
||||
"........................#.############......###................."
|
||||
"........................#................###...................."
|
||||
"........................#################......................."
|
||||
"................................................................";
|
||||
int nLevelWidth;
|
||||
int nLevelHeight;
|
||||
|
||||
const char TileSize = 8; //8px wide
|
||||
|
||||
short block_image[256];
|
||||
short brick_image[256];
|
||||
short coin_image[256];
|
||||
short dirt_image[256];
|
||||
short door_image[256];
|
||||
short ground_image[256];
|
||||
short question_image[256];
|
||||
short mariojump_image[384];
|
||||
short mariostill_image[384];
|
||||
short usedblock_image[256];
|
||||
|
||||
bool bPlayerOnGround = false;
|
||||
|
||||
int nDirModX = 0, nDirModY = 0;
|
||||
|
||||
float fCameraPosX = 0.0f, fCameraPosY = 0.0f;
|
||||
float fPlayerPosX = 0.0f, fPlayerPosY = 0.0f;
|
||||
float fPlayerVelX = 0.0f, fPlayerVelY = 0.0f;
|
||||
|
||||
unsigned short rng;
|
||||
|
||||
short sky_colour = 0xEEEF;
|
||||
|
||||
uint32 global_timer = 0;
|
||||
|
||||
char ticks = 0;
|
||||
|
||||
unsigned short rng_function(unsigned short input){
|
||||
if(input == 0x560A) input=0;
|
||||
unsigned short S0 = (unsigned char)input<<8;
|
||||
S0 = S0 ^ input;
|
||||
input = ((S0 & 0xFF) << 8) | ((S0 & 0xFF00) >> 8);
|
||||
S0 = ((unsigned char)S0 << 1) ^ input;
|
||||
short S1 = (S0 >> 1) ^ 0xFF80;
|
||||
if((S0 & 1) == 0){
|
||||
if(S1 == 0xAA55){input = 0;}else{input=S1 ^ 0x1FF4;}
|
||||
}else{
|
||||
input = S1 ^ 0x1FF4;
|
||||
}
|
||||
return (unsigned short)input;
|
||||
}
|
||||
|
||||
void rng_update() {
|
||||
rng = rng_function(global_timer);
|
||||
}
|
||||
|
||||
char GetTile(int x, int y){
|
||||
if(x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight){
|
||||
return sLevel[y*nLevelWidth+x];
|
||||
}else{
|
||||
return ' ';
|
||||
}
|
||||
}
|
||||
|
||||
void SetTile(char c, int x, int y){
|
||||
if(x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight){
|
||||
sLevel[y*nLevelWidth+x] = c;
|
||||
}
|
||||
}
|
||||
|
||||
void make_btm_screen() {consoleSelect(&bottomScreen);}
|
||||
void printchar(char x, char y, char c) { printf("\x1b[%d;%dH%c", y, x, c); }
|
||||
|
||||
void OnUserCreate()
|
||||
{
|
||||
nLevelWidth = 64;
|
||||
nLevelHeight = 16;
|
||||
|
||||
decompress(blockBitmap, &block_image, LZ77);
|
||||
decompress(brickBitmap, &brick_image, LZ77);
|
||||
decompress(coinBitmap, &coin_image, LZ77);
|
||||
decompress(dirtBitmap, &dirt_image, LZ77);
|
||||
decompress(doorBitmap, &door_image, LZ77);
|
||||
decompress(groundBitmap, &ground_image, LZ77);
|
||||
decompress(questionBitmap, &question_image, LZ77);
|
||||
decompress(usedblockBitmap, &usedblock_image, LZ77);
|
||||
decompress(mariostillBitmap, &mariostill_image, LZ77);
|
||||
decompress(mariojumpBitmap, &mariojump_image, LZ77);
|
||||
iprintf("\n\n\tGraphics Engine\n\tCoded by iProgramInCpp\n\tMore modern-like\n\tDo whatever you want!");
|
||||
}
|
||||
|
||||
void OnUserUpdate()
|
||||
{
|
||||
clear_screenbuffer(sky_colour);
|
||||
|
||||
|
||||
//fPlayerVelX = 0.0f;
|
||||
//fPlayerVelY = 0.0f;
|
||||
|
||||
//Handle
|
||||
if(get_key_state(KEY_UP)){
|
||||
fPlayerVelY = -6.0f;
|
||||
}
|
||||
if(get_key_state(KEY_DOWN)){
|
||||
fPlayerVelY = 6.0f;
|
||||
}
|
||||
if(get_key_state(KEY_LEFT)){
|
||||
nDirModY = 1;
|
||||
fPlayerVelX += (bPlayerOnGround ?-6.0f :-4.0f) * 0.01664f;
|
||||
}
|
||||
if(get_key_state(KEY_RIGHT)){
|
||||
nDirModY = 0;
|
||||
fPlayerVelX += (bPlayerOnGround ? 6.0f : 4.0f) * 0.01664f;
|
||||
}
|
||||
if(get_key_down_state(KEY_B)){
|
||||
if(bPlayerOnGround){
|
||||
fPlayerVelY = -12.0f;
|
||||
nDirModX = 1;
|
||||
}
|
||||
}
|
||||
|
||||
fPlayerVelY += 20.0f * 0.01664f;
|
||||
|
||||
if(bPlayerOnGround){
|
||||
fPlayerVelX += -3.0f * fPlayerVelX * 0.01664f;
|
||||
if(fabs(fPlayerVelX) < 0.01f){
|
||||
fPlayerVelX = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if(fPlayerVelX > 10.0f) fPlayerVelX = 10.0f;
|
||||
if(fPlayerVelX < -10.0f) fPlayerVelX = -10.0f;
|
||||
if(fPlayerVelY > 100.0f) fPlayerVelY = 100.0f;
|
||||
if(fPlayerVelY < -100.0f) fPlayerVelY = -100.0f;
|
||||
|
||||
float fNewPlayerPosX = fPlayerPosX + fPlayerVelX * 0.01664f;
|
||||
float fNewPlayerPosY = fPlayerPosY + fPlayerVelY * 0.01664f;
|
||||
|
||||
if(GetTile(fNewPlayerPosX + 0.0f, fNewPlayerPosY + 0.0f) == 'o')
|
||||
SetTile('.', fNewPlayerPosX + 0.0f, fNewPlayerPosY + 0.0f);
|
||||
if(GetTile(fNewPlayerPosX + 0.0f, fNewPlayerPosY + 1.0f) == 'o')
|
||||
SetTile('.', fNewPlayerPosX + 0.0f, fNewPlayerPosY + 1.0f);
|
||||
if(GetTile(fNewPlayerPosX + 1.0f, fNewPlayerPosY + 0.0f) == 'o')
|
||||
SetTile('.', fNewPlayerPosX + 1.0f, fNewPlayerPosY + 0.0f);
|
||||
if(GetTile(fNewPlayerPosX + 1.0f, fNewPlayerPosY + 1.0f) == 'o')
|
||||
SetTile('.', fNewPlayerPosX + 1.0f, fNewPlayerPosY + 1.0f);
|
||||
|
||||
|
||||
//Collision
|
||||
if(fPlayerVelX <= 0){
|
||||
if(GetTile(fNewPlayerPosX + 0.0f, fPlayerPosY + 0.0f) != '.' ||
|
||||
GetTile(fNewPlayerPosX + 0.0f, fPlayerPosY + 0.9f) != '.'){
|
||||
fNewPlayerPosX = (int)fNewPlayerPosX + 1;
|
||||
fPlayerVelX = 0;
|
||||
}
|
||||
}else{
|
||||
if(GetTile(fNewPlayerPosX + 1.0f, fPlayerPosY + 0.0f) != '.' ||
|
||||
GetTile(fNewPlayerPosX + 1.0f, fPlayerPosY + 0.9f) != '.'){
|
||||
fNewPlayerPosX = (int)fNewPlayerPosX;
|
||||
fPlayerVelX = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bPlayerOnGround = false;
|
||||
if(fPlayerVelY <= 0){
|
||||
if(GetTile(fNewPlayerPosX + 0.0f, fNewPlayerPosY) != '.' ||
|
||||
GetTile(fNewPlayerPosX + 0.9f, fNewPlayerPosY) != '.'){
|
||||
fNewPlayerPosY = (int)fNewPlayerPosY + 1;
|
||||
fPlayerVelY = 0;
|
||||
}
|
||||
}else{
|
||||
if(GetTile(fNewPlayerPosX + 0.0f, fNewPlayerPosY+1) != '.' ||
|
||||
GetTile(fNewPlayerPosX + 0.9f, fNewPlayerPosY+1) != '.'){
|
||||
fNewPlayerPosY = (int)fNewPlayerPosY;
|
||||
fPlayerVelY = 0;
|
||||
bPlayerOnGround = true;
|
||||
nDirModX = 0;
|
||||
}
|
||||
}
|
||||
//nDirModX = !bPlayerOnGround;
|
||||
|
||||
fPlayerPosX = fNewPlayerPosX;
|
||||
fPlayerPosY = fNewPlayerPosY;
|
||||
|
||||
fCameraPosX = fPlayerPosX;
|
||||
fCameraPosY = fPlayerPosY;
|
||||
|
||||
//Draw Level
|
||||
int nTileWidth = 16;
|
||||
int nTileHeight = 16;
|
||||
int nVisibleTilesX = SCREEN_WIDTH / nTileWidth;
|
||||
int nVisibleTilesY = SCREEN_HEIGHT/nTileHeight;
|
||||
|
||||
float fOffsetX = fCameraPosX - (float)nVisibleTilesX / 2.0f;
|
||||
float fOffsetY = fCameraPosY - (float)nVisibleTilesY / 2.0f;
|
||||
|
||||
if(fOffsetX <= 0.0f) fOffsetX = 0.0f;
|
||||
if(fOffsetY <= 0.0f) fOffsetY = 0.0f;
|
||||
if(fOffsetX > (float)(nLevelWidth - nVisibleTilesX)) fOffsetX = nLevelWidth - nVisibleTilesX;
|
||||
if(fOffsetY > (float)(nLevelHeight- nVisibleTilesY)) fOffsetY = nLevelHeight- nVisibleTilesY;
|
||||
|
||||
float fTileOffsetX = (fOffsetX - (int)fOffsetX) * nTileWidth;
|
||||
float fTileOffsetY = (fOffsetY - (int)fOffsetY) * nTileHeight;
|
||||
|
||||
|
||||
for(int x = -1; x < nVisibleTilesX+1; x++){
|
||||
for(int y = -1; y < nVisibleTilesY+1; y++){
|
||||
char sTileID = GetTile(x + fOffsetX, y+fOffsetY);
|
||||
|
||||
switch(sTileID){
|
||||
case '.':
|
||||
break;
|
||||
case '#':
|
||||
draw_image(block_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'o':
|
||||
draw_image(coin_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case '?':
|
||||
draw_image(question_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'B':
|
||||
draw_image(brick_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'G':
|
||||
draw_image(ground_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'D':
|
||||
draw_image(dirt_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'E':
|
||||
draw_image(door_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
case 'U':
|
||||
draw_image(usedblock_image, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
default:
|
||||
fill_rectangle(0x0000, nTileWidth, nTileHeight, x*nTileWidth-fTileOffsetX,y*nTileHeight-fTileOffsetY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(nDirModX){
|
||||
if(nDirModY){
|
||||
draw_image_flipped_h(mariojump_image, nTileWidth, 24, (fPlayerPosX - fOffsetX)*nTileWidth, (fPlayerPosY - fOffsetY)*nTileHeight-8);
|
||||
}else{
|
||||
draw_image(mariojump_image, nTileWidth, 24, (fPlayerPosX - fOffsetX)*nTileWidth, (fPlayerPosY - fOffsetY)*nTileHeight-8);
|
||||
}
|
||||
}else{
|
||||
if(nDirModY){
|
||||
draw_image_flipped_h(mariostill_image, nTileWidth, 24, (fPlayerPosX - fOffsetX)*nTileWidth, (fPlayerPosY - fOffsetY)*nTileHeight-8);
|
||||
}else{
|
||||
draw_image(mariostill_image, nTileWidth, 24, (fPlayerPosX - fOffsetX)*nTileWidth, (fPlayerPosY - fOffsetY)*nTileHeight-8);
|
||||
}
|
||||
}
|
||||
|
||||
push_frame();
|
||||
}
|
1
keep
Submodule
1
keep
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1295f24e03d12a8bf80394ab5933f727ca22097c
|
Loading…
Reference in New Issue
Block a user