PlanetSwitch Planet3DS PlanetVita PSP.de PlanetiPhone Classics Forum Handheld-Wiki

PGN-ID:[?] (Nicht eingeloggt)
Login
Registrieren
PlanetDS PlanetGameboy N-Page.de
portablegaming.de  

Zurück   portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung


Development Abteilung Ihr wollt für euren Lieblingshandheld Spiele oder Tools entwickeln?
Bitte die Präfixe benutzen!

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 20.07.2003, 12:58   #1
 
Registriert seit: 27.06.2003
Alter: 34

Vertex hat die Renommee-Anzeige deaktiviert

Standard Von BASIC zu C++

Hi!
Ich gübel jetzt schon seid mehreren Stunden an folgenden Code:
Code:
Graphics 240,160,32,2 
triangle(10,10,60,50,20,100,$FFFFFF) 
WaitKey 
    
Function triangle(x1,y1,x2,y2,x3,y3,col) 
   Local vertices_x[2],vertices_y[2] 
   vertices_x[0]=x1 : vertices_y[0]=y1 
   vertices_x[1]=x2 : vertices_y[1]=y2 
   vertices_x[2]=x3 : vertices_y[2]=y3 
   Local y,c,yy,d,t,x0,a,g0,h,g1,x,w,l 
    
   y=vertices_y[0] 
   For c=1 To 2 
      yy=vertices_y[c] 
      If yy<y Then y=yy : d=c 
   Next 
   c=d : t=c 
    
   While y<160 
      If y=vertices_y[c] Then 
         While y=vertices_y[c] 
            x0=vertices_x[c] Shl 16 : c=c+1 
            If c>2 Then c=a 
            If c=t Then Return 
            If y>vertices_y[c] Then Return 
         Wend 
         h=vertices_y[c]-y 
         g0=((vertices_x[c] Shl 16)-x0)/h 
      EndIf 
       
      If y=vertices_y[d] Then 
         While y=vertices_y[d] 
            x1=vertices_x[d] Shl 16 : d=d-1 
            If d<a Then d=2 
            If y>vertices_x[d] Then Return 
         Wend 
         h=vertices_y[d]-y 
         g1=((vertices_x[d] Shl 16)-x1)/h 
      EndIf 
       
      x=x1 Shr 16 : w=((x0 Shr 16)-x)+1 
      If w>0 And y>-1 And x<240 And x+w>0 Then 
         If x<0 Then w=w+x : x=0 
         If x+w>240 Then w=240-x 
         For l=x To x+w 
            WritePixel l,y,col 
         Next 
      EndIf 
       
      x0=x0+g0 : x1=x1+g1: y=y+1 
   Wend 
End Function
Shr steht für ShiftRIght also >> und Shl für ShiftLeft also <<
Mein Versuch den GBA tauglich zu machen:
Code:
include "gba.h" 
void triangle(int x1,int y1,int x2,int y2,int x3,int y3,u16 color); 

int main(void) 
{ 
    SetMode(MODE_3 | BG2_ENABLE); 
    triangle(10,10,60,50,20,100,0x7C00); 
    while(1); 
} 

void triangle(int x1,int y1,int x2,int y2,int x3,int y3,u16 color) 
{ 
    int vertices_x[3],vertices_y[2]; 
    vertices_x[0]=x1; vertices_y[0]=y1; 
    vertices_x[1]=x2; vertices_y[1]=y2; 
    vertices_x[2]=x3; vertices_y[2]=y3; 
    int y,c,yy,d,t,x0,a,g0,h,g1,x,w,l; 
    
    y=vertices_y[0]; 
    for(c=1;c<2;c++) 
    { 
        yy=vertices_y[c]; 
        if(yy<y) y=yy; d=c; 
    } 
    c=d; t=c; 
    
    while(y<160) 
    { 
        if(y==vertices_y[c]) 
        { 
            while(y==vertices_y[c]) 
            { 
                x0=vertices_x[c]<<16; c++; 
                if(c>2) c=a; 
                if(c=t) return; 
                if(y>vertices_y[c]) return; 
            } 
            h=vertices_y[c]-y; 
            g0=((vertices_x[c]<<16)-x0)/h; 
        } 
        
        if(y==vertices_y[d]) 
        { 
            while(y==vertices_y[d]) 
            { 
                x1=vertices_x[d]<<16; d--; 
                if(d<a) d=2; 
                if(y>vertices_x[d]) return; 
            } 
            h=vertices_y[d]-y; 
            g1=((vertices_x[d]<<16)-x1)/h; 
        } 
        
        x=x1>>16; w=((x0>>16)-x)+1; 
        if(w>0 && y>-1 && x<240 && x+w>0) 
        { 
            if(x<0) w+=x; x=0; 
            if(x+w>240) w=240-x; 
            for(l=x;l<x+w;l++) 
            { 
                VideoBuffer[y*240+l]=color; 
            } 
        } 
        
        x0+=g0; x1+=g1; y++; 
    } 
}
Aber er will leider nicht funktionieren. Er malt nur eine
blaue linie
Das soll ein Scanline algorithmus sein, der ein
Dreieck farbig ausmalt. Event. findet ihr ja den Fehler.
Der obrige BASIC Code funktioniert einwandfrei, nur nicht
eben der C++ Code. Der Compiler meldet auch keine
Fehler oder sonstiges.

