Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
Como dibujar un mapa o terreno Isometrico de forma simple

Bueno, aun habria mucha tela que cortar a este respecto de temas Isometricos pero os muestro lo que hice asi por probar a ver como dibujar un terreno con un sprite isometrico

el sprite es este:



y el codigo es este:
(tened en cuenta que TABLERO es un TImage pero para que dibuje ha de contener primero algun Bitmap (si el TImage no tiene nada fallara al dibujar))

y luego hice 2 funciones una que dibuja el terreno de forma romboide (que personalmente no me gusta mucho) y otro mas ajustado a toda la pantalla de forma rectangular

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;

void DibujarMapaIsometricoConSprite(TImage *mapImage, TImage *spriteImage, int filas, int columnas);
void DibujarMapaIsometricoRectangular(TImage *mapImage, TImage *spriteImage, int filas, int columnas);

int spriteWidth = 128;
int spriteHeight = 128;
int filas = 10;    // Número de filas del mapa
int columnas = 10; // Número de columnas del mapa

inline TPoint PosPt(int x, int y)
{
/* --> */  const int sx = 60, sy = 34; //separación
	return Point((y&1)*sx + x*sx*2, y*sy);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

 DibujarMapaIsometricoRectangular(Form1->TABLERO, Form1->SpriteImage, 10, 10);
}
//---------------------------------------------------------------------------
void DibujarMapaIsometricoConSprite(TImage *mapImage, TImage *spriteImage, int filas, int columnas) {
	// Limpiar el lienzo antes de dibujar
	mapImage->Picture->Bitmap->Canvas->FillRect(mapImage->ClientRect);
	for (int y = 0; y < filas; y++) {
		for (int x = 0; x < columnas; x++) {
			// Convertir coordenadas de la cuadrícula a coordenadas isométricas
			int x_iso = (x - y) * (spriteWidth / 2) + (mapImage->Width / 2);
			int y_iso = (x + y) * (spriteHeight / 2);
			// Dibujar el sprite en las coordenadas calculadas
			mapImage->Canvas->Draw(x_iso, y_iso, spriteImage->Picture->Bitmap);
		}
	}
}

void DibujarMapaIsometricoRectangular(TImage *mapImage, TImage *spriteImage, int filas, int columnas) {
	// Limpiar el lienzo antes de dibujar
	mapImage->Picture->Bitmap->Canvas->FillRect(mapImage->ClientRect);
	// Dimensiones del sprite
	int spriteWidth = spriteImage->Width;
	int spriteHeight = spriteImage->Height;
	for (int y = 0; y < filas; ++y)
		{

		for (int x = 0; x < columnas; ++x)
	   {
			TPoint pos = PosPt(x, y);

			// Dibujar el sprite en las coordenadas calculadas
			mapImage->Canvas->Draw(pos.x, pos.y, spriteImage->Picture->Bitmap);
		}
	}
}
y el resultado es este:

Responder Con Cita
  #2  
Antiguo 04-11-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #3  
Antiguo 04-11-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Interesante.
Gracias.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 04-11-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cuando yo sea mayor me dedicaré a hacer juegos
Responder Con Cita
  #5  
Antiguo 05-11-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
Casimiro ya de "mayor" (jajaja)

Responder Con Cita
  #6  
Antiguo 07-11-2024
CarlosR CarlosR is offline
Miembro
 
Registrado: sep 2015
Posts: 135
Poder: 10
CarlosR Va por buen camino
Algo distinto para variar

Cita:
Empezado por navbuoy Ver Mensaje
Bueno, aun habria mucha tela que cortar a este respecto de temas Isometricos pero os muestro lo que hice asi por probar a ver como dibujar un terreno con un sprite isometrico

el sprite es este:



y el codigo es este:
(tened en cuenta que TABLERO es un TImage pero para que dibuje ha de contener primero algun Bitmap (si el TImage no tiene nada fallara al dibujar))

y luego hice 2 funciones una que dibuja el terreno de forma romboide (que personalmente no me gusta mucho) y otro mas ajustado a toda la pantalla de forma rectangular

Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "acPNG"
#pragma resource "*.dfm"
TForm1 *Form1;

void DibujarMapaIsometricoConSprite(TImage *mapImage, TImage *spriteImage, int filas, int columnas);
void DibujarMapaIsometricoRectangular(TImage *mapImage, TImage *spriteImage, int filas, int columnas);

int spriteWidth = 128;
int spriteHeight = 128;
int filas = 10;    // Número de filas del mapa
int columnas = 10; // Número de columnas del mapa

inline TPoint PosPt(int x, int y)
{
/* --> */  const int sx = 60, sy = 34; //separación
    return Point((y&1)*sx + x*sx*2, y*sy);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

 DibujarMapaIsometricoRectangular(Form1->TABLERO, Form1->SpriteImage, 10, 10);
}
//---------------------------------------------------------------------------
void DibujarMapaIsometricoConSprite(TImage *mapImage, TImage *spriteImage, int filas, int columnas) {
    // Limpiar el lienzo antes de dibujar
    mapImage->Picture->Bitmap->Canvas->FillRect(mapImage->ClientRect);
    for (int y = 0; y < filas; y++) {
        for (int x = 0; x < columnas; x++) {
            // Convertir coordenadas de la cuadrícula a coordenadas isométricas
            int x_iso = (x - y) * (spriteWidth / 2) + (mapImage->Width / 2);
            int y_iso = (x + y) * (spriteHeight / 2);
            // Dibujar el sprite en las coordenadas calculadas
            mapImage->Canvas->Draw(x_iso, y_iso, spriteImage->Picture->Bitmap);
        }
    }
}

void DibujarMapaIsometricoRectangular(TImage *mapImage, TImage *spriteImage, int filas, int columnas) {
    // Limpiar el lienzo antes de dibujar
    mapImage->Picture->Bitmap->Canvas->FillRect(mapImage->ClientRect);
    // Dimensiones del sprite
    int spriteWidth = spriteImage->Width;
    int spriteHeight = spriteImage->Height;
    for (int y = 0; y < filas; ++y)
        {

        for (int x = 0; x < columnas; ++x)
       {
            TPoint pos = PosPt(x, y);

            // Dibujar el sprite en las coordenadas calculadas
            mapImage->Canvas->Draw(pos.x, pos.y, spriteImage->Picture->Bitmap);
        }
    }
}
y el resultado es este:




Muy interesante.

Si le añadieses una coordenada de altura podría parecer un render de autocad en sus comienzos.

Bromas aparte, un buen aporte.
Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Programa simple con MAPA DE ARGENTINA pape19 Varios 7 24-01-2012 17:23:04
Windows pierde terreno Casimiro Notevi La Taberna 10 04-12-2008 07:08:46
Como Pasar Variables de Forma a Forma con delphi.net ASP ASAPLTDA Internet 2 02-07-2007 16:26:41
second life, terreno sin ley gmontes La Taberna 2 16-05-2007 10:49:13
Linux va ganando terreno como SO para internet DarkByte Noticias 1 20-11-2003 18:08:15


La franja horaria es GMT +2. Ahora son las 19:10:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi