int renderbuffer_drawsprite(struct render_buffer *rb, struct sprite *s) { if ((s->flags & SPRFLAG_INVISIBLE) == 0) { return drawsprite(rb, s, NULL); } return 0; }
int drawsprite(struct render_buffer *rb, struct sprite *s, struct sprite_trans * ts) { struct sprite_trans temp; struct matrix temp_matrix; struct sprite_trans *t = sprite_trans_mul(&s->t, ts, &temp, &temp_matrix); switch (s->type) { case TYPE_PICTURE: return drawquad(rb, s->s.pic, t); case TYPE_POLYGON: return drawpolygon(rb, s->s.poly, t); case TYPE_ANIMATION: { struct pack_animation *ani = s->s.ani; int frame = s->frame % s->total_frame; if (frame < 0) { frame += s->total_frame; } frame += s->start_frame; struct pack_frame * pf = OFFSET_TO_POINTER(struct pack_frame, s->pack, ani->frame); pf = &pf[frame]; int i; for (i=0; i<pf->n; i++) { struct pack_part *pp = OFFSET_TO_POINTER(struct pack_part, s->pack, pf->part); pp = &pp[i]; int index = pp->component_id; struct sprite * child = s->data.children[index]; if (child == NULL || (child->flags & SPRFLAG_INVISIBLE)) { continue; } struct sprite_trans temp2; struct matrix temp_matrix2; struct sprite_trans *ct = sprite_trans_mul2(s->pack, &pp->t, t, &temp2, &temp_matrix2); int r = drawsprite(rb, child, ct); if (r) return r; } return 0; } case TYPE_LABEL: if (s->data.rich_text) { // don't support draw label to renderbuffer return -1; } return 0; case TYPE_ANCHOR: if (s->data.anchor->ps) { return -1; } anchor_update(s, t); return 0; case TYPE_PANNEL: if (s->data.scissor) { return -1; } else { return 0; } } return -1; }
void doframe () { long frameptr, pitch, xdim, ydim; startdirectdraw(&frameptr,&pitch,&xdim,&ydim); voxsetframebuffer(frameptr,pitch,xdim,ydim); setcamera(&ipos,&istr,&ihei,&ifor,xdim*.5,ydim*.5,xdim*.5); opticast(); drawsprite(&desklamp); stopdirectdraw(); nextpage(); readkeyboard(); if (keystatus[1]) quitloop(); }
int main(void) { char dpage=0; unsigned char i=0; unsigned char j=0; comm_ioctl_parms_t commparm = {38400,0}; hires=0; /* Disable JTAG port */ MCUCR |= _BV(JTD); MCUCR |= _BV(JTD); DDRA=0; //all input PORTA=0xff; //pullup xram_init(); //enable external ram dev_comm.ioctl(COMM_IOCTL_INITBAUD, &commparm); // dev_key.ioctl(KEY_IOCTL_INIT, NULL); // // dev_key.ioctl(KEY_IOCTL_INTERRUPT_DISABLE, NULL); /*disable keyboard interrupt */ vga_init(); sei(); //enable interrupts VGA_DISPLAY(0); vga_slow(); SELECT_RAM_BANK(0); clearscreen(0); SELECT_RAM_BANK(1); clearscreen(0); { char x=0; char y=0; char pos[] = {0,0}; char dir=1; char scr=0; char cposr[]={100,100}; char cpos=100; while(1) { VGA_DISPLAY(scr); //show 1 page SELECT_RAM_BANK(scr^1); //draw on other page; //undraw what we drew on this page last time for (x=30+pos[scr^1];x<100+pos[scr^1];x+=12) { for (y=10;y<80;y+=12) { drawchar(x,y, ' ', BLACK, BLACK); } } //undraw player position drawchar(cposr[scr^1], 210, '^', BLACK, TRANSPARENT); //incrment positions pos[scr^1] = pos[scr]+dir; if(pos[scr^1] > 100) dir=-1; if (pos[scr^1] < 1) dir = 1; if(dev_multi_input.kbhit()) { char c = dev_multi_input.getc(); if (c =='a' ) cpos-=5; if (c =='d' ) cpos+=5; } //draw new stuff for (x=30+pos[scr^1];x<100+pos[scr^1];x+=12) { for (y=10;y<80;y+=12) { drawchar(x,y,0xea, YELLOW, TRANSPARENT); drawchar(x,y, '^' , RED, TRANSPARENT); } } //draw player position cposr[scr^1] = cpos; drawchar(cpos, 210, '^', GREEN, TRANSPARENT); scr ^=1; //flip roles } while(1){ drawsprite( x, y, catsprite, 16, 16); drawsprite( x, y+20, catsprite, 16, 16); drawsprite( x, y+40, catsprite, 16, 16); drawsprite( x, y+60, catsprite, 16, 16); drawsprite( x, y+80, catsprite, 16, 16); drawsprite( x, y+100, catsprite, 16, 16); drawsprite( x, y+120, catsprite, 16, 16); drawsprite( x, y+140, catsprite, 16, 16); drawsprite( x, y+160, catsprite, 16, 16); x+=1; if (x==0) y+=1; } } #if 1 { prints(&dev_keyincommout, "pressenter"); dev_keyincommout.getc(); SELECT_RAM_BANK(0); START_FAST_WRITE; for(i=0;i<240;i++) { SELECT_RAM_PAGE(i); for(j=0;j<240;j++) { FAST_WRITE(j,7); } } vga_fast(); prints(&dev_keyincommout, "pressenter2"); dev_keyincommout.getc(); vga_mode(VGA_512); SELECT_RAM_BANK(1); START_FAST_WRITE; for(i=0;i<240;i++) { SELECT_RAM_PAGE(i); for(j=0;j<240;j++) { FAST_WRITE(j,63); FAST_WRITE(j,63); FAST_WRITE(j,63); FAST_WRITE(j,63); FAST_WRITE(j,63); FAST_WRITE(j,63); FAST_WRITE(j,63); } } END_FAST_WRITE; } prints(&dev_keyincommout, "pressenter3"); dev_keyincommout.getc(); prints(&dev_keyincommout, "pressenter3"); dev_keyincommout.getc(); vga_mode(VGA_256); #endif VGA_BEGIN_DRAW; for (i=20;i<200;i++) { j=i>>1; VGA_DOT(i,j,i); } VGA_END_DRAW; vga_slow(); //keyboard/comm test while (1){ /* prints(&dev_comm, "This is a test comm>"); readline(&dev_comm, str, sizeof(str), 1); prints(&dev_comm, "You said "); prints(&dev_comm, str); while (! dev_comm.kbhit()) prints(&dev_comm, "."); */ prints(&dev_keyincommout, "This is a test keyb>"); readline(&dev_keyincommout, str, sizeof(str), 1); prints(&dev_keyincommout, "You said "); prints(&dev_keyincommout, str); while (! dev_keyincommout.kbhit()) prints(&dev_keyincommout, "."); VGA_DISPLAY(dpage); //SELECT_RAM_BANK(dpage); sprintf(str, "dpage:%d", dpage); prints(&dev_comm, str); dpage++; if (dpage==2) dpage=0; } };
/* * Map introduction * * ASM: 1948 * * return: SCREEN_RUNNING, SCREEN_DONE, SCREEN_EXIT */ U8 screen_introMap(void) { //char tutu[50]; //sprintf(tutu,"imap ctrl=%d seq=%d, %d %d ",control_status,seq, 0 , SCREEN_TIMEOUT); //slPrint(tutu,slLocate(3,14)); switch (seq) { case 0: // slPrint("befor sysvid_clear",slLocate(3,15)); sysvid_clear(); // slPrint("after sysvid_clear",slLocate(3,15)); #ifdef GFXPC draw_tilesBank = 1; draw_filter = 0xAAAA; #endif #ifdef GFXST draw_tilesBank = 0; #endif draw_tllst = screen_imaptext[game_map]; draw_setfb(32, 0); draw_tilesSubList(); draw_setfb(32, 96); #ifdef GFXPC draw_filter = 0x5555; #endif draw_tilesList(); game_rects = NULL; #ifdef GFXPC draw_filter = 0xFFFF; #endif // slPrint("befor init ",slLocate(3,15)); init(); // slPrint("after init ",slLocate(3,15)); nextstep(); // slPrint("after nextstep ",slLocate(3,15)); drawcenter(); // slPrint("after drawcenter ",slLocate(3,15)); drawtb(); // slPrint("after drawtb ",slLocate(3,15)); drawlr(); // slPrint("after drawlr ",slLocate(3,15)); drawsprite(); // slPrint("after drawsprite ",slLocate(3,15)); control_last = 0; game_rects = &draw_SCREENRECT; #ifdef ENABLE_SOUND game_setmusic(map_maps[game_map].tune, 1); #endif // slPrint("after game_setmusic ",slLocate(3,15)); seq = 1; break; case 1: /* top and bottom borders */ drawtb(); game_rects = &anim_rect; seq = 2; break; case 2: /* background and sprite */ anim(); drawcenter(); drawsprite(); game_rects = &anim_rect; seq = 3; break; case 3: /* all borders */ drawtb(); drawlr(); game_rects = &anim_rect; seq = 1; break; case 4: /* wait for key release */ if (!(control_status & CONTROL_FIRE)) seq = 5; else { //control_status =0; sys_sleep(50); /* .5s */ } break; } if (control_status & CONTROL_FIRE) { /* end as soon as key pressed */ seq = 4; } if (control_status & CONTROL_EXIT) /* check for exit request */ return SCREEN_EXIT; if (seq == 5) { /* end as soon as key pressed */ sysvid_clear(); seq = 0; return SCREEN_DONE; } else return SCREEN_RUNNING; }