Vieleicht kennt ja sogar auch einer von euch schon einen
fertigen Scanlinecode (nur für Triangles, nicht für Polygone mit mehr
als 3 Ecken). ASM wer natürlich ambesten, da es schneller
gehen würde, dass für eine 3D-Engine schon sehr vorteilhaft wäre.

thx!
mfg olli
Vertex ist offline   Mit Zitat antworten
Sponsored Links
Alt 20.07.2003, 14:19   #2
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 04.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard RE: Von BASIC zu C++

Hi!

Auf meiner HP ist in den VectorGfx Demos auch der Code für eine solche Routine mit drin, naja ich habe das in mehre aufgeteilt. Musst du mal im Code wühlen.

Das ist auch ein sehr sehr merkwürdig Basic-Dialekt, oder? Also bestimmt kein Standard Basic. Am besten du überlegst die die funktion der Routine und programmierst sie neu.

mfg
goldmomo ist offline   Mit Zitat antworten
Alt 20.07.2003, 16:59   #3
 
Registriert seit: 27.06.2003
Alter: 34

Vertex hat die Renommee-Anzeige deaktiviert

Standard RE: Von BASIC zu C++

Hi!
Der BASIC-Dialekt ist BlitzBASIC(3D). Ist ganz gut, denn ohne
debuglog für den GBA, macht es sich sehr schlecht, Codes
dafür zu schreiben. Deswegen Code ich immer mein Zeug vorher
in Blitz, da kann ich schnell sehn wo Fehler auftretet, mir Werte
anzeigen etc.

Jedenfalls wegen der Rotine: Auf Deiner Seite habe ich die
Demo gefunden, aber alle ASM also was ich nicht verstehe
Kann leider garnix mit den Befehlen anfangen. Gibt es irgendwo
eine Seite die mal alle Befehle des ASM + Beispiele und Erklährung
in Deutsch aufgelistet hat?
Event. Könntest Du ja folgendes
Code:
fillPoly

	stmfd	sp!,{r0-r6,lr}

	ldr	r0,[pfb_startadr]
	ldr	r1,[pfb_stopadr]
	
	;**** fülle polygon
	
	ldr	r6,[pfb_y1adr]
	ldr	r5,[pfb_y2adr]
		
	ldrh	r2,[r6]			;starty

	add	r0,r0,r2		;set start array offset
	add	r1,r1,r2		;set stop array offset
	
	ldrh	r6,[r5]
	mov	r6,#160
	
dlbu
	ldrb	r3,[r0],1
	ldrb	r4,[r1],1
	
	cmp	r3,#$ff
	beq	nov
	cmp	r4,#$ff
	moveq	r4,r3
	bl	drawHLine
	
nov
	cmp	r2,r6
	add	r2,r2,#1
	bne	dlbu		

	ldmfd	sp!,{r0-r6,pc}
Als Inlinefunktion für C++ machen. Könnte sicher jeder gebrauchen,l
der eine 3D-Engine für den GBA schreiben möchte.

Selber schreiben nunja, könnte ich mal versuchen, aber ich denke
daran würde ich eh scheitern. Ich weiß zwar wie ScanLine algemein
abläuft, aber den Codetechnisch umzusetzen habert es sicherlich.

mfg olli
Vertex ist offline   Mit Zitat antworten
Alt 20.07.2003, 21:21   #4
 
Registriert seit: 27.06.2003
Alter: 34

Vertex hat die Renommee-Anzeige deaktiviert

Standard

Soooooooooo nach jetzt mindestens. 6 Stunden Codedurchgehen
ist mir dieser sch*** verfi** 3 mal durch den Ar** gezogene
Fehler aufgefallen. Bei einzeiligen If anweisung wie z.B.
if(x==1)
darf man nur eine Operation ausführen lassen
if(x==1) c++; d++;
egal ob x=1 ist, oder nicht d wird immer um 1 erhöht.
Nur c++ wird erst dann erhöht, wenn x=1 ist
Also das hätte man doch beim aufstellen der Syntax in C++
mit rein nehmen können
Hier jetzt der funktionelle Code:
Code:
#include "gba.h" 
void triangle(int x1,int y1,int x2,int y2,int x3,int y3,u16 color); 

int main(void) 
{ 
    SetMode(MODE_3 | BG2_ENABLE); 
    triangle(10,10,60,50,20,100,0x7C00); 
    while(1); 
} 

void triangle(int x1,int y1,int x2,int y2,int x3,int y3,u16 color) 
{ 
    int vertices_x[3],vertices_y[3]; 
    vertices_x[0]=x1; vertices_y[0]=y1; 
    vertices_x[1]=x2; vertices_y[1]=y2; 
    vertices_x[2]=x3; vertices_y[2]=y3; 
    int y,c,yy,d,t,x0,a,g0,h,g1,x,w,l;
    
    yy = 0; y=0; d=0; h=0; g0 = 0; g1=0; 
    
    y=vertices_y[0];
    for(c=1;c<3;c++) 
    { 
        yy=vertices_y[c];
        if(yy<y)
        {
            y=yy; d=c;
        }
    } 
    c=d; t=c;
    
    while(y<160) 
    {
        if(y==vertices_y[c]) 
        { 
            while(y==vertices_y[c]) 
            { 
                x0=vertices_x[c]<<16; c++; 
                if(c>2) c=a; 
                if(c==t) return; 
                if(y>vertices_y[c]) return;
            } 
            h=vertices_y[c]-y; 
            g0=((vertices_x[c]<<16)-x0)/h;
        }
        
        if(y==vertices_y[d]) 
        { 
            while(y==vertices_y[d]) 
            { 
                x1=vertices_x[d]<<16; d--; 
                if(d<a) d=2; 
                if(y>vertices_y[d]) return; 
            } 
            h=vertices_y[d]-y; 
            g1=((vertices_x[d]<<16)-x1)/h; 
        } 
        
        x=x1>>16; w=((x0>>16)-x)+1;
        if(w>0 && y>-1 && x<240 && x+w>0) 
        { 
            if(x<0)
            {
                w+=x; x=0;
            }
            if(x+w>240) w=240-x; 
            for(l=x;l<x+w;l++) 
            { 
                VideoBuffer[y*240+l]=color; 
            } 
        } 
        
        x0+=g0; x1+=g1; y++;
    }
}
C++ kann mich mal für Heute an meinem Ar** lecken!
Vertex ist offline   Mit Zitat antworten
Alt 20.07.2003, 23:51   #5
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 04.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Da ist natürlich eine böse Falle, habe es auch nicht gesehen.
Nochmal zu BlitzBasic, gibts das für den GBA? Ich hatte das mal für den Amiga, wäre aber eine nette Sache wenn es das für den GBA gebe. Besonders zum Entwicklen von Routinen ist manchmal Basic ideal, danach kann man sie recht leicht optimiert in Assembler übertragen.

mfg
goldmomo ist offline   Mit Zitat antworten
Alt 21.07.2003, 00:48   #6
 
Registriert seit: 27.06.2003
Alter: 34

Vertex hat die Renommee-Anzeige deaktiviert

Standard

Hi!
Leider gibt BlitzBASIC nur für den PC. Aber zwischen BlitzAmiga
und Blitz3D 1.8.3 liegen mehr als 100 universen
Einzige BASIC Sprache die es für den GBA gibt, ist
DragonBASIC. http://www.simforth.com/
Da es nur ne englische Doku gibt, habe ich mich nicht
weiter damit beschäftigt
mfg olli
Vertex ist offline   Mit Zitat antworten
Alt 21.07.2003, 12:24   #7
ehem. Teammitglied
 
Benutzerbild von Tharo
 
Registriert seit: 02.09.2002
Ort: フランクフルト
Spielt gerade: FF7 Remake

Tharo wird schon bald berühmt werdenTharo wird schon bald berühmt werden

Standard

Wow. Wiedermal hut ab vor deiner Beharrlichkeit aber ob dus glaubst oder nicht: Vor zwei Tagen hatte ich den selben scheiß fehler mit den spartanischen IF Anweisungen auch in php.

IRGENDWO hatte ich mal gelernt das man sowas ruhig schreiben darf. Wo war das? Pascal? JavaScript?

Keine Ahnung ... sorry das ich es nicht selber gesehen hab hätte dir sicher viel mühe erspart.
__________________
Ney ney ney. So viel Sand und keine Förmchen

Code:
Hey DU! Join uns im PG Discord! https://discord.gg/SVqutfFpTc
Tharo ist offline   Mit Zitat antworten
Alt 21.07.2003, 15:54   #8
 
Registriert seit: 27.06.2003
Alter: 34

Vertex hat die Renommee-Anzeige deaktiviert

Standard

Hi!
Jo, aber man kann jetzt auch nix mehr daran ändern, und man
macht diesen Fehler 100pro niewieder
Aber ich habe noch ein anderes Problem, diese Funktion ist
normalerweise für Polygone ausgelegt, und dazu möchte ich
sie auch machen. Aber ich weiß jetzt nicht, wie ich Arrays als
Parameter übergeben kann. Wollte 2 Arrays übergeben, das eine
für x und das andere für y Werte. Aber das ist nicht in meinem
C++ Buch beschrieben wurden.
Der Code:
Code:
#include "gba.h" 
void poly(u16 *Vertices,u16 Count,u16 color); 

int main(void) 
{
    u16 poly_x[4],poly_y[4];
    poly_x[0]=010; poly_y[0]=010;
    poly_x[1]=100; poly_y[1]=010;
    poly_x[2]=100; poly_y[2]=100;
    poly_x[3]=010; poly_y[3]=100;

    SetMode(MODE_3 | BG2_ENABLE); 
    poly(&poly_x[],&poly_y[],4,0x7C00); 
    while(1); 
} 

void poly(u16* vertices_x,u16* vertices_y,u16 count,u16 color) 
{ 
    int y,c,yy,d,t,x0,a,g0,x1,h,g1,x,w,l;
    
    yy=0; y=0; d=0; h=0; g0=0; g1=0; 
    
    count--;
    y=vertices_y[0];
    for(c=1;c<count+1;c++) 
    { 
        yy=vertices_y[c];
        if(yy<y)
        {
            y=yy; d=c;
        }
    } 
    c=d; t=c;
    
    while(y<160) 
    {
        if(y==vertices_y[c]) 
        { 
            while(y==vertices_y[c]) 
            { 
                x0=vertices_x[c]<<16; c++; 
                if(c>count) c=a; 
                if(c==t) return; 
                if(y>vertices_y[c]) return;
            } 
            h=vertices_y[c]-y; 
            g0=((vertices_x[c]<<16)-x0)/h;
        }
        
        if(y==vertices_y[d]) 
        { 
            while(y==vertices_y[d]) 
            { 
                x1=vertices_x[d]<<16; d--; 
                if(d<a) d=count; 
                if(y>vertices_y[d]) return; 
            } 
            h=vertices_y[d]-y; 
            g1=((vertices_x[d]<<16)-x1)/h; 
        } 
        
        x=x1>>16; w=((x0>>16)-x)+1;
        if(w>0 && y>-1 && x<240 && x+w>0) 
        { 
            if(x<0)
            {
                w+=x; x=0;
            }
            if(x+w>240) w=240-x; 
            for(l=x;l<x+w;l++) 
            { 
                VideoBuffer[y*240+l]=color; 
            } 
        } 
        
        x0+=g0; x1+=g1; y++;
    }
}
count gibt die Anzahl an Eckpunkten (Vertices ) an
thx!
mfg olli
Vertex ist offline   Mit Zitat antworten
Alt 21.07.2003, 16:10   #9
ehem. Teammitglied
 
Benutzerbild von Tharo
 
Registriert seit: 02.09.2002
Ort: フランクフルト
Spielt gerade: FF7 Remake

Tharo wird schon bald berühmt werdenTharo wird schon bald berühmt werden

Standard

Hm ajo übergib das Array einfach als Pointer.
Wichtig dabei ist wenn du das Array vor dem Aufruf der Funktion anlegst, das du dir was überlegst wie du später feststellst wo das Array zuende ist.
__________________
Ney ney ney. So viel Sand und keine Förmchen

Code:
Hey DU! Join uns im PG Discord! https://discord.gg/SVqutfFpTc
Tharo ist offline   Mit Zitat antworten
Antwort

  portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sony PSP Basic Pack EGF BAKINK Hardware (PSP) 10 17.04.2006 14:28
Visual Basic Thrall PC/Mac 2 20.02.2005 14:51
Gw-Basic Weißer Drache Sonstiges 0 10.05.2004 15:09
Was ist Dragon Basic? Tharo Development Abteilung 0 02.09.2003 21:14
Einsteigerbuch für Visual Basic mAdDi Development Abteilung 4 28.07.2003 20:35


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:14 Uhr.


Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0
Template-Modifikationen durch TMS
PortableGaming.de © bk 2000 - 2010

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231